Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 08:29

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



ida pro funktion

Discussion on ida pro funktion within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
ida pro funktion

hey, hier gibts leider keine asm section daher poste ich das mal hierhin
unzwar wollte ich eine funktion hooken, welche mir in ida mit folgenden übergabeparametern angezigt wird __stdcall sub(float, int, int, char, int, int, int), der hook ist getan(ist nicht das erstemal das ich eine function hooke,also habe den schon richtig gemacht ^^ ), aber ich vermute das die parameter nicht ganz stimmen(sofern das möglich ist), sobald ich irgendwas in meinen hook reinschreibe, sogar bei einem einfach printf("hallo") crasht mein game... also ist es möglich das ida pro mir da ein funtktion zeigt, die nicht der wahrheit entspricht?^^
Slade100 is offline  
Old 06/11/2015, 14:52   #2
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Das liegt daran das ihr euch glaube nicht alle sicher seit was ihr da tut. Ein midfunction hook heißt das ihr in der Runtime des Programms seit sprich ihr dürft nicht denken das es euer Programm ist. Du must hutsam mit dem Stack umgehen da er dir ansonsten wegcrasht.In den midfunction hook sollte man auch sonst asm x86 fortführen, womit sich auch eig. so gut wie alles machen läst und wenn du wirklich vc++/c++ weiter nutzen möchtest musste die flags und den stack speichern und am ende des hooks wieder restoren.
Terrat is offline  
Thanks
1 User
Old 06/11/2015, 14:59   #3
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Ich glaube nicht dass er von einem Midfunction-Hook spricht, sondern eher von einem normalen, am Anfang der Funktion.

Er hat schon recht, es kann sein dass IDA die falsche Funktionssignatur anzeigt, allerdings ist das nur der Fall wenn der Hook auch crasht wenn du in der Funktion nichts machst, außer zu returnen.
Kannst du mal deinen Code zeigen? Dann lässt sich einfacher helfen

Padmak
Padmak is offline  
Thanks
2 Users
Old 06/11/2015, 15:04   #4
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by Padmak View Post
Ich glaube nicht dass er von einem Midfunction-Hook spricht, sondern eher von einem normalen, am Anfang der Funktion.

Er hat schon recht, es kann sein dass IDA die falsche Funktionssignatur anzeigt, allerdings ist das nur der Fall wenn der Hook auch crasht wenn du in der Funktion nichts machst, außer zu returnen.
Kannst du mal deinen Code zeigen? Dann lässt sich einfacher helfen

Padmak
Kein Programm ist perfekt außer der Windows Movie Maker ° _°
Terrat is offline  
Old 06/11/2015, 22:28   #5
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Originally Posted by Terrat View Post
Kein Programm ist perfekt außer der Windows Movie Maker ° _°
danke schonmal für die antworten. hier die meine funktion
Code:
DWORD func_add = 0x006439E0;
DWORD func_back = func_add + 0x06;
int(__stdcall *OnMapClick)(float, int, int, char, int, int, int);
int __declspec(naked) myfunction(float floatA, int intA, int intB, char charA, int intC,int intD, int intE){

	__asm
	{
		push    ebp // func_add, wenn der hook noch nicht gesetzt ist
		mov     ebp, esp
		sub     esp, 48h
	}
	printf("hey");//das hier alleine verursacht schon den crash :S
	


	__asm {jmp func_back}
}
also in der main schreibe ich an der func_add ein jmp zu meiner function, dann kommt der asm teil der aus der funktion rausgeschrieben ist und dann kommen meine funktionen und dann der jmp back.
die funktion hat aufjedenfall etwas mit dem clicken in einem game zutun, die wird immer aufgerufen wenn ich iwo hinclicke um hinzulaufen.

crashen tut es nur wenn ich nicht auf den boden clicke, also wenn ich auf ein anderen player/npc/monster klicke dann crasht es :S wenn ich auf normalen boden clicke um hinzulaufen, dann läufts perfekt, echt komig

