Api entschlüsseln

Hi Leute :D,
Ich bin fast damit fertig, einige Programmfunktionen in ASM
zu übersetzen um sie in anderen Programmen einzusetzen.

Leider bin ich auf einen hartnäckigen Fall gestoßen der seine
API obfuscated/verschlüsselt hat
C++:
Code:
	if (lRet != ERROR_SUCCESS)
	{
		return 0;
	}
	else
	{
		ofstream file("C://stext.txt", NULL);
	}
	return 1;

Code:
0040109D   > \6A 01         PUSH 1
0040109F   .  6A 40         PUSH 40
004010A1   .  6A 00         PUSH 0
004010A3   .  68 4C364000   PUSH steam-ch.0040364C                                                                             ;  ASCII "C://stext.txt"
004010A8   .  8D8D 60FFFFFF LEA ECX,DWORD PTR SS:[EBP-A0]
004010AE   .  FF15 80524000 CALL DWORD PTR DS:[<&MSVCP80D.??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z>]       ;  MSVCP80D.??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z
004010B4   .  8D8D 60FFFFFF LEA ECX,DWORD PTR SS:[EBP-A0]
004010BA   .  FF15 7C524000 CALL DWORD PTR DS:[<&MSVCP80D.??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ>]           ;  MSVCP80D.??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ
004010C0   >  B8 01000000   MOV EAX,1
004010C5   >  8BE5          MOV ESP,EBP
004010C7   .  5D            POP EBP
004010C8   .  C3            RETN

Nun weiss ich nicht welche API ich aufrufen muss,
sie ist auf jedenfall in der MSVCP80D, aber der Name ist verschlüsselt,
ich möchte es umschreiben als z.B.
Code:
Call ostream
, Olly
biegt mir dann den Jump auf die richtige Adresse um.
Den Umweg über die IAT nehme ich später... (vielen Dank nochmal an CDW für die Erklärung)

Die Frage:
Wie entschlüssele ich das, damit ich es in Olly nehmen kann, und die API identifizieren kann?

Grüße
 
Sie ist nicht verschlüsselt - das was Du siehst, hat Olly "selbst" reingeschrieben. Und zwar handelt es sich um Exportnamen der DLL. Schau sie (die DLL) Dir einfach im LordPE an (Directories->ExportTable).Da sind lauter solcher Bezeichnungen. Das ist der Werk des Linkers (afaik hat diese Benennung schon eine Bedeutung und man kann hier irgendwas Genaues über die Argumente und deren Eigenschaften ablesen). Ist auch nicht dazu gedacht, dass der Programmierer diese Funktionen "direkt" aufruft ;)

Code:
 FF15 80524000 CALL DWORD PTR DS:[<&MSVCP80D.??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z>]
hier steht ja eigentlich "call dword ptr [405280]" (zur Überpfürung: einfach versuchen die Codezeile in Olly zu editieren).
Die Adresse [405280] ist höchstwahrscheinlich ein IAT Eintrag. Olly schaut also nach, wohin der DWORD in 405280 verweist und löst den Verweis auf den DLL Export automatisch auf - setzt also den Namen rein (Olly hat nicht umsonst die Disassemblerfähigkeiten). Wenn es nur um Ollyanzeige geht: ein Enter auf den Call (so dass man im Ziel landet) und per Rechtsklick->"Label" auswählen. Jetzt kann man einen eigenen Namen vergeben. Lässt Du den Code per STRG+A neu analysieren, sollte "call programm.neuername" in Olly zu sehen sein.
Um es selber zu benutzen: am einfachsten wäre es, diese Funktion per OrdinalValue zu importieren, dazu öffnet man die DLL im LordPE und schaut unter Exports nach:
Code:
E2               ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UAE@XZ
neben dem String steht der OrdinalValue (mein Beispiel ist aus der msvcp6)
LoadLibrary(DLL)
GetProcAddres(0E2h).
würde dann die Adresse der Funktion liefern.
 
Original von CDW
Sie ist nicht verschlüsselt - das was Du siehst, hat Olly "selbst" reingeschrieben. Und zwar handelt es sich um Exportnamen der DLL. Schau sie (die DLL) Dir einfach im LordPE an (Directories->ExportTable).Da sind lauter solcher Bezeichnungen. Das ist der Werk des Linkers (afaik hat diese Benennung schon eine Bedeutung und man kann hier irgendwas Genaues über die Argumente und deren Eigenschaften ablesen). Ist auch nicht dazu gedacht, dass der Programmierer diese Funktionen "direkt" aufruft ;)

