[Source Code] Version.dll Full source code with examples by TonyWeb
NOW FOR SALE!!! Only $50
Once I have the enough likes I will sell the complete set of code. For now I can only post some of the code.
Meanwhile. some titbits for you:
//Test1.exe
void DoPatch1()
{
SuspendMainThread();
#if _WIN64
PatchMemory(PatternFind(szFile1,
“74 12 48 8D 15”, 1),
“\x00”, 1);
#else
//patch the Test1.exe
PatchMemory(PatternFind(szFile1,
“74 22 68”, 1), //Offset 1 means we want to start replacing from
//the beginning of address +1 which in this
//case is the byte 22 hex
“\x00”, 1); //size is 1
#endif
ResumeMainThread();
CloseHandle(hMainThread);
hMainThread = nullptr;
}
As you can see from the log, a search was made for “74 12 48 8d 15” in Test1.exe and the patch was made at that address. Patching this way means that most likely the crack will work in the next version of the software.
Example 2: For example 2 I will use the same Test1 program but another button has been added that calls the IsRegistered() function from an external library named license.dll. What I’m going to show you is how to patch Test2.exe and license.dll at once.
Now copy the version.dll file that is inside the Crack folder to the folder where Test1.exe is like you deed before.
C++:
//Test2.exe
void DoPatch1()
{
//We need to make sure that the Test2.exe has already loaded the library license.dll,
//before proceeding with the patch.
if (!IsModuleLoaded(szFile2.c_str()))
{
MY_LOG(__FUNCTION__ L” :: Waiting for module %ls to be loaded into memory.”, szFile2.c_str());
do
{
Sleep(10);
} while (!IsModuleLoaded(szFile2.c_str()));
MY_LOG(__FUNCTION__ L” :: Module %ls has been loaded into memory.”, szFile2.c_str());
}
else
MY_LOG(__FUNCTION__ L” :: Module %ls is already loaded in memory.”, szFile2.c_str());
SuspendMainThread();
#if _WIN64
PatchMemory(PatternFind(szFile1,
“74 12 48 8D 15”, 1),
“\x00”, 1);
//patch the license.dll
PatchMemory(PatternFind(szFile2,
“32 C0 C3”, 0),
“\xB0\x01”, 2); //mov al,1
#else
//patch the Test2.exe
PatchMemory(PatternFind(szFile1,
“74 23 68”, 1), //Offset 1 means we want to start replacing from
//the beginning of address +1 which in this
//case is the byte 23 hex
“\x00”, 1); //size is 1
//patch the license.dll
PatchMemory(PatternFind(szFile2,
“32 C0 C3 3B 0D”, 0), //Offset 0 means we want to start replacing from
//the beginning of the address where the pattern was found
“\xB0\x01”, 2); //size is 2
#endif
ResumeMainThread();
CloseHandle(hMainThread);
hMainThread = nullptr;
}
I may be devoid of shame but in the end who makes MONEY? It is I.
THAT is what matters. Shame, honor and fresh air all go out through the window in the end and what matters is who is left holding the CASH! 😀
And how much CASH do I hold in my hand? WADS and WADS of cold cash that I get from selling cracked software that I gather from B4A and various other forums. 😀 😀 😀
I made at least 50 accounts when the registration was opened up at B4A recently. Just use MULTILOGIN SOFTWARE to create the accounts. I did the same. Through MULTILOGIN you can create any number of accounts at any forum and the admins like CHALLENGER would just be left scratching their heads like fools in confusion! 😀
What a HUGE fool that Challenger is, thinking that he could prevent duplicate accounts!
Anyone who wants an account at B4A can contact me and pay me $1. I will provide you the login details. Payments by BTC only please!
These days you can see me post some useless stuff on various forums. Now that de! recently got shamed in public for claiming credits for cracking a popular software while in reality it was a GROUP EFFORT by various expert reverse engineers from the TIRA forum, I, tonyweb am just venting out my frustration in a vain attempt to show to the world that I am “not afraid” and that I “still continue to” post content, even though the content I am posting may be worse than utter trash!
Many other forums booted me out in a very shameful way and showed me out their door 🙁
I am only able to fool people like Challenger, Especialista, JonArbuckle and a few others who seem to be rather fascinated by the useless trash that I post in their forums.
If you want to know the details how I ROYALLY put down and screwed PeterPunk (a.k.a PeterPonk) by teaching him how to reverse and crack Java app Shellfire VPN, you can head over the link mentioned below.
By the way, although I blew off my big mouth several times in that thread by posting without thinking and understanding the basics of reversing first, I am happy to say that I was able to screw him well in public 😀
Shellfire VPN is now available for sale (cracked by me) here:
Coming to the Neotys topic. Now, Neotys NeoLoad v7.11 is available for sale. You can pay me $50 by bitcoin and I will make it available to you.
Neotys NeoLoad v7.11
Of course, I stole the technique to crack it from another forum where I pretended to be a Team Member until I could get hold of all their techniques and tools, but who the hell cares?!
Here I am the person making money selling the cracks!
Try the most automated performance testing platform for the Enterprise
No credit card required. Up and running in 5 minutes.
Support what you test: web, mobile, APIs, SAP, Citrix
Integrations with CI servers for Agile and DevOps, APM tools for code-level diagnostics, and functional testing tools for end-user experience metrics
Code-less for faster design of complex tests
As code for tests within automated pipelines
Script maintenance in as little as 1/10 of the original design time
Actionable insights from high-level dashboards and detailed metrics
de! : This is for clicking on LIKES for hate posts. MORE to come. ALL your work will be posted and sold here. JonArbuckle, Especialista and other mods will also pay DEARLY for allowing hate posts in the forum.
Also, remember that TSRh IS COMPROMISED! ALL YOUR DMs are READABLE BY ANYONE!
Yeah, yeah, I know… I could just delete the posts with a swipe of my mighty arm but… It is the bloody job of the admins and mods to avoid the hate posts.
Now let’s see THEIR content being leaked out and sold too.. ONE by ONE… Day by day…
Yeah, yeah, I know… I could just delete the posts with a swipe of my mighty arm but… It is the bloody job of the admins and mods to avoid the hate posts.
Now let’s see THEIR content being leaked out and sold too.. ONE by ONE… Day by day…
include \masm32\include\masm32rt.inc
include \masm32\include\masm32.inc
SIZEOF_NT_SIGNATURE equ sizeof DWORD
SIZEOF_IMAGE_FILE_HEADER equ 14h
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
GetModuleBaseAddress PROTO :DWORD
.data?
hWnd dd ?
hInstance dd ?
windowhandle dd ?
ProcessID dd ?
hProcess dd ?
PEHeader db 1000 dup (?)
Chunks db 65535 dup (?)
BaseAddress dd ?
SectionSize dd ?
SectionEnd dd ?
SectionAdress dd ?
sections_count dd ?
sectionHeaderOffset dd ?
.data
process_4 db "Setup - Zetta",0
patch_title db "Patching...",0
patch_success db "Patched Succesfully",0
error_1 db "Didn't find the target! You sure you started it??",0
error_2 db "Couldn't open process...",0
error_3 db "Couldn't write ...",0
error_4 db "Error reading PE header",0
error_5 db "This EXE has no sections",0
errornobase db "cannot read base address",0
about_title db "About...",0
about_text db "TonyWank and his MicroPenis",13,10
db "Special Thanks to: Sexual Intercourse",0
TextSection db ".text",0
ChunkSize dd 65535
SearchPattern db 083h,0F8h,00Ch,00Fh,084h,0FFh,0FFh,000h,000h,083h,0F8h,00Ah,00Fh,087h,0FFh,0FFh,000h,000h ;Search pattern in hex add "0" to the front of each digit and "h" to the end
SearchMask db 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ;(1=Ignore Byte)
ReplacePattern db 083h,0F8h,00Ch,00Fh,084h,0FFh,0FFh,000h,000h,083h,0F8h,00Ah,090h,0E9h,0FFh,0FFh,000h,000h ;Replace Pattern in hex add "0" to the front of each digit and "h" to the end
ReplaceMask db 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ;(1=Ignore Byte)
.code
; €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
start:
mov hInstance, FUNC(GetModuleHandle,NULL)
call main
invoke ExitProcess,eax
; €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
main proc
Dialog "RCS Zetta Installers Mem Patcher", \
"Courier New",8, \
WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \ ; dialog window style
4, \ ; number of controls
50,50,192,95, \
1024
DlgButton "Patch",WS_TABSTOP,10,60,50,13,IDOK
DlgButton "About...",WS_TABSTOP,70,60,50,13,IDCONTINUE
DlgButton "Exit",WS_TABSTOP,130,60,50,13,IDCANCEL
DlgStatic "This patcher works with ZettaDB2008_x86_Setup_2.0.1.exe, ZettaDB2008_x64_Setup_2.0.1.exe, RCSDatabase_64bit_Setup_2012.1.exe, Zetta_5.20.1.768.exe and probably newer versions too.",SS_CENTER,0,5,180,50,100
CallModalDialog hInstance,0,DlgProc,NULL
ret
main endp
; €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
DlgProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
Switch uMsg
Case WM_INITDIALOG
m2m hWnd, hWin
ret
Case WM_COMMAND
Switch wParam
Case IDOK
mov hInstance,eax
invoke FindWindow,NULL,addr process_4
invoke GetWindowThreadProcessId,eax,addr ProcessID
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,ProcessID
test al,al
jz error2
mov hProcess,eax
Invoke GetModuleBaseAddress, ProcessID
mov BaseAddress, eax
invoke ReadProcessMemory,dword ptr[hProcess], eax, addr PEHeader, 1000, NULL
test al,al
jz error2
;DOS HEADER EXTRACTION
lea edi, PEHeader
assume edi: ptr IMAGE_DOS_HEADER
;Check if the file is a DOS file
cmp [edi].e_magic, IMAGE_DOS_SIGNATURE
jne error4
; DOS Header
mov edx, [edi].e_lfanew
;Check if the file is a PE file
add edi, edx ;address of the PE Header
assume edi: ptr IMAGE_NT_HEADERS
cmp [edi].Signature, IMAGE_NT_SIGNATURE
jne error4
; PE Header
mov edx, [edi].Signature
add edi, SIZEOF_NT_SIGNATURE
assume edi: ptr IMAGE_FILE_HEADER
movzx edx, [edi].NumberOfSections
push edx
pop sections_count
; Optional Header
add edi, SIZEOF_IMAGE_FILE_HEADER
assume edi: ptr IMAGE_OPTIONAL_HEADER
; ImageBase
lea edi, PEHeader
;SECTIONS
add edi, sizeof IMAGE_OPTIONAL_HEADER
assume edi: ptr IMAGE_SECTION_HEADER
mov sectionHeaderOffset, edi
mov ebx, sections_count
cmp ebx, 0
je error5
sections:
sub ebx, 1
push edi
mov esi, edi
lea edi, TextSection
mov ecx, 5 ; selects the of the first string as maximum for comparison
repe cmpsb ; comparison of ECX number of bytes
jne continue_scan
pop edi
mov edx, dword ptr [edi + 8h]
mov SectionSize, edx
mov edx, [edi].VirtualAddress
add edx, BaseAddress ;adds baseaddress + section address
mov ebx, edx
add edx, SectionSize
mov SectionEnd, edx
xor edi, edi
jmp scan
continue_scan:
pop edi
add edi, 28h
jmp sections
scan:
; Use ebx for pointer count, ReadProcessMemory replace eax, ecx and edx
invoke ReadProcessMemory,dword ptr[hProcess], ebx, addr Chunks, ChunkSize, NULL
push 1
sub ChunkSize, sizeof SearchPattern
push ChunkSize
push sizeof SearchPattern
push offset SearchMask
push offset SearchPattern
push offset Chunks
call SearchAndReturn
cmp eax, 1
je patch
cmp ebx, SectionEnd
jnle fin
add ebx, ChunkSize
sub ebx, sizeof SearchPattern
jmp scan
patch:
COMMENT *
Didn't do anything here, just copied code
invoke WriteProcessMemory,dword ptr[hProcess],ecx,addr writebuf_1,1,NULL
mov esi,_replacepattern
mov edx,_replacemask
xor ecx,ecx
.while ecx!=ebx ;ebx=patternsize
@cmp_mask_2:
cmp byte ptr[edx],1
je @ignore
lodsb ;load replacebyte to al from esi & inc esi
stosb ;mov byte ptr[edi],al & inc edi
jmp @nextbyte
@ignore:
inc edi ;targetadress
inc esi ;replacepattern
@nextbyte:
inc edx ;replacemask
inc ecx ;counter
.endw
mov local_returnvalue,1 ;yes, something was patched
*
error1:
invoke MessageBoxA,NULL,addr error_1,NULL,MB_ICONSTOP
jmp fin
error2:
invoke MessageBoxA,NULL,addr error_2,NULL,MB_ICONSTOP
jmp fin
error3:
invoke MessageBoxA,NULL,addr error_3,NULL,MB_ICONSTOP
jmp fin
error4:
invoke MessageBoxA,NULL,addr error_4,NULL,MB_ICONSTOP
jmp fin
error5:
invoke MessageBoxA,NULL,addr error_5,NULL,MB_ICONSTOP
fin:
sub ecx, offset Chunks
add ebx, ecx
invoke MessageBoxA,NULL,hex$(ebx),addr patch_title,MB_ICONINFORMATION
invoke CloseHandle,hProcess
Case IDCONTINUE
invoke MessageBoxA,NULL,addr about_text,addr about_title,NULL
Case IDCANCEL
invoke ExitProcess,1
EndSw
Case WM_CLOSE
invoke ExitProcess,1
EndSw
return 0
DlgProc endp
GetModuleBaseAddress proc iProcID:DWORD
LOCAL hSnap:DWORD
LOCAL xModule:MODULEENTRY32
invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, iProcID
mov hSnap,eax
mov xModule.dwSize, sizeof xModule
invoke Module32First, hSnap, addr xModule
invoke CloseHandle,hSnap
test eax, eax
jnz getaddr
mov eax, 0
ret
getaddr:
mov eax, xModule.modBaseAddr
ret
GetModuleBaseAddress endp
SearchAndReturn proc _targetadress:dword,_searchpattern:dword,_searchmask:dword,_patternsize:dword,_searchsize:dword
LOCAL local_returnvalue :dword ;returns if something was patched
LOCAL local_match :dword ;counts how many matches
pushad
mov local_returnvalue,0
mov local_match,0
mov edi,_targetadress
mov esi,_searchpattern
mov edx,_searchmask
mov ebx,_patternsize
xor ecx,ecx
.while ecx!=_searchsize
@search_again:
;---check if pattern exceed memory---
mov eax,ecx ;ecx=raw offset
add eax,ebx ;raw offset + patternsize
cmp eax,_searchsize
ja @return ;if (raw offset + patternsize) > searchsize then bad!
push ecx ;counter
push esi ;searchpattern
push edi ;targetaddress
push edx ;searchmask
mov ecx,ebx ;ebx=patternsize
@cmp_mask:
test ecx,ecx
je @pattern_found
cmp byte ptr[edx],1 ;searchmask
je @ignore
lodsb ;load searchbyte to al & inc esi
scasb ;cmp al,targetadressbyte & inc edi
jne @skip
inc edx ;searchmask
dec ecx ;patternsize
jmp @cmp_mask
@ignore:
inc edi ;targetadress
inc esi ;searchpattern
inc edx ;searchmask
dec ecx ;patternsize
jmp @cmp_mask
@skip:
pop edx
pop edi ;targetadress
pop esi ;searchpattern
pop ecx
inc edi ;targetadress
inc ecx ;counter
.endw
;---scanned whole memory size---
jmp @return
@pattern_found:
inc local_match
pop edx
pop edi ;targetadress
pop esi
mov local_returnvalue,edi
cmp local_match,eax
je @return
pop ecx ;counter
inc edi ;targetadress
jmp @search_again
;---return---
@return:
popad
mov eax,local_match
mov ecx,local_returnvalue
ret
SearchAndReturn endp
end start