Masm32 Code patchen

Tag zusammen!

Das is meine erste Post hier im board ,sonst war ich immer stiller Leser.

Ich wollte mal fragen ob es Möglich ist ein code in einer exe zu patchen (bsp code cave olly) ich habe zwar einen Dll Injector um meine dll zu adden ich wollte es mal mit einen patcher versuchen.

Könnt ihr mir examples posten?, weil ich nicht weis ob es möglich ist oder wie direct sowas auf gebaut sein muss in Masm32

danke in voraus


greets,
ragdog
 
Bsp: (sehr alter Code von mir - die Struct "einstellungen" wird vorher gefüllt, aber das Prinzip sollte klar sein ;))

Code:
.data
teinstellungen struct
	Application db(ANZEIGEN_BUFFER) dup(0)
	Version db(ANZEIGEN_BUFFER) dup(0)
	Filesize db(ANZEIGEN_BUFFER)dup(0)
	website db(ANZEIGEN_BUFFER)dup(0)	
	target db(MAX_PATH) dup(0)
	backup db 0
	;intern
	filesize dd 0	
	patch_size dd 0 ;datei größe nach dem patch
	patchdatasize dd 0 ;größe des Patchblocks
	
teinstellungen ends
.code
....
 invoke CreateFile,addr einstellungen.target,GENERIC_WRITE or GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
	mov hFile,eax
	.if eax==INVALID_HANDLE_VALUE
       invoke MessageBox,hWin,addr MSG_Error_kein_schreibzugriff,addr MSG_Error,MB_ICONERROR
       ret	
	.endif
	
	invoke GetFileSize,hFile,0
	mov ebx,einstellungen.filesize
	.if (eax!=ebx) 
		invoke MessageBox,hWin,addr MSG_Error_falsche_version,addr MSG_Error,MB_ICONERROR
		invoke CloseHandle,hFile
		ret
	.endif
	
	
	
   
    mov eax,einstellungen.patch_size    
    invoke CreateFileMapping,hFile,0,PAGE_READWRITE,0,eax,0
	mov hFileMap,eax
	
	invoke MapViewOfFile,eax,FILE_MAP_WRITE,0,0,0
	mov pFile,eax
		
	;patchvorgang
	mov esi,TARGET_ADRESS
	add esi,eax
	mov edi,SOURCE_ADDRESS
	mov ecx,PATCH_SIZE
	PATCH_LOOP:
		mov al,BYTE ptr [EDI+ECX] ;byte im patcharray
		mov BYTE ptr [ESI+ECX],al ;ziel
		dec ecx
		
	jns PATCH_LOOP
	
	;ende
	
	invoke UnmapViewOfFile,pFile
    invoke CloseHandle,hFileMap
    invoke CloseHandle,hFile
	invoke MessageBox,hWin,addr MSG_Erfolg_meldung,addr MSG_Erfolg,MB_ICONINFORMATION
	invoke PostMessage,hWin,WM_QUIT,0,0
das war ein Beispiel mit Filemapping. Oder:
Code:
invoke CreateFile,addr originname,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
     .if eax!=ERROR_INVALID_HANDLE
     	mov esi,eax
     	invoke SetFilePointer,esi,PATCH_ADRESSE,0,FILE_BEGIN
        invoke WriteFile,esi,addr patch_array,1,addr bytesWritten,0
       ...
        invoke CloseHandle,esi     	
     .endif
 
re:

Danke

Ich werde es damit mal versuchen!!
Die frage ist jetz wenn ich mit olly ein code adde muss ich die section grösse ändern und das macht der source auch?

ps:Könntest du bitte den komplette source posten bitte?
 
RE: re:

Original von ragdog

Die frage ist jetz wenn ich mit olly ein code adde muss ich die section grösse ändern und das macht der source auch?
Nein, das macht der Code nicht, das wäre etwas mehr Aufwand - man kann ja auch mit Olly patchen und dann den Unterschied zwischen den beiden Dateien als Patchdatei nutzen.

Was den Code angeht: da ist nicht viel mehr - Datei öffnen (CreateFile), zu der richtigen Position gehen (SetFilePointer) und schreiben (WriteFile).
Code:
.data
  originname db "hello.patch.exe",0
  PATCH_ADRESSE equ 0123h
  patch_array db 90h,90h,90h
  bytesWritten dd 0
.code
invoke CreateFile,addr originname,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
     .if eax!=ERROR_INVALID_HANDLE
     	mov esi,eax
     	invoke SetFilePointer,esi,PATCH_ADRESSE,0,FILE_BEGIN
        invoke WriteFile,esi,addr patch_array,1,addr bytesWritten,0
       ...
        invoke CloseHandle,esi     	
     .endif
 
re:

hmm naja ok patcher zu coden ist ja nicht das problem!

mir geht es haupsächlich wegen ein code um die section grösse zuändern.
wenn einer soetwas hat wäre ich sehr dankbar

trotzdem danke
 
Vielleicht hilft dir der Quellcode meines Unpackers(C++) für FSG2 weiter. Da ist zwar nichts enthalten um eine Section zu vergrößern, aber dafür ist eine Routine dabei um neue Sections hinzuzufügen, was für deine Zwecke wohl auch funktionieren dürfte:
[Unpacker]UnFSG2
 
Such mal nach einem Unpacker. Hier im Board z.B soll es angeblich mehrere in MASM geben ;). Da wird die letze Section immer erweitert, damit die Imports reingeschreiben werden können.
 
re:

Moin zusammen

Ich habe jetz ein code gefunden der als bsp eine MsgBox addet in einer ziel exe

meine frage ist nun der code arbeitet mit
invoke GetModuleHandle,CTEXT ("KERNEL32") ;get the handle of kernel32.dll
invoke GetProcAddress,eax,CTEXT ("LoadLibraryA") ;get adress from LoadLibraryA
mov LoadLibraryA_Addr,eax ;
...
.
.
das wird geadded in der ziel exe
..
lea eax, szDll[ebp]
push eax
call LoadLibraryA_Addr[ebp] ;load dll

....
.

das probelm ist nun diese ziel exe wird nicht auf jeden windows laufen ,weil
sicherlich die base addressen anders sind von den windows versionen.

da hab ich mir gedacht ich adde noch den code getprocaddress funktion

lea eax, szKernel32[ebp]
push eax
call GetModuleHandle ;<<<<< leider crasht der hier
mov dwKernel,eax

lea eax ,szLoadLibraryA[ebp]
push eax
lea eax ,dwKernel[ebp]
push eax
call GetProcAddress
mov dwProcAddr,eax

lea eax,szDll[ebp]
push eax
call dwProcAddr[ebp]

hab ihr irgend eine idee wie das auf jeden windows laufen würde

MfG
ragdog
 
s probelm ist nun diese ziel exe wird nicht auf jeden windows laufen ,weil
sicherlich die base addressen anders sind von den windows versionen.

da hab ich mir gedacht ich adde noch den code getprocaddress funktion
Ja, allerdings ändert das adden von GetProcAddress auch nicht viel an diesem Problem ;)

Du müsstest also entweder eigene Imports adden oder zumindest eine Suchroutine, die die Kernel32.DLL nach LoadLibraryA und GetProcAddress scannt(wobei da AVs doch was zu meckern haben werden)
Siehe Anhang, seite 16/17
 
re:

danke für das HookInLinePatching beispiel ist sehr interessant.

also ist die memory hook methode immer noch am besten um ein meckern der av´s zuverhindern?
aber wie ist das bei olly wenn man ein code added und die ziel.exe die apis nicht hat,
dann nimmt man doch IID King um die apis hinzufügen
und da meckern die nicht rum (av´s)
 
Das hat erstmal nichts mit Hooking zu tun - in dieser PDF ist nur der Code beigefügt, wie man selber den Kernel nach LaodLibrary und GetProcAddress abscannt. Das ist zwar nützlich für Hooking, kann auch für andere Sachen gebraucht werden ;)
Leider sollte das Scannen für AV sehr verdächtig erscheinen (die "oldschool" Viren (also die "richtigen", nicht in VB oder Delphi zusammengeklickten ;) ) haben auch solche Verfahren genutzt).

IID King erweitert ganz normal die ImportTabelle. Er fügt also keinen Code hinzu, der dann erst zur Laufzeit irgendwas macht.
 
re:

Also ist dann immer noch die beste variante alles per hand bei olly rein zuprügeln oder mit einen memory hook richtig?

ich habe eine Suchroutine, die die Kernel32.DLL nach LoadLibraryA scannt funktioniert auch einwandfrei aber wie du sagtest die av´s :rolleyes:


mFG
 
Zurück
Oben