2012-05-07 8 views

risposta

3

Se si ha familiarità con il montaggio, è possibile utilizzare il comando a per modificare l'assembly (ad esempio, ruotare gli opcode per "a = 25;" in tutti gli NOP). Questo è ciò che faccio di solito quando voglio uscire da NOP o modificare in altro modo un flusso di istruzioni.

Di tanto in tanto la gente si basano sul fatto che il codice di byte per l'istruzione NOP è 0x90 e utilizzare il e comando per modificare la memoria (per esempio "ew @eip 0x9090"). Questo è lo stesso risultato dell'utilizzo del comando a.

Infine, se si sta colpendo questa operazione raramente e vuole solo saltare manualmente le istruzioni è possibile utilizzare il "set di istruzioni corrente" operazione GUI:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff542851(v=vs.85).aspx

2

c'è un tutorial qui che spiega come eseguire questa operazione, è possibile impostare l'offset in modo che salti la riga: http://cfc.kizzx2.com/index.php/tutorial-using-windbg-to-bypass-specific-functions-windbg-kung-fu-series/ e impostare il registro eip su questo valore.

Inoltre, è possibile impostare il punto di interruzione e mettere il comando nel punto di interruzione di fare lo stesso: http://japrogbits.blogspot.co.uk/2010/01/using-breakpoints-to-skip-function-in.html e un altro blog: http://www.shcherbyna.com/?p=1234 e inoltre è possibile utilizzare il .call per ottenere lo stesso: http://blogs.msdn.com/b/oldnewthing/archive/2007/04/27/2292037.aspx

5

nuovo un molto tardi risposta, ma se scherzi con il montaggio non è preferibile
impostare un punto di interruzione condizionale per saltare l'esecuzione di una linea

nell'esempio qui sotto 401.034 è la linea non si vuole eseguire
quindi impostare un punto di interruzione condizionale su quella linea di saltare

bp 401034 "r eip = @$eip + size of current instruction";gc"
in questo caso gc = go da conditionl rompere

jmptest:\>dir /b 
jmptest.c 

jmptest:\>type jmptest.c 
#include <stdio.h> 
int func() 
{ 
    int a = 10 , b = 20; 
    a = 25; 
    b = 30; 
    return a+b; 
} 
int main (void) 
{ 
    int i , ret; 
    for (i= 0; i< 10; i++) 
    { 
     ret = func(); 
     printf("we want 40 we get %d\n",ret); 
    } 
    return 0; 
} 
jmptest:\>cl /nologo /Zi jmptest.c 
jmptest.c 

jmptest:\>dir /b *.exe 
jmptest.exe 

jmptest:\>cdb -c "uf func;q" jmptest.exe | grep 401 
00401020 55    push ebp 
00401021 8bec   mov  ebp,esp 
00401023 83ec08   sub  esp,8 
00401026 c745fc0a000000 mov  dword ptr [ebp-4],0Ah 
0040102d c745f814000000 mov  dword ptr [ebp-8],14h 
00401034 c745fc19000000 mov  dword ptr [ebp-4],19h 
0040103b c745f81e000000 mov  dword ptr [ebp-8],1Eh 
00401042 8b45fc   mov  eax,dword ptr [ebp-4] 
00401045 0345f8   add  eax,dword ptr [ebp-8] 
00401048 8be5   mov  esp,ebp 
0040104a 5d    pop  ebp 
0040104b c3    ret 

jmptest:\>cdb -c "bp 401034 \"r eip = 0x40103b;gc\";g;q " jmptest.exe | grep wan 
t 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 
we want 40 we get 40 

jmptest:\> 
Problemi correlati