[C++] Mit DLL Injection Abfolge von Befehlen durchführen. wie?

12/23/2012 18:02 Eerox#1
hallo leute,

ich habe in olly die stelle im code gefunden , die den schaden setzt. diese möchte ich mithilfe einer dll injection callen. es handelt sich um diesen code :

Code:
18E135C6 - 0FB6 D2  - movzx edx,dl
18E135C9 - 0FB6 82 C84B5819  - movzx eax,byte ptr [edx+x2.CxImage::`vftable'+BE84]
18E135D0 - D9 5E 0C  - fstp dword ptr [esi+0C] <<
18E135D3 - 8D 14 09   - lea edx,[ecx+ecx]
18E135D6 - 2B D0  - sub edx,eax
was muss ich tun um diesen abschnitt auszuführen? inline asm? könnte mir jemand ein parade-Beispiel geben wie ich ungefähr vorgehen muss?

MfG, Eerox
12/23/2012 18:21 Jeoni#2
Wenn die Funktion abgeschlossen ist (also praktisch am Ende ein return steht), kannst du sie direkt callen. Du musst aber natürlich schauen, ob die Funktion parameter erwartet, ob sie vielleicht ein ThisCall ist, der im ecx-Register schon ein Objektpointer erwartet.
Entweder du erstellst dir ein Funktionsprototypen, weist ihm eben das offset der Funktion zu und rufst ihn wie eine normale C++-Funktion auf (wobei es beim ThisCall probleme geben könnte), oder du rufst die Funktion mit Inline ASM (Hier: ThisCall mit einem Parameter) auf:
Code:
__asm
{
 push Arg1;
 mov ecx, pObject
 mov eax, 18E135XX // eben die adresse des Funktionsanfangs
 call eax
 add esp, 4 // wenn der caller den stack säubern muss
}
Der Ausschnitt, den du dort zeigst, ist aber keine Funktion, weder Anfang noch Ende ist drauf.

MfG
Jeoni
12/23/2012 18:30 Eerox#3
danke für deinen Post. ja das ist richtig. ich versuche hier keine funktion zu callen , sondern den abschnitt , der die jeweiligen werte verändert. ich denke, ich muss noch ein stück zurücktracen um zu sehen, wann der jump auf die anfangsadresse gesetzt wird.

wenn kein parameter benötigt wird, kann ich also die funktion direkt callen? nun weiss ich wie ich weiter machen muss.


Vielen Dank und guten Abend wünsche ich, Eerox
12/24/2012 10:14 MrSm!th#4
Die CallingConvention ist dann noch wichtig, aber ja, im Prinzip kannst du sie dann einfach so callen.
Den Abschnitt oben einfach zu callen oder dorthin zu jumpen wäre vermutlich fatal, denn er erwartet, dass in den Registern schon bestimmte Werte stehen, die vorher gesetzt wurden.
12/24/2012 12:34 Eerox#5
Quote:
Originally Posted by MrSm!th View Post
Die CallingConvention ist dann noch wichtig, aber ja, im Prinzip kannst du sie dann einfach so callen.
Den Abschnitt oben einfach zu callen oder dorthin zu jumpen wäre vermutlich fatal, denn er erwartet, dass in den Registern schon bestimmte Werte stehen, die vorher gesetzt wurden.
aber wenn ich weiss , welche parameter er benötigt kann ich das doch einfach per MOV eax/esi etc. lösen oder nicht?
12/24/2012 15:47 MrSm!th#6
Du meinst vor dem Jump? Ja, aber wie schon gesagt wurde, es ist wahrscheinlich, dass der Rest der Funktion auch noch wichtige Dinge tut, also solltest du lieber die gesamte Funktion aufrufen und nicht nur zu diesem kleinen Teil springen.