2013-10-14 6 views
0

idautils 및/또는 idaapi를 사용하여 명령어의 Op 값을 변경하려고합니다. 예를 들어, 메모리에 바이너리 파일을 다운로드했으며 JMP ​​문의 JMP 주소를 변경하려고합니다 (점프가 어디인지 알고 명세서를 얻을 수 있음을 알고 있습니다). 나는 이런 식으로 뭔가하려고 노력 :ida API를 사용하여 명령어 수정

i = ida.idautils.DecodeInstruction(addr) 
op = i.Op1 
op.addr = new_addr 
i.Op1.assign(op) 
print i.Op1.addr 

을하지만 주소가 변경되지 않습니다. 내가 할 대신하는 경우 :

i = ida.idautils.DecodeInstruction(addr) 
op = idaapi.op_t() 
op.addr = new_addr 
i.Op1.assign(op) 
print i.Op1.addr 

그것은 내가 바이트 볼 때 작동하지만, (사용 [범위 (0 난에 대한 idaapi.get_bytes (ADDR + i)를, i.size를)), 그들이 변경되지 않았습니다. 그 주소를 변경하고 바이트를 읽을 때도이 변경 사항을 확인하고 싶습니다.

답변

0

PatchByte (또는 idaapi.patch_byte)을 사용해보세요. 그런 다음 idaapi.get_byte으로 올바른 값을 확인해야합니다. 단어, dwords 및 심지어 가변 길이 버퍼에 대해서도 동일한 패치 기능이 있습니다.

(변경하려는 명령의 정확한 바이트 인코딩을 알아야합니다.)