hier der ida auszug
was ich hier komig fand, war das die funktion 7 args oben hat, aber unten im stack iwie nur 6 sind, aber ich bin gerade noch in der anfangsphase bei asm, daher versteh ich solche funktionen auch leider immer nur bis zu einem gewissen teil, :S
Code:
text:006439E0 ; int __stdcall sub_6439E0(float, int, int, char, int, int, int)
.text:006439E0 sub_6439E0      proc near               ; CODE XREF: sub_5DFCB0+4Bp
.text:006439E0                                         ; sub_5DFCB0+2D4p ...
.text:006439E0
.text:006439E0 var_48          = dword ptr -48h
.text:006439E0 var_41          = byte ptr -41h
.text:006439E0 var_40          = dword ptr -40h
.text:006439E0 var_3C          = dword ptr -3Ch
.text:006439E0 var_38          = byte ptr -38h
.text:006439E0 var_34          = dword ptr -34h
.text:006439E0 var_2D          = byte ptr -2Dh
.text:006439E0 var_2C          = dword ptr -2Ch
.text:006439E0 var_28          = dword ptr -28h
.text:006439E0 var_24          = dword ptr -24h
.text:006439E0 arg_0           = dword ptr  8
.text:006439E0 arg_4           = dword ptr  0Ch
.text:006439E0 arg_8           = dword ptr  10h
.text:006439E0 arg_C           = byte ptr  14h
.text:006439E0 arg_10          = dword ptr  18h
.text:006439E0 arg_14          = dword ptr  1Ch
.text:006439E0
.text:006439E0                 push    ebp
.text:006439E1                 mov     ebp, esp
.text:006439E3                 sub     esp, 48h
.text:006439E6                 mov     [ebp+var_24], ecx
.text:006439E9                 mov     eax, [ebp+arg_4]
.text:006439EC                 mov     [ebp+var_28], eax
.text:006439EF                 mov     ecx, [ebp+var_28]
.text:006439F2                 inc     ecx
.text:006439F3                 mov     [ebp+var_2C], ecx
.text:006439F6
.text:006439F6 loc_6439F6:                             ; CODE XREF: sub_6439E0+25j
.text:006439F6                 mov     edx, [ebp+var_28]
.text:006439F9                 mov     al, [edx]
.text:006439FB                 mov     [ebp+var_2D], al
.text:006439FE                 inc     [ebp+var_28]
.text:00643A01                 cmp     [ebp+var_2D], 0
.text:00643A05                 jnz     short loc_6439F6
.text:00643A07                 mov     ecx, [ebp+var_28]
.text:00643A0A                 sub     ecx, [ebp+var_2C]
.text:00643A0D                 mov     [ebp+var_34], ecx
.text:00643A10                 jnz     short loc_643A17
.text:00643A12                 jmp     loc_643C0C
.text:00643A17 ; ---------------------------------------------------------------------------
.text:00643A17
.text:00643A17 loc_643A17:                             ; CODE XREF: sub_6439E0+30j
.text:00643A17                 mov     edx, [ebp+var_24]
.text:00643A1A                 movzx   eax, byte ptr [edx+0C0h]
.text:00643A21                 cmp     eax, 0FFh
.text:00643A26                 jnz     short loc_643A51
.text:00643A28                 movzx   ecx, [ebp+arg_C]
.text:00643A2C                 cmp     ecx, 0FFh
.text:00643A32                 jnz     short loc_643A51
.text:00643A34                 mov     edx, [ebp+var_24]
.text:00643A37                 mov     eax, [ebp+arg_10]
.text:00643A3A                 mov     [edx+0BCh], eax
.text:00643A40                 mov     ecx, [ebp+var_24]
.text:00643A43                 mov     dl, [ebp+arg_C]
.text:00643A46                 mov     [ecx+0C0h], dl
.text:00643A4C                 jmp     loc_643C0C
.text:00643A51 ; ---------------------------------------------------------------------------
.text:00643A51
.text:00643A51 loc_643A51:                             ; CODE XREF: sub_6439E0+46j
.text:00643A51                                         ; sub_6439E0+52j
.text:00643A51                 mov     eax, [ebp+var_24]
.text:00643A54                 cmp     dword ptr [eax+0ECh], 0
.text:00643A5B                 jz      short loc_643A88
.text:00643A5D                 mov     ecx, [ebp+var_24]
.text:00643A60                 mov     edx, [ecx+0BCh]
.text:00643A66                 cmp     edx, [ebp+arg_10]
.text:00643A69                 jnz     short loc_643A88
.text:00643A6B                 mov     eax, [ebp+var_24]
.text:00643A6E                 mov     ecx, [eax+0E4h]
.text:00643A74                 fld     [ebp+arg_0]
.text:00643A77                 fld     dword ptr [ecx+5Ch]
.text:00643A7A                 fucompp
.text:00643A7C                 fnstsw  ax
.text:00643A7E                 test    ah, 44h
.text:00643A81                 jp      short loc_643A88
.text:00643A83                 jmp     loc_643C0C
.text:00643A88 ; ---------------------------------------------------------------------------
.text:00643A88
.text:00643A88 loc_643A88:                             ; CODE XREF: sub_6439E0+7Bj
.text:00643A88                                         ; sub_6439E0+89j ...
.text:00643A88                 mov     edx, [ebp+var_24]
.text:00643A8B                 mov     eax, [ebp+arg_10]
.text:00643A8E                 mov     [edx+0BCh], eax
.text:00643A94                 mov     ecx, [ebp+var_24]
.text:00643A97                 mov     dl, [ebp+arg_C]
.text:00643A9A                 mov     [ecx+0C0h], dl
.text:00643AA0                 mov     eax, [ebp+var_24]
.text:00643AA3                 mov     ecx, [ebp+arg_8]
.text:00643AA6                 mov     [eax+0B4h], ecx
.text:00643AAC                 call    ds:GetTickCount
.text:00643AB2                 mov     edx, [ebp+var_24]
.text:00643AB5                 mov     [edx+0C4h], eax
.text:00643ABB                 mov     eax, [ebp+var_24]
.text:00643ABE                 mov     cl, [eax+0C0h]
.text:00643AC4                 mov     [ebp+var_38], cl
.text:00643AC7                 cmp     [ebp+var_38], 0
.text:00643ACB                 jz      short loc_643ADB
.text:00643ACD                 cmp     [ebp+var_38], 1
.text:00643AD1                 jz      short loc_643AFA
.text:00643AD3                 cmp     [ebp+var_38], 2
.text:00643AD7                 jz      short loc_643B18
.text:00643AD9                 jmp     short loc_643B44
.text:00643ADB ; ---------------------------------------------------------------------------
.text:00643ADB
.text:00643ADB loc_643ADB:                             ; CODE XREF: sub_6439E0+EBj
.text:00643ADB                 mov     edx, [ebp+var_24]
.text:00643ADE                 mov     eax, [edx+0E4h]
.text:00643AE4                 mov     dword ptr [eax+40h], 1
.text:00643AEB                 mov     ecx, [ebp+var_24]
.text:00643AEE                 mov     dword ptr [ecx+0B8h], 0FFFFFFh
.text:00643AF8                 jmp     short loc_643B61
.text:00643AFA ; ---------------------------------------------------------------------------
.text:00643AFA
.text:00643AFA loc_643AFA:                             ; CODE XREF: sub_6439E0+F1j
.text:00643AFA                 mov     edx, [ebp+var_24]
.text:00643AFD                 mov     eax, [edx+0E4h]
.text:00643B03                 mov     dword ptr [eax+40h], 0
.text:00643B0A                 mov     ecx, [ebp+var_24]
.text:00643B0D                 mov     edx, [ebp+arg_14]
.text:00643B10                 mov     [ecx+0B8h], edx
.text:00643B16                 jmp     short loc_643B61
.text:00643B18 ; ---------------------------------------------------------------------------
.text:00643B18
.text:00643B18 loc_643B18:                             ; CODE XREF: sub_6439E0+F7j
.text:00643B18                 mov     eax, [ebp+var_24]
.text:00643B1B                 mov     dword ptr [eax+0B4h], 0FFFFFFFFh
.text:00643B25                 mov     ecx, [ebp+var_24]
.text:00643B28                 mov     edx, [ecx+0E4h]
.text:00643B2E                 mov     dword ptr [edx+40h], 1
.text:00643B35                 mov     eax, [ebp+var_24]
.text:00643B38                 mov     dword ptr [eax+0B8h], 0FFFFFFh
.text:00643B42                 jmp     short loc_643B61
.text:00643B44 ; ---------------------------------------------------------------------------
.text:00643B44
.text:00643B44 loc_643B44:                             ; CODE XREF: sub_6439E0+F9j
.text:00643B44                 mov     ecx, [ebp+var_24]
.text:00643B47                 mov     edx, [ecx+0E4h]
.text:00643B4D                 mov     dword ptr [edx+40h], 0
.text:00643B54                 mov     eax, [ebp+var_24]
.text:00643B57                 mov     dword ptr [eax+0B8h], 0FFFFFFh
.text:00643B61
.text:00643B61 loc_643B61:                             ; CODE XREF: sub_6439E0+118j
.text:00643B61                                         ; sub_6439E0+136j ...
.text:00643B61                 mov     ecx, [ebp+var_24]
.text:00643B64                 mov     edx, [ecx+0E4h]
.text:00643B6A                 mov     eax, [ebp+arg_0]
.text:00643B6D                 mov     [edx+5Ch], eax
.text:00643B70                 mov     ecx, [ebp+arg_4]
.text:00643B73                 mov     [ebp+var_3C], ecx
.text:00643B76                 mov     edx, [ebp+var_3C]
.text:00643B79                 inc     edx
.text:00643B7A                 mov     [ebp+var_40], edx
.text:00643B7D
.text:00643B7D loc_643B7D:                             ; CODE XREF: sub_6439E0+1ACj
.text:00643B7D                 mov     eax, [ebp+var_3C]
.text:00643B80                 mov     cl, [eax]
.text:00643B82                 mov     [ebp+var_41], cl
.text:00643B85                 inc     [ebp+var_3C]
.text:00643B88                 cmp     [ebp+var_41], 0
.text:00643B8C                 jnz     short loc_643B7D
.text:00643B8E                 mov     edx, [ebp+var_3C]
.text:00643B91                 sub     edx, [ebp+var_40]
.text:00643B94                 mov     [ebp+var_48], edx
.text:00643B97                 mov     eax, [ebp+var_48]
.text:00643B9A                 push    eax
.text:00643B9B                 mov     ecx, [ebp+arg_4]
.text:00643B9E                 push    ecx
.text:00643B9F                 mov     ecx, [ebp+var_24]
.text:00643BA2                 add     ecx, 0C8h
.text:00643BA8                 call    sub_40B5E0
.text:00643BAD                 push    0
.text:00643BAF                 mov     edx, [ebp+arg_10]
.text:00643BB2                 push    edx
.text:00643BB3                 call    sub_40CDC0
.text:00643BB8                 add     esp, 8
.text:00643BBB                 mov     ecx, [ebp+var_24]
.text:00643BBE                 mov     [ecx+0ECh], eax
.text:00643BC4                 mov     edx, [ebp+var_24]
.text:00643BC7                 cmp     dword ptr [edx+0ECh], 0
.text:00643BCE                 jz      short loc_643BF2
.text:00643BD0                 mov     eax, [ebp+var_24]
.text:00643BD3                 mov     ecx, [eax+0ECh]
.text:00643BD9                 mov     edx, [ebp+var_24]
.text:00643BDC                 mov     eax, [edx+0ECh]
.text:00643BE2                 mov     edx, [ecx]
.text:00643BE4                 mov     ecx, eax
.text:00643BE6                 call    dword ptr [edx+5Ch]
.text:00643BE9                 movzx   eax, al
.text:00643BEC                 test    eax, eax
.text:00643BEE                 jnz     short loc_643BF2
.text:00643BF0                 jmp     short loc_643C0C
.text:00643BF2 ; ---------------------------------------------------------------------------
.text:00643BF2
.text:00643BF2 loc_643BF2:                             ; CODE XREF: sub_6439E0+1EEj
.text:00643BF2                                         ; sub_6439E0+20Ej
.text:00643BF2                 cmp     dword_891C08, 0
.text:00643BF9                 jz      short loc_643BFD
.text:00643BFB                 jmp     short loc_643C0C
.text:00643BFD ; ---------------------------------------------------------------------------
.text:00643BFD
.text:00643BFD loc_643BFD:                             ; CODE XREF: sub_6439E0+219j
.text:00643BFD                 mov     ecx, [ebp+var_24]
.text:00643C00                 add     ecx, 14h
.text:00643C03                 push    ecx             ; lprc
.text:00643C04                 mov     ecx, [ebp+var_24]
.text:00643C07                 call    sub_410940
.text:00643C0C
.text:00643C0C loc_643C0C:                             ; CODE XREF: sub_6439E0+32j
.text:00643C0C                                         ; sub_6439E0+6Cj ...
.text:00643C0C                 mov     esp, ebp
.text:00643C0E                 pop     ebp
.text:00643C0F                 retn    1Ch
.text:00643C0F sub_6439E0      endp
Slade100 is offline  
Old 06/12/2015, 00:59   #6
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Urgh.
Bevor du printf aufrufst, solltest du noch pushad und popad machen (vllt auch pushfd und popfd, ich mache immer beides und bin zu faul nachzusehen.)
Wieso machst du das aber von Hand? Nimm dir lieber Microsoft Detours, oder MologieDetours, damit sparst du dir das ganze naked Assembler zeugs.

