WriteProcessMemory schreibt Bytes in falscher Reihenfolge

09/22/2010 19:14 @night@#1
Guten Abend.
Ich versuche gerade anhand [Only registered and activated users can see links. Click Here To Register...] Wikieintrages eine Detourfunktion zu schreiben. Leider scheitert das ganze an der Funktion WriteProcessMemory, welche die Bytes meines Integers (ein Sprungoffset) in der falschen Reihenfolge in den Speicher schreibt.
Das stumpfsinnige ist ...
a) ..., dass ich diese Funktion schon mal mit dem Tutorial geschrieben habe.
b) ..., dass es mit dem dem MinGW-Compiler funktioniert. Nur leider schafft der es nicht injectbare Dll's zu kompillieren.
Das Programm, was ich zum Testen benutze findet ihr im Anhang.
hier der Dll-Code:
PHP Code:
#include <windows.h>
#include <iostream>
//==========================>

unsigned int sprungoffset(unsigned int victim_addressunsigned int new_address)
{
    
victim_address += 5;
    return 
new_address victim_address;
}

void hook_function(unsigned int old_addressunsigned int new_address)
{
    
HANDLE hProc;
    
unsigned int sprungweg;
    
unsigned char sprung_byte 0xE9byte;
    
DWORD rw 0;
    
//=========================>
    
sprungweg sprungoffset(old_addressnew_address);
    
printf("sprungweg = 0x%x\n"sprungweg);
    
hProc OpenProcess(PROCESS_ALL_ACCESSfalseGetCurrentProcessId());
    
WriteProcessMemory(hProc, (LPVOID)old_address, &sprung_bytesizeof(sprung_byte), &rw);
    
old_address++; //um 1 Byte erhöhen
    
WriteProcessMemory(hProc, (LPVOID)old_address, &sprungwegsizeof(sprungweg), &rw); //Hier 
    //ist der Fehler
    
CloseHandle(hProc);
}

void good()
{
    
printf("good\n");
}

BOOL APIENTRY DllMainHMODULE hModuleDWORD  ul_reason_for_callLPVOID lpReserved)
{
    switch (
ul_reason_for_call)
    {
    case 
DLL_PROCESS_ATTACH:
        
hook_function((unsigned int)0x401318, (unsigned int)0x6c3a1530);
    case 
DLL_THREAD_ATTACH:
    case 
DLL_THREAD_DETACH:
    case 
DLL_PROCESS_DETACH:
        break;
    }
    return 
TRUE;

lg
PS: Hoffentlich ist das nicht son billiger Anfängerfehler. Ich habe mehr als 2 Stunden an dem Problem gesessen -.-
09/22/2010 19:51 ms​#2
Endianness - Wikipedia, the free encyclopedia

Der x86-Prozessor arbeitet im Little-Endian. Die Werte werden zwar in "falscher Reihenfolge" abgespeichert, aber das sollte eigentlich kein Problem darstellen.
09/22/2010 20:52 @night@#3
Danke für die schnelle Antwort. Allerdings wusste ich schon das der x86-prozessor die LittleEndian-Reihenfolge benutzt.
Hier ist mal ein Screen vom OllyDebugger:
[Only registered and activated users can see links. Click Here To Register...]
Eigentlich sollte der Sprungoffset 0x6bfa0213 betragen.
mfg @night@
09/22/2010 22:04 ms​#4
Da steht auch 0x6bfa0213, nur eben in Little-Endian. Außerdem jumpt er doch zu der richtigen Stelle oder nicht? In deinem Source-Code steht 0x6c3a1530 und in ollydbg auch.
09/23/2010 15:37 @night@#5
Oh. Ich habe erst jetzt bemerkt, dass die Addresse der Funktion good() anscheinend (ab und zu mal) dynamisch ist-.-. Es lag daran, dass der Sprungoffset einfach nie gestimmt hat.
Danke für deine Bemühungen:rolleyes: