Domanda:
IDA python, scrivi in ​​una posizione di memoria specifica
user22310
2017-11-21 00:24:35 UTC
view on stackexchange narkive permalink

Sto cercando un modo per modificare la posizione della memoria nello script Python IDA. Possiamo leggere la memoria con queste funzioni:

  Byte (indirizzo) Word (indirizzo) Dword (indirizzo)  

Quando provo a fare qualcosa del genere:

  Byte (address) = value  

IDA dice che non è valido da assegnare a una chiamata di funzione. Ho provato a utilizzare ctypes, tuttavia IDA dice sull'eccezione non gestita sulla riga:

  include ctypes  

Quindi come posso scrivere in una posizione di memoria specifica? Grazie.

Due risposte:
Megabeets
2017-11-21 18:20:20 UTC
view on stackexchange narkive permalink

Byte () , Word () e Dword () sono le funzioni di idapython e ogni tentativo di assegnare un valore a una chiamata di funzione in python finirà con "SyntaxError: can't assign to function call".

Queste 3 funzioni che hai menzionati sono usati per leggere il valore di un dato indirizzo, che sia un byte, una parola o una parola chiave. Non puoi usarli per impostare un valore per un indirizzo.


Patching

Per modificare una posizione di memoria è possibile utilizzare una delle seguenti funzioni:

Precedenti IDA 7.0:

  PatchByte (ea, value)  

Modifica il valore di un byte di programma
Se il debugger era attivo, la memoria del processo di debug verrà patchato anche

  PatchWord (ea, value)  

Cambia il valore di una parola del programma (2 byte)

  PatchDword (ea, value)  

Modifica il valore di una doppia parola

  PatchDbgByte (ea, value)  

Cambia un byte solo nella memoria del processo di debug

Nel caso tu voglia ottenere l'originale byte che esisteva prima di qualsiasi modifica, dovresti usare:

  GetOriginalByte (ea)  

Ottieni il valore originale del programma byte

IDA 7.0:

Da quando è arrivato IDA 7.0, idapython ha creato s Alcune modifiche che vale la pena menzionare.

I nomi delle funzioni sono cambiati in patch_byte () , patch_word () , patch_dword () , patch_dbg_byte () e get_original_byte () di conseguenza, ma, per ora, puoi ancora usare i vecchi nomi da " IDA 7.0 / Python /idc_bc695.py ", responsabile della compatibilità, contiene un wrapper per queste funzioni.

Inoltre, è stata aggiunta un'altra funzione:

  patch_qword (ea , valore)  

Modifica il valore di una parola quadrupla

Nota che PatchQword () non funzionerà per te poiché non esisteva nelle versioni precedenti quindi non c'è motivo di crearlo come wrapper per patch_qword () per compatibilità.


Codifica

L'applicazione di patch a un singolo byte è molto intuitiva:

  from idaapi import * address = 0x67643021 new_value = 0xCCPatchByte ( address, new_value)  

Questo modificherà il file IDB per impostare il valore di 0x67643021 su 0xCC . Ciò non influirà sul file originale. Nel caso in cui desideri modificare solo il valore dell'indirizzo nella memoria e non nel file IDB, dovresti usare PatchDbgByte () invece di PatchByte () .

Se vuoi che le tue modifiche abbiano effetto sul file originale dovrai farlo da solo in questo modo:

  address = 0x67643021 new_value = 0xCC # Apri il filef = open ("my_binary.exe", "rb +") # Cerca l'indirizzo che vuoi patchf.seek (address) # Scrivi il nuovo valore a questo addressf.write (new_value) # Chiudi il filef.close ()  

Puoi controllare fwrapper.py di Alexander Hanel e ida-patcher di Peter Kacherginsky per vedere alcuni esempi di codice che potresti trovare utili .

blabb
2017-11-21 05:03:17 UTC
view on stackexchange narkive permalink
  from idaapi import * from idautils import * print Byte (ScreenEA ()) PatchByte (ScreenEA (), 100) < --- questo applicherà il byte all'indirizzo corrente a 0x64print Byte (ScreenEA ())  


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...