Function with FindPattern is crashing

05/02/2015 21:35 Friendplays1#1
Hi.

Ich habe eine simple ASM Funktion. Die Adressen suche ich mit FindPattern.
Das ganze gibt mir auch die richtigen Pointer aus:

109428c & 467b30.

Nun habe ich ein Problem. Hier ist die Funktion:

Code:
DWORD PickUpMove;
DWORD PickUpCall;


void PickUp(){
__asm{
        MOV ECX, DWORD PTR DS : [PickUpMove]
        CALL PickUpCall
    }
}

void InitiateHooks()
{
    DWORD PickupFunc = FindPattern("client.exe", "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\x8B\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE9\x00\x00\x00\x00\x51\x8B\x4C\x24\x0C\x8D\x04\x24\x50\x6A\x00\x51\xE8\x00\x00\x00\x00\x83\xC4\x0C\x84\xC0",
        "xxxxxxxxxxxxxxx????x????x????xxxxxxxxxxxxx????xxxxx");
    PickupFunc += 19;
    DWORD PickUpCall2 = RelativeToAbsolute(PickupFunc + 1);
    PickUpCall = PickUpCall2;
    PickupFunc -= 19;

    PickupFunc += 14;
    DWORD Address1 = *(DWORD*)(PickupFunc + 1);
    PickUpMove = Address1;
    PickupFunc -= 14;


}
Wenn ich nun die Funktion PickUp aufrufe crasht das Spiel.
Wenn ich "PickUpMove" & "PickUpCall" aber direkt im Code bestimme geht alles perfekt:

Code:
DWORD PickUpCall = 0x467b30

void PickUp(){
    __asm{
        MOV ECX, DWORD PTR DS : [0x109428c]
        CALL PickUpCall
    }
}
Also ist das Problem das "0x". Wie kann ich mein DWORD zu "0x109428C" anstatt "109428C" machen?
Hinweis?

Danke :)
05/02/2015 21:44 _asm#2
Du musst den Klasseninstanz-Pointer in das EAX Register schieben und anschließend ins ECX Register.

Code:
enum StaticAddresses
{
    PickUpMove,
    PickUpCall
};

void PickUp()
{
	__asm
	{
		MOV EAX, PickUpMove
			MOV ECX, DWORD PTR DS : [EAX]
			CALL PickUpCall
	}
}
Edit: Funktionspointer wären hier auch deutlich eine schönere Lösung:
Code:
void PickUp()
{
    typedef void (__thiscall *PickUpPtr)(unsigned long arg);
    PickUpPtr fPickUp = reinterpret_cast<PickUpPtr>(FuncAddr);

    fPickUp(*reinterpret_cast<unsigned long*>(ClassPtr));
}
Ich tippe mal auf ein __thiscall
05/02/2015 22:11 Friendplays1#3
Das war ja einfacher als gedacht, danke dir :)
Kann geclosed werden.
06/30/2015 15:23 Friendplays1#4
Ich bins nochmal. Habe wieder ein Problem mit Findpatter.
Diesmal will ich kein ASM benutzen, sondern einfach einen Pointer ändern.
Wenn ich mit Findpattern den Pointer suche finde ich auch den richtigen.
Gebe den in einer Messagebox aus.
Aber wenn ich dann vom Pointer die Value ändern will kommt ein Zugriffserror.
Gebe ich im Code direkt die Adresse ein klappts, also liegts wieder am 0x.
In ASM klappte das ja mit
MOV EAX, Pointer.

Wie krieg ich das hin ohne ASM zu nutzen?
Danke nochmal :)
07/06/2015 12:53 ƬheGame#5
Quote:
Originally Posted by Friendplays1 View Post
Ich bins nochmal. Habe wieder ein Problem mit Findpatter.
Diesmal will ich kein ASM benutzen, sondern einfach einen Pointer ändern.
Wenn ich mit Findpattern den Pointer suche finde ich auch den richtigen.
Gebe den in einer Messagebox aus.
Aber wenn ich dann vom Pointer die Value ändern will kommt ein Zugriffserror.
Gebe ich im Code direkt die Adresse ein klappts, also liegts wieder am 0x.
In ASM klappte das ja mit
MOV EAX, Pointer.

Wie krieg ich das hin ohne ASM zu nutzen?
Danke nochmal :)

Code:
int* randomPtr = reinterpret_cast<int*>(109428C);
*randomPtr = 0xFF;
um der Variabel auf die der Pointer zeigt 255 zuzuweisen.
07/15/2015 16:55 Friendplays1#6
Danke, brauchte ich dann nicht mehr, habs anders gelöst :) Ein letztes Problem nun. Möchte nun diese 2 Funktionen mit FindPatter finden. Wieder: Die messageboxen geben bei beiden das richtige Call & Move an. Nun habe ich es wie __asm gemacht und es erst in das eax register, dann ins ecx register geschoben. Folgender Fehler:

[Only registered and activated users can see links. Click Here To Register...]

Das selbe auch wenn ich es nicht erst in das eax register schiebe.

Hier der Gesamte Code:

Quote:
DWORD Move1;
DWORD Call1;

DWORD Move2;
DWORD Call2;


int push1;
void Funktion2(){

__asm{
MOV EAX, Move1
MOV ECX, DWORD PTR DS : [EAX]
call Call1
mov [push1],eax
}


}

void Funktion1(int Wert){
__asm{
MOV EAX, Move2
MOV ECX, DWORD PTR DS : [EAX]
push Wert
push 0
call Call2
}

}


void SearchForPointer()
{
char curprc[MAX_PATH];
GetModuleFileName(NULL,curprc,sizeof(curprc));


__try{
DWORD Func1Search = FindPatternPointer(curprc, "\x8B\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x89\ x44\x24\x08\xC7\x44\x24\x04\x00\x00\x00\x00\xFF\x2 5\x00\x00\x00\x00\xCC\xCC\xCC\x83\xEC\x40",
"xx????x????xxxxxxxx????xx????xxxxxx");
DWORD Move2Found = *(DWORD*)(Func1Search + 1);
Move2 = Move2Found;

Func1Search += 5;
DWORD Call2Found = RelativeToAbsolute(Func1Search + 1);
Call2 = Call2Found;
Func1Search -= 5;




DWORD Func2Search = FindPatternPointer(curprc, "\x8B\x0D\x00\x00\x00\x00\x53\x50\xE8\x00\x00\x00\ x00\x8B\xCE\xE8\x00\x00\x00\x00\x84\xC0\x74\x64\x8 B\xCE\xE8\x00\x00\x00\x00\x50\xE8\x00\x00\x00\x00\ x83\xC4\x04\x84\xC0 ",
"xx????xxx????xxx????xxxxxxx????xx????xxxxx");
DWORD Move1Found = *(DWORD*)(Func2Search + 1);
Move1 = Move1Found;

Func2Search += 7;
DWORD Call1Found = RelativeToAbsolute(Func2Search + 1);
Call1 = Call1Found;
Func2Search -= 7;
}
__except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) {
}

}

Wenn ich manuell die Adressen eingebe und das aufrufe:

Quote:
Funktion1(push1);
klappt alles... Wo ist denn jetzt wieder der fehler? =(

Danke :)
07/16/2015 06:17 ƬheGame#7
Quote:
Originally Posted by Friendplays1 View Post
Danke, brauchte ich dann nicht mehr, habs anders gelöst :) Ein letztes Problem nun. Möchte nun diese 2 Funktionen mit FindPatter finden. Wieder: Die messageboxen geben bei beiden das richtige Call & Move an. Nun habe ich es wie __asm gemacht und es erst in das eax register, dann ins ecx register geschoben. Folgender Fehler:

[Only registered and activated users can see links. Click Here To Register...]

Das selbe auch wenn ich es nicht erst in das eax register schiebe.

Hier der Gesamte Code:




Wenn ich manuell die Adressen eingebe und das aufrufe:


klappt alles... Wo ist denn jetzt wieder der fehler? =(

Danke :)
Wie viele Parameter hat die Funktion die du nun aufrufen möchtest?
07/16/2015 12:59 Friendplays1#8
Funktion2 rufe ich zu erst auf, die schreibt einen Wert in integer push1.
Dann rufe ich Funktion1 auf die dann push1 pusht als parameter. Klappt auch ohne weiteres mit manuell eingetragenen adressen..
Beide Funktionen geben diesen Error aus wenn ich sie aufrufem
07/16/2015 15:15 ƬheGame#9
Quote:
Originally Posted by Friendplays1 View Post
Funktion2 rufe ich zu erst auf, die schreibt einen Wert in integer push1.
Dann rufe ich Funktion1 auf die dann push1 pusht als parameter. Klappt auch ohne weiteres mit manuell eingetragenen adressen..
Beide Funktionen geben diesen Error aus wenn ich sie aufrufem
Wie genau greiffst du auf den Zielprozess zu? Ist dein programm eine dll oder eine exe? Wenn ich du schnell hilfe willst, adde mich in skype.