在逆向的过程中经常遇到一个问题,由于ASLR的原因,IDA中代码的基地址跟x64dbg等调试器中的对应不起来。一般情况下大家都会选择禁用掉ASLR或者修改IDA中的镜像基地址,但是这两种方式都缺点,禁用ASLR可能对dll没有用,改IDA中的基地址的话需要每次调试都要重新改一下。我一直比较纳闷IDA为什么没有直接加一个复制RVA和跳转到RVA的功能(但是却有个跳转到文件偏移的功能),网上找了一下也没有发现有啥插件能实现这个功能,没办法只能自己动手丰衣足食了,同时简单记录一下开发过程。
搭建开发环境比较简单,IDE选择的是VSCode+Python插件,想要VSC能识别到IDAPython的接口,需要在启动前先设置PYTHONPATH环境变量指向IDA目录下的“python\3”这个目录,然后就可以正常的开发IDAPython代码了,对IDAPython的模块也可以有代码提示。
然后是找IDAPython的API,这个官网上的文档非常粗糙,基本上就是把注释弄出来搞成了个文档,还不如直接看API的注释。后来发现了这个repo:,有一定的帮助,但是没有找到获取光标所在位置的地址的方法。后来想到中有用到这个功能,于是去翻了一下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def
patcher(
self
):
if
self
.kp_asm.arch
is
None
:
warning(
"ERROR: Keypatch cannot handle this architecture (unsupported by Keystone), quit!"
)
return
selection, addr_begin, addr_end
=
read_range_selection()
if
selection:
return
self
.fill_range()
address
=
get_screen_ea()
if
self
.opts
is
None
:
self
.load_configuration()
init_assembly
=
None
while
True
:
f
=
Keypatch_Patcher(
self
.kp_asm, address, assembly
=
init_assembly, opts
=
self
.opts)
ok
=
f.Execute()
|
这个get_screen_ea()
就是获取光标位置地址的方法。除此之外怎样在右键菜单中添加菜单项的代码也有了,基本上照着写就行。
完成后的基本功能有三个,可以在反汇编界面和F5界面直接右键复制当前位置的VA、RVA、x64dbg格式的RVA,也就是RVA开头加了个“:$”。
完整代码地址:,直接下载zip然后把XCopy.py放到IDA的plugins目录即可。
更多【使用IDAPython开发复制RVA的插件】相关视频教程:www.yxfzedu.com