include user32.inc
include kernel32.inc
include psapi.inc
includelib psapi.lib
include advapi32.inc
includelib advapi32.lib
includelib masm32.lib
includelib user32.lib
includelib kernel32.lib
.data
kernel32 db "kernel32.dll",0
crypt_get_hash_param db "CryptGetHashParam",0
Error_starting db "Exe konnte nicht gefunden/gestartet werden!",0
Error_alloc db "Speicher konnte nicht reserviert werden!",0
Error_injection db "Konnte Code nicht injecten!",0
;###########################
Error:
invoke MessageBox,0,eax,0,MB_ICONERROR
;eigentlich müsste noch ein VirtualFreeEx rein, aber da der Prozess
;eher terminiert wird, verzichte ich auf den Aufwand
invoke TerminateProcess,process.hProcess,0
jmp Exit
;##########################
;##### Parst die Export Table und gibt Adresse der Funktion in EAT zurück
getproc:
;erwartet: DLL Base in EAX,in ECX Stringlänge, in ESI string adresse
;rückgabe: Export Adresse in EAX
push ebp
push edi
mov edx,[eax+3ch]
lea edx,dword ptr [eax+edx+78h]
;nun EDX=Exportdirektory VA
mov edx,[edx] ;RVA holen
add edx,eax ;VA zeiger auf ExportDirectory Eintrag
push edx
mov ebp,[edx+18h] ;Anzahl der Namen
mov edx,[edx+20h] ;in EDX: zeiger auf *AdressOfNames
add edx,eax ;Erster Eintrag des AdressOfNames Arrays
cld
search:
mov edi,dword ptr [edx+ebp*4-4]
add edi,eax
push ecx
push esi
repe cmpsb
pop esi
pop ecx
jz found
dec ebp
jnz search
;nicht gefunden:
mov eax,-1
pop ebp
pop ebp ;ebp wiederherstellen+Stackframe
ret
found:
;nun in EBP Funktionsnummer
pop edx ;zeiger auf ExportDirectory Eintrag
push edx
mov edx,dword ptr [edx+24h] ;*AdressOfOrdinals RVA
add edx,eax ;AdressOfOrdinals VA
movzx ecx,word ptr [ebp*2-2+edx]; lese index der Funktion aus der *AdressOfOrdinals
pop edx
mov edx,dword ptr [edx+1ch]
add edx,eax
lea eax,dword ptr [ecx*4+edx] ;VA Adresse in exporttable
;add eax,edx ;+ImageBase=VA
pop edi
pop ebp
ret
end start
make.bat
Code:
SET INCLUDE=C:\masm32\include
SET LIB=C:\masm32\lib
SET PATH=C:\masm32\bin
SET NAME=loader
if exist %NAME%.obj del %NAME%.obj
if exist %NAME%.exe del %NAME%1.exe
ml /c /coff /nologo %NAME%.asm
Link /SUBSYSTEM:WINDOWS /FILEALIGN:512 /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,RWE %NAME%.obj
pause
der Code des Builders wird nicht gepostet, da dieser nur 3 (durchaus wichtige) Aufgaben hatte: NFO anzeigen, Musik abspielen und die eingegebene HWID in den "hwid_user" Byte-Array (Zeile 74) zu schreiben (vorher natürlich Str2Hex Umwandlung durchzuführen). Das kann man eigentlich auch gut per Hand machen. D.h nichts wirklich interessantes ;)
PíxelStealer - im wesentlichen interessant, weil PixelStealer 1.5.5 mit Themida geschützt ist:
.data
filename db "pixel Stealer.exe",0
Error_starting db "'Pixel Stealer.exe' konnte nicht"
db " gefunden/gestartet werden!",0
Error_patch db "Konnte den Code nicht patchen!",0
count dd 0
BUFFER dd 0
;# Format: DWORD: Adresse
;4Bytes: Patch
; HWID "build" Funktion
patch dd 4BA570h
db 0b8h,0a0h,92h,40h
dd 4BA574h
db 00, 0c3h,90h,90h
;protector antis
dd 6B1E9Fh
db 0EBh,53h, 90h, 90h
;erster vbaCmp
dd 4b9ef3h
db 33h, 0ffh, 0f7h,0dfh
;überspringe den HTTP check
dd 4b9519h
db 0e9h,88h,00,00
dd 4b951ch
db 00,00,90h,90h
;überspringe sicherheitshalber den ersten "error" Check
dd 4b95c8h
db 0ebh,06h,90h,90h
;überspringe den zweiten "error" Check
dd 4b9689h
db 0ebh,08h,90h,90h
;dritter Check, muss genoppt werden
dd 4b96edh
db 90h,90h,68h,20h
;weiterer "error" Check:
dd 4b9732h
db 0ebh, 06h,90h,90h
;noch ein "error" Check, langsam wird es lästig
dd 4b9762h
db 74h,04h, 90h,90h
;und den Namen nicht zu vergessen:
dd 42ed6eh
db "Olly"
dd 42ed72h
db "Dbg",0
include user32.inc
include kernel32.inc
include psapi.inc
includelib psapi.lib
include advapi32.inc
includelib advapi32.lib
includelib masm32.lib
includelib user32.lib
includelib kernel32.lib
.data
kernel32 db "kernel32.dll",0
filename db "codesoft.exe",0
lstrcmp_ db "lstrcmpA",0
Error_starting db "Codesoft.exe konnte nicht gefunden/gestartet werden!",0
Error_alloc db "Speicher konnte nicht reserviert werden!",0
Error_protect db "Konnte Kernel32.dll nicht patchen!",0
Error_injection db "Konnte Code nicht injecten!",0
count dd 0
.data?
process PROCESS_INFORMATION <>
procstart STARTUPINFO <>
lstrcmpEAT dd ?
injmem dd ?
newEAT dd ?
.code
;#### eigentliche Injection ####
Injection::
;db 0ebh,0feh
call @f
original_lstrcmp dd 0
@@:
;esp+4 = 2 Parameter auf ESP+12
;heuristik: prüfe ob 2 Parameter aus Exebereich:
mov eax,[esp+12]
cmp eax,400000h
jl @f
cmp eax,500000h
jg @f
;ok, prüfe ob in beiden Parameter mindestens 4 dezimale Zahlen stehen:
mov edx,[eax]
and edx, 0c0c0c0c0h
jnz @f
mov ecx,[esp+8]
mov edx,[ecx]
and edx,0c0c0c0c0h
jnz @f
;suche noch nach einem -
searchloop:
movzx ecx,byte ptr[eax]
inc eax
cmp cl,'-'
je serial
test ecx,ecx
jz @f
jmp searchloop
serial:
;ok, es wird die Serial geprüft: 0 zurückgeben
pop eax
xor eax,eax
ret 8
;sonst: irgendwas anderes - rufe original auf
@@:
pop eax
jmp dword ptr[eax]
Injection_end::
;##### Parst die Export Table und gibt Adresse der Funktion in EAT zurück
getproc:
;erwartet: DLL Base in EAX,in ECX Stringlänge, in ESI string adresse
;rückgabe: Export Adresse in EAX
push ebp
push edi
mov edx,[eax+3ch]
lea edx,dword ptr [eax+edx+78h]
;nun EDX=Exportdirektory VA
mov edx,[edx] ;RVA holen
add edx,eax ;VA zeiger auf ExportDirectory Eintrag
push edx
mov ebp,[edx+18h] ;Anzahl der Namen
mov edx,[edx+20h] ;in EDX: zeiger auf *AdressOfNames
add edx,eax ;Erster Eintrag des AdressOfNames Arrays
cld
search:
mov edi,dword ptr [edx+ebp*4-4]
add edi,eax
push ecx
push esi
repe cmpsb
pop esi
pop ecx
jz found
dec ebp
jnz search
;nicht gefunden:
mov eax,-1
pop ebp
pop ebp ;ebp wiederherstellen+Stackframe
ret
found:
;nun in EBP Funktionsnummer
pop edx ;zeiger auf ExportDirectory Eintrag
push edx
mov edx,dword ptr [edx+24h] ;*AdressOfOrdinals RVA
add edx,eax ;AdressOfOrdinals VA
movzx ecx,word ptr [ebp*2-2+edx]; lese index der Funktion aus der *AdressOfOrdinals
pop edx
mov edx,dword ptr [edx+1ch]
add edx,eax
lea eax,dword ptr [ecx*4+edx] ;VA Adresse in exporttable
;add eax,edx ;+ImageBase=VA
pop edi
pop ebp
ret