03 脱壳示例
有些函数混淆后,F8步过call就会跑飞,因为执行流程没有返回到下一条指令,此时可以F7步入。如果大量重复的操作,可以用插件来完成。
x64dbg安装x64dbgpy插件后,在C:\Users\Hang\Downloads\x64dbgpy-37d3f5bb\x32\plugins\x64dbgpy\x64dbgpy\pluginsdk\_scriptapi目录中有源码,可以查询到各接口。
# -*- coding:utf-8 -*-
from x64dbgpy.pluginsdk._scriptapi import *
dwIatbase = 0x00475000 #iat表的首地址
dwIatCount = 0x48 #iat表中的个数
#循环取出iat表中的地址, 然后设为新eip,单步到ret
for i in range(0, dwIatCount+1):
#读取IAT表中的地址
dwAddr = ReadDword(dwIatbase + i*4)
if(dwAddr == 0):
continue
#以此地址为新eip
SetEIP(dwAddr)
#单步执行
while True:
StepIn()
# 判断是否是ret
if(ReadByte(GetEIP()) == 0xC3):
#从栈顶取出真正的API地址,存入IAT表中对应的位置
WriteDword(dwIatbase + i*4, ReadDword(GetESP()))
break