Code:
 FF15 80524000 CALL DWORD PTR DS:[<&MSVCP80D.??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z>]
hier steht ja eigentlich "call dword ptr [405280]" (zur Überpfürung: einfach versuchen die Codezeile in Olly zu editieren).
Die Adresse [405280] ist höchstwahrscheinlich ein IAT Eintrag. Olly schaut also nach, wohin der DWORD in 405280 verweist und löst den Verweis auf den DLL Export automatisch auf - setzt also den Namen rein (Olly hat nicht umsonst die Disassemblerfähigkeiten). Wenn es nur um Ollyanzeige geht: ein Enter auf den Call (so dass man im Ziel landet) und per Rechtsklick->"Label" auswählen. Jetzt kann man einen eigenen Namen vergeben. Lässt Du den Code per STRG+A neu analysieren, sollte "call programm.neuername" in Olly zu sehen sein.
Um es selber zu benutzen: am einfachsten wäre es, diese Funktion per OrdinalValue zu importieren, dazu öffnet man die DLL im LordPE und schaut unter Exports nach:
Code:
E2               ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UAE@XZ
neben dem String steht der OrdinalValue (mein Beispiel ist aus der msvcp6)
LoadLibrary(DLL)
GetProcAddres(0E2h).
würde dann die Adresse der Funktion liefern.
Hmm danke schonmal,
aber wie mache ich das mit dem LoadLibary und GetProcAdress in ASM?
Was sind das für APIs?
Muss ich die DLL als string übergeben !?
 
erstmal: was genau willst Du denn überhaupt machen?
Was sind das für APIs?
diese sind in der Kernel32 DLL angesiedelt und werden häufig benutzt, um DLL-Funktionen zu laden - siehe einfachere Packer wie MEW,UPX usw.
Wenn Du sie in ASM nutzen willst - es hängt stark vom verwendetem Assembler ab, normalwerweise gibt es eine Include/lib datei, in der diese (und viele Funktionen mehr) schon deklariert sind und man sie benutzen kann - in MASM z.B
Code:
incude windows.inc
include kernel32.inc
includelib kernel32.dll

...
.data
library db "irgendeinedll",0
funktionsname db "funktionsname",0
.code
invoke LoadLibrary,offset library     ;in EAX kommt das Handle zur DLL zurück, die DLL wird gleichzeitig in den Speicher geladen (falls sie nocht schon vorhanden ist)
invoke GetProcAddress,eax,123 ;<- Ordinalnummer oder wenn man per String die Funktion importieren mag
invoke GetProcAddress,eax,offset funktionsname
 
Original von CDW
erstmal: was genau willst Du denn überhaupt machen?
Was sind das für APIs?
diese sind in der Kernel32 DLL angesiedelt und werden häufig benutzt, um DLL-Funktionen zu laden - siehe einfachere Packer wie MEW,UPX usw.
Wenn Du sie in ASM nutzen willst - es hängt stark vom verwendetem Assembler ab, normalwerweise gibt es eine Include/lib datei, in der diese (und viele Funktionen mehr) schon deklariert sind und man sie benutzen kann - in MASM z.B
Code:
incude windows.inc
include kernel32.inc
includelib kernel32.dll

...
.data
library db "irgendeinedll",0
funktionsname db "funktionsname",0
.code
invoke LoadLibrary,offset library     ;in EAX kommt das Handle zur DLL zurück, die DLL wird gleichzeitig in den Speicher geladen (falls sie nocht schon vorhanden ist)
invoke GetProcAddress,eax,123 ;<- Ordinalnummer oder wenn man per String die Funktion importieren mag
invoke GetProcAddress,eax,offset funktionsname
zurzeit verwende ich als assembler olly...
Ich möchte ja die Funktionen nachher in ein fremdes Programm einfügen,
das meinte ich damit :)

das ist dann ja noch nen level "tiefer" als MASM
 
Ich möchte ja die Funktionen nachher in ein fremdes Programm einfügen,
dann gibts zwei Wege: per IID King/LordPE/Hexeditor direkt diese Funktion zum Programm hinzufügen (zur ImportTable) oder per IID King /LordPE/Hexeditor dafür sorgen, dass LoadLibrary/GetProcAddress im Programm sind. (LordPE: unter Directories->Imports->Rechtsklick).
Und dann eben der Code-Injection gefummel - am besten eine neue Section hinzufügen, die nötigen Strings reinscheriben und den Code reintippen ;)
benutze aber immer den IAT-Umweg. Wenn Du nämlich in Olly "call offstream" oder ähnliches schreibst, dann macht Olly da eine Direktadresse hin - es führt dann dazu, dass es dann nicht auf anderen Systemen läuft.
 