Außerdem ist __declspec(naked) *nicht* das gleiche wie __stdcall, da ist vermutlich dein Crash zu finden

Padmak
Padmak is offline  
Old 06/12/2015, 09:19   #7


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Das ganze ist KEIN stdcall, sondern ein thiscall. Dies kann man recht gut an 0x006439E6 sehen, wo ecx (this) gelesen wird, ohne dass es in der Funktion vorher gesetzt wird.
Dein Hook selbst ist korrekt, wenn auch, wie Padmak schon sagte, mit dem inline asm irgendwie unnötig. Aber wenn du am Ende unbedingt springen willst, meinetwegen.

Ob die Hookfunktion an der Stelle stdcall ist oder nicht, ist extrem egal, da die Funktion eh kein return (ret XX) beinhaltet, sondern lediglich einen unbedingten Sprung zurück.
Das fehlende Sichern der Register ist das, was hier vermutlich für den Crash sorgt. Insbesondere ecx wird während dem printf aller Wahrscheinlichkeit nach verändert (da Caller-Saved) ohne wiederhergestellt zu werden. Dadurch kann die Originalfunktion nach dem Rücksprung nicht richtig arbeiten, weil ihr this (ecx) irgendein Müll ist. Alle anderen Register werden entweder von printf wieder korrekt hergestellt (Callee-Saved Register) oder sind nicht zu sichern, weil der Hook eh am Anfang der Funktion ist und noch keine Caller-Saved Register von der Originalfunktion verwendet wurden. Ein Sichern des Flagregisters wird auch nicht nötig sein.
Mein Vorschlag also:
Code:
int __declspec(noreturn) __declspec(naked) __fastcall myfunction(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC,int intD, int intE){
	__asm
	{
		push    ebp // func_add, wenn der hook noch nicht gesetzt ist
		mov     ebp, esp
		sub     esp, 48h
                push   ecx
	}

	printf("hey");
	
        __asm pop ecx;
	__asm jmp func_back;
}
Durch das Deklarieren der Funktion als Fastcall, werden die ersten beiden Argumente in ecx und edx erwartet. Dadurch kriegst du das this (hier thisptr) der Funktion mit.
Trotzdem kein Fan von der inline asm Variante, wenn es nicht sein muss (und hier muss es nicht sein).
Abgesehen davon, speichere BITTE Pointer NICHT in DWORDs. Welcher Trottel ist bitte auf solchen Mist gekommen und warum kopiert das quasi jeder? Nicht einmal in der WinAPI werden irgendwo Pointer als DWORD übergeben. Ein DWORD ist eine 32 bit lange Ganzzahl ohne Vorzeichen. Sobald du solchen Code auf 64 bit ausführst, hast du 32 bit zu wenig. Sehe dauernd irgendwelche ... naja, Programmierer, die sich dann wundern, warum ihr toller Code auf 64 bit gar nicht funktioniert. Davon abgesehen impliziert ein DWORD auch irgendwie keinen Pointer. Wie man also auf derartigen Unfug kommen kann, ist mir irgendwie immernoch rätselhaft.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
2 Users
Old 06/12/2015, 12:44   #8
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Streber

Kurzer Einwurf für MSVC (wovon ich nach dem ASM-Syntax ausgehe
Man braucht diesen __fastcall-Hack nicht, man kann sich mit einem anderen Hack behelfen (ich hoffe der Syntax passt so, bin bisschen zu faul zum Testen gerade):
Code:
struct dummy{
static int __thiscall myfunction((float, int, int, char, int, int, int);
};
Ich finde, dass die Funktion dadurch wesentlich schöner ist, weil man keine "unnützen" Parameter hat und noch dazu keine Probleme mit this hat.
Funktioniert so aber nur unter MSVC, woanders habe ich das noch nicht zum Laufen bringen können.

POPAD/POPFD hab ich vorgeschlagen, weil er im Endeffekt in seiner Funktion wesentlich mehr machen möchte als nur ein einfaches printf, wenn er jetzt nach deiner Erklärung nur ECX sichert, schmiert es ihm dann später ab, wenn er irgendeine seiner eigenen Funktionen benutzt. (Oder Stack-Variablen einführt, was ihm ESP zerschießen dürfte, oder? Kann das jemand verifizieren/widerlegen?)

Padmak
Padmak is offline  
Old 06/12/2015, 12:53   #9
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Ihr seid beide streber ⊙ω⊙, aber meine Streber <3 #nohomo
Terrat is offline  
Old 06/12/2015, 13:03   #10
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Dein Hook selbst ist korrekt, wenn auch, wie Padmak schon sagte, mit dem inline asm irgendwie unnötig. Aber wenn du am Ende unbedingt springen willst, meinetwegen.

Ob die Hookfunktion an der Stelle stdcall ist oder nicht, ist extrem egal, da die Funktion eh kein return (ret XX) beinhaltet, sondern lediglich einen unbedingten Sprung zurück.
Das fehlende Sichern der Register ist das, was hier vermutlich für den Crash sorgt. Insbesondere ecx wird während dem printf aller Wahrscheinlichkeit nach verändert (da Caller-Saved) ohne wiederhergestellt zu werden. Dadurch kann die Originalfunktion nach dem Rücksprung nicht richtig arbeiten, weil ihr this (ecx) irgendein Müll ist. Alle anderen Register werden entweder von printf wieder korrekt hergestellt (Callee-Saved Register) oder sind nicht zu sichern, weil der Hook eh am Anfang der Funktion ist und noch keine Caller-Saved Register von der Originalfunktion verwendet wurden. Ein Sichern des Flagregisters wird auch nicht nötig sein.
Mein Vorschlag also:
Code:
int __declspec(noreturn) __declspec(naked) __fastcall myfunction(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC,int intD, int intE){
	__asm
	{
		push    ebp // func_add, wenn der hook noch nicht gesetzt ist
		mov     ebp, esp
		sub     esp, 48h
                push   ecx
	}

	printf("hey");
	
        __asm pop ecx;
	__asm jmp func_back;
}
Durch das Deklarieren der Funktion als Fastcall, werden die ersten beiden Argumente in ecx und edx erwartet. Dadurch kriegst du das this (hier thisptr) der Funktion mit.
Trotzdem kein Fan von der inline asm Variante, wenn es nicht sein muss (und hier muss es nicht sein).
Abgesehen davon, speichere BITTE Pointer NICHT in DWORDs. Welcher Trottel ist bitte auf solchen Mist gekommen und warum kopiert das quasi jeder? Nicht einmal in der WinAPI werden irgendwo Pointer als DWORD übergeben. Ein DWORD ist eine 32 bit lange Ganzzahl ohne Vorzeichen. Sobald du solchen Code auf 64 bit ausführst, hast du 32 bit zu wenig. Sehe dauernd irgendwelche ... naja, Programmierer, die sich dann wundern, warum ihr toller Code auf 64 bit gar nicht funktioniert. Davon abgesehen impliziert ein DWORD auch irgendwie keinen Pointer. Wie man also auf derartigen Unfug kommen kann, ist mir irgendwie immernoch rätselhaft.
Mit freundlichen Grüßen
Jeoni
danke dir sehr für die Antwort , und schon hat man wieder was gelernt
eine frage hätte ich jedoch noch unzwar, wie sieht das aufrufen so einer funktion in der eigenen main aus? also ich habe gesehn das die adresse vom thisptr, das selbe ist wie die value vom intA, nun hatte ich versucht die funktion zu callen, erstmal so
Code:
MyOnMapClick( (void*)intA, NULL, floatA, intA, intB, charA, intC, intD, intE);
naja iwie hat mein (void*)intA 0 einfluss den thisptr in der function
Code:
	printf("ecx(this) = %p\n", thisptr);/* kommt immer was komplett anderes raus, als das wie ich es aufrufen will, auch wenn ich für intA 0 habe steht da was anderes*/
daher dachte ich mir ich ändere ecx halt in meinem asm code.
dann hab ichs so versucht
Code:
int __declspec(noreturn) __declspec(naked) __fastcall MyOnMapClick(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC, int intD, int intE){

	__asm
	{
		push    ebp
			mov     ebp, esp
			sub     esp, 48h
			push ecx
	}
	printf("ecx(this) = %p\n", thisptr);
	printf("floata = %d\n", floatA);
	printf("inta = %d\n", intA);
	printf("intb = %d\n", intB);
	printf("intc = %d\n", intC);
	printf("intd = %d\n", intD);
	printf("inte = %d\n", intE);
	printf("charA = %d\n", charA);

	__asm pop ecx
	__asm mov ecx, intC 
	__asm jmp mapclick_back
}
hab zwar nicht geprüft was für ein wert ecx nach meinem mov hatte, aber da die function nicht getan hat was sie sollte wusst ich schon das ich iwas falsch mache, sry das ich noch so schlecht drin bin und soviel frage
Slade100 is offline  
Old 06/12/2015, 14:10   #11
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by erfan100 View Post
danke dir sehr für die Antwort , und schon hat man wieder was gelernt
eine frage hätte ich jedoch noch unzwar, wie sieht das aufrufen so einer funktion in der eigenen main aus? also ich habe gesehn das die adresse vom thisptr, das selbe ist wie die value vom intA, nun hatte ich versucht die funktion zu callen, erstmal so
Code:
MyOnMapClick( (void*)intA, NULL, floatA, intA, intB, charA, intC, intD, intE);
naja iwie hat mein (void*)intA 0 einfluss den thisptr in der function
Code:
	printf("ecx(this) = %p\n", thisptr);/* kommt immer was komplett anderes raus, als das wie ich es aufrufen will, auch wenn ich für intA 0 habe steht da was anderes*/
daher dachte ich mir ich ändere ecx halt in meinem asm code.
dann hab ichs so versucht
Code:
int __declspec(noreturn) __declspec(naked) __fastcall MyOnMapClick(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC, int intD, int intE){

	__asm
	{
		push    ebp
			mov     ebp, esp
			sub     esp, 48h
			push ecx
	}
	printf("ecx(this) = %p\n", thisptr);
	printf("floata = %d\n", floatA);
	printf("inta = %d\n", intA);
	printf("intb = %d\n", intB);
	printf("intc = %d\n", intC);
	printf("intd = %d\n", intD);
	printf("inte = %d\n", intE);
	printf("charA = %d\n", charA);

	__asm pop ecx
	__asm mov ecx, intC 
	__asm jmp mapclick_back
}
hab zwar nicht geprüft was für ein wert ecx nach meinem mov hatte, aber da die function nicht getan hat was sie sollte wusst ich schon das ich iwas falsch mache, sry das ich noch so schlecht drin bin und soviel frage
Nutz als erstes mal eine andere printf formatierung.
Code:
	printf("floata \t| %f\n", floatA);
	printf("inta \t| %i\n", intA);
	printf("intb \t| %i\n", intB);
	printf("intc \t| %i\n", intC);
	printf("intd \t| %i\n", intD);
	printf("inte \t| %i\n", intE);
	printf("charA \t| %c\n", charA);
// %c = char , %i = int,  %, %f = float
// http://www.cplusplus.com/reference/cstdio/printf/
// \n ist eine escape sequenz
//https://msdn.microsoft.com/de-de/library/6aw8xdf2.aspx
Und um die funktion aufzurufen musst du erstmal gucken was mit dem Registern gemacht wird, falls vorher werte gesetzt wurden etc. Könntest du mir einmal sagen ob du beim ecx wirklich immer den Wert von Inta hattest und nicht die adresse ?
Hab dir das mal mit einem Code verdeutlicht:
Code:
#include <iostream>

void Output(void *thisptr)
{
	printf("ecx(this) = %p\n", thisptr);
}
int main()
{
	int Test = 11;
	// Hier wird der Wert der Adresse übergeben, 11
	Output((void*)Test);
	// Hier wird die Adresse übergeben ( bei jedem start anders )
	Output((void*)&Test);
	getchar();
	return 0;
}
Da ich eher auf klassischen C++ cast stehe:
Code:
	// Wird der Wert der Adresse übergeben, 11 (Durch den printf wird dadurch aber B, B = 11 in Hexadezimal)
	Output( reinterpret_cast<void*>(Test) );
	// Hier wird die Adresse übergeben
	Output( reinterpret_cast<void*>(&Test) );
Terrat is offline  
Thanks
1 User
Old 06/12/2015, 14:37   #12


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Quote:
Originally Posted by Padmak View Post
POPAD/POPFD hab ich vorgeschlagen, weil er im Endeffekt in seiner Funktion wesentlich mehr machen möchte als nur ein einfaches printf, wenn er jetzt nach deiner Erklärung nur ECX sichert, schmiert es ihm dann später ab, wenn er irgendeine seiner eigenen Funktionen benutzt. (Oder Stack-Variablen einführt, was ihm ESP zerschießen dürfte, oder? Kann das jemand verifizieren/widerlegen?)
Das Sichern der Flags ist nicht nötig. Die Zielfunktion wurde am Anfang gehookt. Nach dem Standard, an den sich die Compiler halten, sind die meisten Flags zu diesem Zeitpunkt eh unbestimmt. Und die, die einen vordefinierten Wert haben (Direction-Flag soweit ich weiß), haben diesen auch noch nach der Hookfunktion, da jeglicher Code, welche diese umsetzt am Ende auch gleich wieder zurücksetzt. Jedenfalls habe ich das bisher nicht anders gehen.
Alle Caller-Saved Register (abgesehen von ECX, welches hier ja die Sonderrolle von this einnimmt) müssen ebenfalls nicht gesichert werden (wie es der Name auch schon impliziert, in dem Fall ebenfalls korrekt). Die Funktion, welche die Zielfunktion aufruft, muss damit rechnen, dass diese Register nach dem Call der Zielfunktion zerstört sind (und muss die Register entsprechend selbst sichern, wenn sie diese noch braucht). Da die Register beim Aufruf keine besonderen Werte tragen und die Zielfunktion dank Hook am Funktionsbeginn die Register auch noch nicht mit Werten belegt hat, ist es egal, ob die Register ihren Wert in der Hookfunktion verlieren.
Callee-Saved Register müssen gesichert werden, sofern sie verwendet werden. Normalerweise muss man sich nicht kümmern, wenn man quasi-standardisierte Hooks benutzt. Mit diesem inline asm Zeug und den compilergenerierten Code dazwischen, wird es aber durchaus sinnvoll sein, diese zu sichern. Wobei simple Funktionsaufrufe (bspw. printf) eigentlich kein Callee-Saved Register ändern sollten, weil die Unterfunktion selbst das Callee-Saved Register natürlich selbst speichert und wiederherstellt und der Aufruf (also das Ablegen der Argumente auf dem Stack, das Call und das Säubern des Stacks) keine Callee-Saved Register benutzt, soweit ich weiß. Wobei diese Entscheidung eigentlich auch wieder Compilersache ist.

Nein, Stack-Variablen zerschießen ihn nicht den Stack, da der Compiler in einer declspec(naked) Funktion nicht für das Allokieren von Speicher auf dem Stack (in der Regel durch "sub esp, XX") zuständig ist. Ferner wird der Compiler sowieso keine lokalen Variablen zulassen, sofern er nicht sieht, dass entsprechend Platz auf dem Stack geschaffen wurde. Das sieht er meines Wissens nach, wenn man "sub esp, __LOCAL_SIZE" in den Prolog schreibt. Entsprechend muss man den Speicher aber am Ende auch wieder freigeben (bspw. mit add oder "mov esp, ebp" wenn man mit Framepointern arbeitet).

Quote:
Originally Posted by Terrat View Post
Und um die funktion aufzurufen musst du erstmal gucken was mit dem Registern gemacht wird, falls vorher werte gesetzt wurden etc. Könntest du mir einmal sagen ob du beim ecx wirklich immer den Wert von Inta hattest und nicht die adresse ?
this wird sicherlich nicht die Adresse eines Arguments auf dem Stack sein

Quote:
Originally Posted by Terrat View Post
Code:
void Output(void *thisptr)
{
	printf("ecx(this) = %p\n", thisptr);
}
Wenn du schon, wie du sagst, auf C++ stehst, kann man es auch gleich so machen und sich die Casts ganz sparen:
Code:
template<typename T>
void Output(T thisptr)
{
  printf("ecx(this) = %p\n", thisptr);
}
Da wäre es aber vermutlich eh besser einfach zweimal printf zu schreiben, statt die Funktion zu nutzen
Der Cast von "&Test" (einem int*) auf ein void* ist btw. unnötig, weil ein typisierter Zeiger (hier int*) auch ein (untypisierter) Zeiger (void*) ist. Der Cast dort geht implizit und das ist an der Stelle meiner Meinung nach auch vollkommen in Ordnung.

Quote:
Originally Posted by erfan100 View Post
naja iwie hat mein (void*)intA 0 einfluss den thisptr in der function
Code:
	printf("ecx(this) = %p\n", thisptr);/* kommt immer was komplett anderes raus, als das wie ich es aufrufen will, auch wenn ich für intA 0 habe steht da was anderes*/
Ich rate dazu entweder die Funktion aussschließlich in asm zu schreiben oder ausschließlich in C/C++, da du dank declspec(naked) auf Register achten musst, aber dennoch Code vom Compiler generieren lässt, auf welchen du quasi keinen Einfluss hast. Oft wird eine kleine Stub in asm geschrieben, die alles Nötige an eine abstraktere C/C++-Funktion weiterreicht und bei Bedarf Register und Flags sichert und wiederherstellt. Das sieht man häufiger bei Midfunction-Hooks. In dem Fall braucht man eigentlich gar kein asm, da reicht ein "Standard"-Hook für den Funktionsanfang doch komplett aus. Du machst es dir wirklich schwerer als es eigentlich ist

Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 06/12/2015, 14:47   #13
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Ja gut, hab ich was von Tempelates erwähnt ja gut hab ich nicht aber ja gut
Terrat is offline  
Old 06/12/2015, 17:07   #14
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
danke euch wirklich sehr für die hilfe habs jetzt normal mit ms detours gemacht und scheint auch gut zu klappen ,
hier wie es jetzt aus sieht,vllt ist etwas ja doch noch falsch
Code:
typedef int(__thiscall* tOnMapClick)(void*,float, int, int, char, int,int,int);
tOnMapClick oOnMapClick;
int  __fastcall MyOnMapClick(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC, int intD, int intE){


	printf("ecx(this) = %p      edx= %p\n", thisptr,_edx);
	printf("floata = %d\n", floatA);
	printf("inta = %d\n", intA);
	printf("intb = %d\n", intB);
	printf("intc = %d\n", intC);
	printf("intd = %d\n", intD);
	printf("inte = %d\n", intE);
	printf("charA = %d\n", charA);

	return oOnMapClick(thisptr, floatA, intA, intB, charA, intC, intD, intE);
}
Slade100 is offline  
Old 06/12/2015, 17:17   #15


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Quote:
Originally Posted by Terrat View Post
Ja gut, hab ich was von Tempelates erwähnt ja gut hab ich nicht aber ja gut
Oh, sorry, mein Fehler. Ich sollte weniger von mir auf Andere schließen. Ich bin ein Fan von solchen Dingen.

Quote:
Originally Posted by erfan100 View Post
danke euch wirklich sehr für die hilfe habs jetzt normal mit ms detours gemacht und scheint auch gut zu klappen ,
hier wie es jetzt aus sieht,vllt ist etwas ja doch noch falsch
Code:
typedef int(__thiscall* tOnMapClick)(void*,float, int, int, char, int,int,int);
tOnMapClick oOnMapClick;
int  __fastcall MyOnMapClick(void* thisptr, void* _edx, float floatA, int intA, int intB, char charA, int intC, int intD, int intE){


	printf("ecx(this) = %p      edx= %p\n", thisptr,_edx);
	printf("floata = %d\n", floatA);
	printf("inta = %d\n", intA);
	printf("intb = %d\n", intB);
	printf("intc = %d\n", intC);
	printf("intd = %d\n", intD);
	printf("inte = %d\n", intE);
	printf("charA = %d\n", charA);

	return oOnMapClick(thisptr, floatA, intA, intB, charA, intC, intD, intE);
}
Sieht schon viel besser aus. Floats kannste, wie Terrat schon vor ein paar Posts erwähnte, schlecht mit %d ausgeben. Für die anderen Argumente kannste %d eigentlich weiter verwenden. Ist meines Wissens nach Synonym zu %i, aber man möge mich korrigieren, wenn ich falsch liege. Habe da jetzt nicht nachgeschaut.
Den char kannste theoretisch mit %c ausgeben, wie Terrat ebenfalls erwähnte. Das macht aber nur Sinn, wenn das tatsächlich ein Asciicharakter ist, und halt keine beliebige 8 bit Zahl (für was man char ja ebenfalls verwenden kann). In letzterem Fall ist %d / %i vermutlich die sinnvollere Variante.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Reply


Similar Threads Similar Threads
[LUA] Funktion mit Funktion zu deaktivieren
06/17/2014 - General Coding - 8 Replies
Hey, Ich arbeite erst seit geringe Zeit mit Lua und wollte mal fragen ob ihr wisste wie das geht. Also ich habe eine Funktion (z.B. Dmg aus) und ob ich dann in einer weiteren Funktion schreiben kann das wenn das chatcommand (was ich oben gadded habe) z.B. /dmgoff benutzt wird das dmg aus geht. (bzw das hab ich schon jetzt kommt mein Problem). Wenn ich in einer Weiteren funktion mit z.B. /dmgon (das command oben schon geadded) das dmg wieder einzuschalten in dem ich die dmgoff funktion...
[HELP]Kostümystem clientside grob und funktion für funktion fail..
05/04/2014 - Metin2 Private Server - 2 Replies
Moin , ich hab das Kostümystem clientside erst funktion für funktion eingefügt, zeile für zeile aber auch bei "grob einfügen (copy and past) den gleichen scheiß fehler.. 0503 15:06:14429 :: CPythonPlayer::SetItemData(dwSlotIndex=5, itemIndex=1289) - Failed to item data 0503 15:06:14430 :: CPythonPlayer::SetItemData(dwSlotIndex=38, itemIndex=41010) - Failed to item data 0503 15:06:14548 :: CMapOutdoor::Load - LoadMonsterAreaInfo ERROR
[S] USA.net E-mail Spammer (Proxy Funktion & Account-listen Abruf Funktion) [B] e*g
04/24/2013 - elite*gold Trading - 0 Replies
Hallo, Ich Suche einen E-mail Spammbot der mit USA.net E-mail Adressen Arbeitet. den SMTP Herrauszufinden ist ja nicht Wirklich schwer. Er Sollte Proxy Funktionen haben (E-mail via Proxy versenden) Und er sollte eine liste mit Accounts (Format E-mail:Passwort) Einlesen und verwenden Können (Wenn eine E-mail nichtsmehr sendet wird eine 2te Genommen Also aus der Liste) Hoffe ihr könnt mir da Weiterhelfen ^^ Kontakt Bitte per PN.
Hilfe bei Send Funktion mit Stop Funktion
04/02/2011 - AutoIt - 11 Replies
Hallo Elitepvpers ich habe ein Problem und Mein Problem ist das mein Text einfach weiter schreibt wenn ich mit HotKey verwende... gib es keine Funktion das der Text einmal kommt und nicht wenn man einmal die HotKey das er 10 min das selbe schreibt :confused:
[C++]Funktion einer Klasse in einer anderen Funktion der Klasse verwenden, aber wie?
07/25/2010 - C/C++ - 3 Replies
Mein Problem ist eigentlich recht simpel und die Lösung wahrscheinlich auch. Da ich bisher fast 0 mit Klassen am Hut hatte, wollte ich mich doch mit dem Thema anfreunden und hatte gleich angefangen: int test::Funktion2() { int temp; cin>>temp; return temp; }



All times are GMT +1. The time now is 08:30.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.