PHP Forum - Coding Board
Juni 21, 2018, 11:39:54 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: GetProcAddress Ersatz + suchen der Kernel32 Baseadresse  (Gelesen 177 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
EBFE
Full Member
***
Beiträge: 109


Profil anzeigen E-Mail
« am: März 13, 2009, 10:02:53 »

code]
pop eax ;Auf dem Stack ist Return to Kernel32 - kann man nutzen ;)
 push eax
 and eax,0FFFFF000h ;die ersten Bits löschen (Eregebnis: vielfaches von 4)
 std
 mov edi,eax
 mov eax,00905a4dh ;M Z 90 00
 mov ecx,01000000h ;sollte reichen
 repne scasd ;nach MZ 90 00 scannen - alse Kernel32 Basisadresse
 lea eax,[edi+4]
 cld

 ;nun ist in EAX die Kernel32 Base[/code]OllyDbg Bytecode zum C&P
[code]58 50 25 00 F0 FF FF FD 8B F8 B8 4D 5A 90 00 B9 00 00 00 01 F2 AF 8D 47 04 FC
[/code]und hier GetProcErsatz. Prinzip: joa, das übliche Parsen des PE Headers. Am verständlichsten ist es wohl, wenn man sich dazu eine PE-Dokumentaion/Referenz anschaut (wie man zu ExportEntries kommt und wie diese aufgebaut sind).
Parameterübergabe: EAX==DLL Basisadresse
ESI == API String und in ECX die String länge.
Rückgabe: in EAX die Funktionsadresse oder im Fehlerfall eine -1(==0FFFFFFFF)
Code:
version2:
;erwartet: DLL Base in EAX,in ECX Stringlänge, in ESI string adresse
;rückgabe: Adresse in EAX oder -1
push ebp

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
mov edx,dword ptr [edx+1Ch] ;*AdressOfFuntions RVA
add edx,eax ;AdressOfFunctions VA
mov edx,[ebp*4-4+edx]; lese Adresse der Funktion aus der *AdressOfFuntions
add eax,edx

pop ebp
ret
OllyDbg Bytes zum C&P
Code:
55 8B 50 3C 8D 54 02 78 8B 12 03 D0 52 8B 6A 18 8B 52 20 03 D0 FC 8B 7C AA FC 03 F8 51 56 F3 A6
5E 59 74 09 4D 75 EF B8 FF FF FF FF C3 5A 8B 52 1C 03 D0 8B 54 AA FC 03 C2 5D C3
Im Anhang eine Testanwendung die beide Codes nutzt (zeigt eine "Hello" Nachricht - die Anwendung hat allerdings keinen einzigen Importeintrag, was man unschwer in LordPE prüfen kann). Läuft unter XP,Vista. Läuft nicht unter win2k (da will der PE Loader mindestens ein Importeintrag haben, sofern ich mich erinnere). Source ist auch beigelegt.

PS: bei "richtig_klein.exe" handelt es sich um eine Spielerei (ich konnte es nicht lassen und hab manuell aus der bestehenden Exe was zusammengeschustert, so dass die Exe nur 512Bytes belegt und trotzdem noch die Nachricht ausgibt)
Code:
pop eax ;Auf dem Stack ist Return to Kernel32 - kann man nutzen Zwinkernd
 push eax
 and eax,0FFFFF000h ;die ersten Bits löschen (Eregebnis: vielfaches von 4)
 std
 mov edi,eax
 mov eax,00905a4dh ;M Z 90 00
 mov ecx,01000000h ;sollte reichen
 repne scasd ;nach MZ 90 00 scannen - alse Kernel32 Basisadresse
 lea eax,[edi+4]
 cld

 ;nun ist in EAX die Kernel32 Base
OllyDbg Bytecode zum C&P
Code:
58 50 25 00 F0 FF FF FD 8B F8 B8 4D 5A 90 00 B9 00 00 00 01 F2 AF 8D 47 04 FC
und hier GetProcErsatz. Prinzip: joa, das übliche Parsen des PE Headers. Am verständlichsten ist es wohl, wenn man sich dazu eine PE-Dokumentaion/Referenz anschaut (wie man zu ExportEntries kommt und wie diese aufgebaut sind).
Parameterübergabe: EAX==DLL Basisadresse
ESI == API String und in ECX die String länge.
Rückgabe: in EAX die Funktionsadresse oder im Fehlerfall eine -1(==0FFFFFFFF)
Code:
version2:
;erwartet: DLL Base in EAX,in ECX Stringlänge, in ESI string adresse
;rückgabe: Adresse in EAX oder -1
push ebp

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
mov edx,dword ptr [edx+1Ch] ;*AdressOfFuntions RVA
add edx,eax ;AdressOfFunctions VA
mov edx,[ebp*4-4+edx]; lese Adresse der Funktion aus der *AdressOfFuntions
add eax,edx

