find pattern funktion.. hilfe

03/15/2009 19:01 __wadim#1
ich brauch mal etwas hilfe. ich hab irgendwo ein denkfehler oder der code is total fürn arsch. vlt hab ihr ja bessere funktionen, würd mich freuen wenn ihr eine hier posten könntet.

Code:
DWORD dwFindPattern(DWORD dwStartAddress, DWORD dwEndAddress, BYTE *bMask, BYTE *bMask_O){
	BYTE ScanCode_A[sizeof(bMask)] = {};
	/*
	while(dwStartAddress < dwEndAddress){
		ReadProcessMemory(hGW, (LPCVOID)dwStartAddress, &ScanCode_A[0], 1, 0);
		if(ScanCode_A[0] == bMask[0]){
			ReadProcessMemory(hGW, (LPCVOID)(dwStartAddress + bMask_O[1]), &ScanCode_A[1], 1, 0);
			if(ScanCode_A[1] == bMask[1]){
				ReadProcessMemory(hGW, (LPCVOID)(dwStartAddress + bMask_O[2]), &ScanCode_A[2], 1, 0);
				if(ScanCode_A[2] == bMask[2]){
					ReadProcessMemory(hGW, (LPCVOID)(dwStartAddress + bMask_O[3]), &ScanCode_A[3], 1, 0);
					if(ScanCode_A[3] == bMask[3]){
						return dwStartAddress;
					}
				}
			}
		}
		dwStartAddress++;
	}
	*/

	while(dwStartAddress < dwEndAddress){
		for(int i=0; i<(sizeof(bMask)-1); i++){
			ReadProcessMemory(hGW, (LPCVOID)(dwStartAddress + bMask_O[i]), &ScanCode_A[i], 1, 0);
			if(ScanCode_A[i] == bMask[i])
				return dwStartAddress;

		dwStartAddress++;
	}
}

ich rufs dann so auf:
BYTE Pattern_A[]   =	{85, 81, 139, 51};
BYTE Pattern_A_O[] =	{0, 0x3, 0x6, 0xD};
DWORD x = dwFindPattern(A_STARTFUNC, A_ENDFUNC, Pattern_A, Pattern_A_O) + A_FUNC_OFFSET;
das was da oben auskommentiert ist wollte ich in eine schleife, aber der findet mir immer die falsche funktion. schaut mal bitte drüber.. ich seh da nichts mehr.
03/15/2009 20:56 Atheuz#2
Quote:
Originally Posted by __wadim View Post
ich hab irgendwo ein denkfehler oder der code is total fürn arsch. vlt hab ihr ja bessere funktionen, würd mich freuen wenn ihr eine hier posten könntet.
Hast du nachgeschaut ob die gefundene Adresse in der nähe liegt von deiner Wunschadresse oder bzw die falsch gefundene auch deinem Muster entspricht? Ansonsten verstehe ich nicht wieso du das in der Schleife so komplizierst machst, wird wohl daran liegen das ich nur kurz draufgeschaut habe... alternative;

Code:
DataCompare(const unsigned char *data,
    const unsigned char *bmask, const char *szMask)
{
    for(; *szMask; ++szMask, ++data, ++bmask)
    {
        if( *szMask == 'x' && *data!= *bmask )
            return false;
    }
    return (*szMask) == 0;
}
unsigned long findPattern(HANDLE proc, unsigned char *bmask,
    char *szMask, unsigned long address = 0, unsigned long len = 4)
{
    unsigned long retval = 0;
    unsigned long dataLen = strlen(szMask);
    unsigned char *data = new unsigned char[ dataLen + 1 ];
    SIZE_T bytesRead;

    for(unsigned long i = 0; i < len; i++)
    {
        long curAddr = address + i;
        bool success = ReadProcessMemory(proc, (LPCVOID)curAddr, data,
            dataLen, &bytesRead);

        if( !success || bytesRead == 0 )
            continue;

        if( DataCompare(data, bmask, szMask) )
        {
            retval = address + i;
            break;
        }
    }

    delete [] data;
    return retval;
}
Anwendungsbeispiel;
pattern = string.char(0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0x37, 0x04, 0x02);
findPattern(proc, pattern, "xx????xxx", 0x00840000, 0x000A0000);

Wichtig dabei ist, das x und ? einen einzelnen opcode/hexbit darstellen.
x = statisch.
? = dynamisch.
Wobei dynamische stellen in der pattern immer als 0xFF dargestellt werden muss.
B8 wäre mov, von daher kann man ausgehen das die Adresse hierzu dynamisch ist und wird folglich mit 0xFF 0xFF 0xFF 0xFF ersetzt.
03/15/2009 20:57 Bot_interesierter#3
Also deine Funktion sieht völlig verkorkst aus ^^ hier mal funktionierender Code:
PHP Code:
bool bDataCompare(const unsigned charpData, const unsigned charbMask, const charszMask)

{

    for(;*
szMask;++szMask,++pData,++bMask)

        if(*
szMask=='x' && *pData!=*bMask )

            return 
false;

    return (*
szMask) == 0;

}

unsigned long dwFindPatternunsigned char *bMask,char szMaskunsigned long dw_Addressunsigned long dw_Len)

{

    for(
unsigned long i=0dw_Leni++)

        if( 
bDataCompare( (unsigned char*)( dw_Address+),bMask,szMask) )

            return (
unsigned long)(dw_Address+i);

    return 
0;


und so könnte ein Aufruf aussehen:
PHP Code:
unsinged long SomeFunction dwFindPattern( (BYTE*)"\x56\x57\x68\x00\x00\x00\x00\xB8\x05""xxx????xx" /*dwAdress*/0x00401000,/*dwLen*/ 0x00861FFF); 
Credits dafür gehen ans Gamedeception Forum, ich weiß leider nimmer wie der User heißt der es geschrieben hat.

Edit: war wohl zu langsam und der Code ist übrigens fürs Injecten da, wie man daran sieht das er mit Pointern Arbeitet :-)
03/15/2009 21:09 Atheuz#4
Quote:
Originally Posted by Bot_interesierter View Post
der Code ist übrigens fürs Injecten da, wie man daran sieht das er mit Pointern Arbeitet :-)
Ich hatte leider den Post auf GD nichtmehr gefunden, hatte nurnoch diese version (:
03/15/2009 21:44 __wadim#5
danke euch beiden :)