Original von CDW
Ich möchte ja die Funktionen nachher in ein fremdes Programm einfügen,
dann gibts zwei Wege: per IID King/LordPE/Hexeditor direkt diese Funktion zum Programm hinzufügen (zur ImportTable) oder per IID King /LordPE/Hexeditor dafür sorgen, dass LoadLibrary/GetProcAddress im Programm sind. (LordPE: unter Directories->Imports->Rechtsklick).
Und dann eben der Code-Injection gefummel - am besten eine neue Section hinzufügen, die nötigen Strings reinscheriben und den Code reintippen ;)
benutze aber immer den IAT-Umweg. Wenn Du nämlich in Olly "call offstream" oder ähnliches schreibst, dann macht Olly da eine Direktadresse hin - es führt dann dazu, dass es dann nicht auf anderen Systemen läuft.
Ok vielen Dank bin nah dran :-)
Leider kann ich den gecrypteten Call nicht mit LordPE in die IAT einfügen, weil er sacht, dass der Name ungültig ist. Und IID King crasht dabei sowieso.
 
Naja, dann eben per LoadLibrary und GetProcAddress (Notfalls diese über IIDKing oder LordPE hinzufügen) importieren. Aber: wozu sich überhaupt mit der msvcp.dll abzugeben? Der User müsste diese nämlich auch haben und letzendlich geht alles genauso in WinAPI: CreateFile und WriteFile/ReadFile.

Naja, das ganze ist ganz normales Codeinjecting - umständlich aber machbar.Eventuell sollte man nur kleiner anfangen und ein bisschen Erfahrung darin sammeln.

Allerdings habe ich ehrlich gesagt gar keine Lust, dir bei deinem Projekt zu helfen. Halte weder von Trojas noch vom "Steamaccountabziehen" etwas :rolleyes:
http://www.underground.ag/showthread.php?t=21062
Also: TESTER FÜR STEAM-FINDER in Bifrost-Server gesucht
(Textdatei stext.txt wird auf Laufwerk C erstellt wenn Steam installiert ist!)
 
Naja habs auch so geschafft danke trozdem,
ich habe ja weniger selber Interesse an der Sache,
deshalb frage ich ja andere danach was sie suchen,
es ist ja nur zu lernzwecken ;)
 
Nur mal nebenbei: Wenn du so viel Code in eine fremde Datei einfügen willst, solltest du den Code in eine Dll packen und dann nur den Code zum laden/aufrufen der Dll einpatchen, dass erspart dir eine Menge Arbeit.
Das "Projekt" selbst finde ich dumm, da du damit lediglich Skript-Kiddies hilfst(schon allein das Forum auf dem du da postest). Dieses Kiddie-Forum ist u.a. der Grund, warum der Begriff "Hacker" in der Öffentlichkeit so in ein falsches Licht gerückt wird. Es gibt genug sinnvollere Anwendungsmöglichkeiten für solche Dinge allerdings nicht auf einer solchen "virtuellen Müllkippe" wie dieses verachtenswerte Forum, zu dem CDW einen Link postete.
 
Original von Lesco
Nur mal nebenbei: Wenn du so viel Code in eine fremde Datei einfügen willst, solltest du den Code in eine Dll packen und dann nur den Code zum laden/aufrufen der Dll einpatchen, dass erspart dir eine Menge Arbeit.
Das "Projekt" selbst finde ich dumm, da du damit lediglich Skript-Kiddies hilfst(schon allein das Forum auf dem du da postest). Dieses Kiddie-Forum ist u.a. der Grund, warum der Begriff "Hacker" in der Öffentlichkeit so in ein falsches Licht gerückt wird. Es gibt genug sinnvollere Anwendungsmöglichkeiten für solche Dinge allerdings nicht auf einer solchen "virtuellen Müllkippe" wie dieses verachtenswerte Forum, zu dem CDW einen Link postete.
Wenn du ne Community kennst, wo solche Sachen gebraucht werden kannst du mir ja mal ne PN schreiben. Es hat sich dort eben angeboten weil besonders in diesem Bereich und gerade weil es Script-Kiddies sind noch viele Programm-Modifikationen gebraucht werden, und ich so viel ausprobieren kann.
Hab ja bis jetzt viel gelernt davon, ich lerne am besten "by doing" weil dann sitzt es eben richtig.
 
Zurück
Oben