pop ebp
ret
OllyDbg Bytes zum C&P
Code:
55 8B 50 3C 8D 54 02 78 8B 12 03 D0 52 8B 6A 18 8B 52 20 03 D0 FC 8B 7C AA FC 03 F8 51 56 F3 A6
5E 59 74 09 4D 75 EF B8 FF FF FF FF C3 5A 8B 52 1C 03 D0 8B 54 AA FC 03 C2 5D C3
Im Anhang eine Testanwendung die beide Codes nutzt (zeigt eine "Hello" Nachricht - die Anwendung hat allerdings keinen einzigen Importeintrag, was man unschwer in LordPE prüfen kann). Läuft unter XP,Vista. Läuft nicht unter win2k (da will der PE Loader mindestens ein Importeintrag haben, sofern ich mich erinnere). Source ist auch beigelegt.

PS: bei "richtig_klein.exe" handelt es sich um eine Spielerei (ich konnte es nicht lassen und hab manuell aus der bestehenden Exe was zusammengeschustert, so dass die Exe nur 512Bytes belegt und trotzdem noch die Nachricht ausgibt).
« Letzte Änderung: März 13, 2009, 11:49:07 von EBFE » Gespeichert

PM an mich? Bitte vorher lesen: EBFEs PM FAQ
Zacherl
Entwickler Team
Moderator
Sr. Member
****
Beiträge: 454



Profil anzeigen E-Mail
« Antworten #1 am: März 13, 2009, 11:34:40 »

Sieht gut aus, aber unter 64 Bit kackt das Programm ab (alle Versionen) Lächelnd Ich werds mal Debuggen.
 
Edit: Okay der Fehler ist schon direkt am Anfang.
Code:
CPU Disasm
Address   Hex dump          Command                                  Comments
00401033  |.  FD            STD
00401034  |.  8BF8          MOV EDI,EAX
00401036  |.  B8 4D5A9000   MOV EAX,905A4D
0040103B  |.  B9 00000001   MOV ECX,1000000
00401040  |.  F2:AF         REPNE SCAS DWORD PTR ES:[EDI] [color=red]Hier gibts ne AV[/color]
00401042  |.  8D47 04       LEA EAX,[EDI+4]
00401045  |.  FC            CLD
00401046  |.  B9 0D000000   MOV ECX,0D
0040104B  |.  BE 14104000   MOV ESI,test.00401014                    ; ASCII "LoadLibraryA"
Gespeichert

EBFE
Full Member
***
Beiträge: 109


Profil anzeigen E-Mail
« Antworten #2 am: März 14, 2009, 12:11:10 »

Schade, hab leider kein 64 Bit Vista zum Testen. Wie sieht denn der Header im 64 Bitter aus? Ich meine den MZ 90 00 Part. Eventuell wird auch nicht mehr die Rücksprungadresse auf dem Stack abgelegt.

läuft denn der GetProcAddress Part (einfach den Code bis "401045: CLD" überspringen und in EAX manuell die Kernel32 Basis eingtragen) ?

PS: habe den oben Code etwas korrigiert. Jetzt wird im Fehlerfall der Stackframe wiederhergestellt und wirklich -1 zurückgeliefert.
Code:
mov eax,-1
  pop ebp
  pop ebp ;ebp wiederherstellen+Stackframe
Anhang updated.
Gespeichert

PM an mich? Bitte vorher lesen: EBFEs PM FAQ
Zacherl
Entwickler Team
Moderator
Sr. Member
****
Beiträge: 454



Profil anzeigen E-Mail
« Antworten #3 am: März 14, 2009, 01:51:53 »

Ja, wenn ich den Code bis CLD überspringe und die Kernel32 ImageBase in EAX editiere, läuft das Programm. Allerdings wird die Caption der MessageBox noch nicht richtig gesetzt:

Zitat
---------------------------
Fehler
---------------------------
Hello
---------------------------
OK  
---------------------------


Ahso sehe grade du übergibst einfach 0 naja, dann ists klar Zunge
Gespeichert

Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS