0%

idapython用法

去除简单的花指令

在main函数存在多个这样的花指令

永真跳转导致ida解析失败,只需要将jz、jnz那里nop掉即可

![](idapython用法/QQ截图20240301202407.png)

也就是红框框住的部分,将这五个字节的内容全部填充为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)
#没有找到更简洁的方法,参考wp是直接用的replace 没有找到那个api
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): #小端序 cmp rdx,39h
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)

……