去除简单的花指令
在main函数存在多个这样的花指令
永真跳转导致ida解析失败,只需要将jz、jnz那里nop掉即可

也就是红框框住的部分,将这五个字节的内容全部填充为nop(0x90)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import idc
start=0x4005BF end=0x401DA2
strlen=end-start
for index in range(strlen): curaddr=start+index tmpValue0=idc.get_wide_dword(curaddr) if(tmpValue0==0x01750374): print(curaddr) ida_bytes.patch_dword(curaddr,0x90909090) ida_bytes.patch_byte(curaddr+4,0x90) print("ok")
|
idapthon与smc

逻辑很简单,就是将一段长度为0x39的数据异或上一个固定的数值,动态调试的话也很容易,只是工作量有点大,使用idapython会很舒服。
思路就是根据相对距离读取数据进行patch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| start=0x140001000 end=0x140001460
strlen=end-start
for index in range(strlen): curaddr=start+index tmpValue=idc.get_wide_dword(curaddr) if(tmpValue==0x39FA8348): print(curaddr) xorData=idc.get_wide_byte(curaddr-4) print(xorData) for index1 in range(0x39): data=idc.get_wide_byte(curaddr+6+index1) ida_bytes.patch_byte(curaddr+6+index1,(xorData^data)) print("ok")
|
刚开始写反了几个小错误,这里着重记录一下.
获取数据:
1 2 3 4 5
| idc.get_wide_byte(address)
idc.get_wide_word(address)
idc.get_wide_dword(address)
|
patch:
1 2 3 4 5
| ida_bytes.patch_byte(address,data)
ida_bytes.patch_word(address,data)
……
|