Masm32 Simple Patch Problem

Hallo Hb User,
bin normal ein aktiver Leser und Sucher, nur für dieses Problem muss ich euch mal direkt fragen. Ich habe einen simplen Patch in Masm32 geschrieben, nur leider funktioniert er nicht so wie er es sollte. Habe auch schon seit zwei tagen nach dem Fehler gesucht.
Aber seht selbst:


Offset im Programm:
e1d90303d9.gif



Code:
.data
    TargetName        db            "Patchtest.exe", 0
    BackupName        db            "Patchtest.bak", 0
    PatchOffset        dd            103Bh
    Old                db            75h, 39h, 6Ah, 64h
    New                db            0EBh, 39h, 6Ah, 64h
...

.data?
    hInstance            HINSTANCE    ?
    hTarget            HINSTANCE    ?
    
    RBuffer            dd            ?
    BytesRead        db            ?
    BytesWritten        db            ?

.code
...
Patch proc hWnd:HWND
    invoke GetFileAttributes, ADDR TargetName
    .if    eax != FILE_ATTRIBUTE_NORMAL
        invoke SetFileAttributes, ADDR TargetName, FILE_ATTRIBUTE_NORMAL
    .endif
    
    invoke CreateFile, ADDR TargetName, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
    .if eax != INVALID_HANDLE_VALUE
        mov hTarget, eax
        
        invoke SendDlgItemMessage, hWnd, CBBackup, BM_GETCHECK, NULL, NULL
        .if eax == BST_CHECKED
            invoke CopyFile, ADDR TargetName, ADDR BackupName, TRUE
            invoke List, hWnd, ADDR s_Backup
        .endif
        
        invoke SetFilePointer, hTarget, PatchOffset, NULL, FILE_BEGIN
        invoke ReadFile, hTarget, ADDR RBuffer, 4, ADDR BytesRead, NULL
        .if BytesRead == 4
            mov eax, dword ptr [RBuffer]
            .if eax == dword ptr [Old]
                invoke SetFilePointer, hTarget, PatchOffset, NULL, FILE_BEGIN
                invoke WriteFile, hTarget, ADDR New, 1, ADDR BytesWritten, NULL
                .if BytesWritten == 1
                    invoke List, hWnd, ADDR Success
                .else
                    invoke List, hWnd, ADDR f_Write
                .endif
            .elseif eax == dword ptr [New]
                invoke List, hWnd, ADDR f_Already
            .else
                invoke List, hWnd, ADDR f_Version
                invoke MessageBox, hWnd, ADDR RBuffer, ADDR BytesWritten, MB_OK
            .endif
        .else
            invoke List, hWnd, ADDR f_Read
        .endif
    .else
        invoke List, hWnd, ADDR f_Open
    .endif
    invoke CloseHandle, hTarget
    Ret
Patch endp
Wär toll wenn ihr mir helfen könntet den Fehler zu finden.
Vielen Dank
 
Ich würde den Patch mit Olly debuggen und schauen woran es liegt (ob die richtigen Daten geladen werden). Ohne die Originaldatei ist es jedoch nicht möglich die Adressen zu überprüfen und weitere Hilfen zu geben.
 
Vielleicht gibt es auch mehrere Positionen auf die die Bytereihenfolge zutrifft?
Deswegen wäre eine genauere Defintion des Fehlers von großem Nutzen.
 
Danke schonmal für eure Bemühungen, leider konnte ich nur in Erfahrung bringen, dass der "RBuffer" nicht die richtigen Bytes nach dem Lesen beinhaltet.
Ich hoffe ihr könnt mir damit weiterhelfen, wenn ich euch die Sourcecodes und Programme gebe. Sie sind ein wenig gekürzt, haben aber immer noch die selben Offsets:

File-Upload.net - SimplePatch.rar

Danke
 
Lösung

Ich habe die Lösung nun doch noch endlich gefunden und poste sie, damit jemand mit dem selben Problem schneller eine Lösung finden kann.

Mein Code war vollkommen richtig, bis auf dem Offset. Den ermittelt man nämlich durch eine kleine Rechnung:

Code:
virtual address - imagebase - code base + pointer to rawdata for .text section or .code section
0x40103B - 0x400000 - 1000 + 400 = 0x43B
Also anstatt "103Bh" muss "43Bh" stehen.

Vielen Dank nochmal an mucki und ChiefWiggum für die Hilfe.

Euer Pro Grammer
 
Zurück
Oben