IDApython使用RPC通信批量处理模块信息

IDApython非常强大,但是每次执行一次IDApython只能输出一个模块的信息。如果想同时处理多个模块的信息,python的RPC服务通信机制可以作为一个不错的选择。

这里主要讲的是使用RPC通信需要注意的一些问题,防止逆向人员像我一样踩坑。

RPC通信具体实现代码可以参考:https://blog.csdn.net/weixin_30955617/article/details/95011695
PYTHON3的可以看这篇:https://www.jianshu.com/p/9987913cf734
在这里插入图片描述
主机使用服务端1010端口监听,idat64.exe使用1010端口向服务端查询必要的信息并获取返回数据。
但是实际运行通信时,相对于服务端的idat64.exe的外部地址的端口并不是固定的1010,而是一直变化的。如下图。
在这里插入图片描述
使用netstat -ano发现外部地址(idat64.exe)一直是变化的(图中第二栏),端口号最大是65535,如图,外部地址在端口号递增到65534后,直接又从1010开始继续随着通信递增端口号。

DEBUG

一、IDApython调试时容易出现的错误:
ConnectionRefusedError: [WinError 10061] 服务端没有开启(有时候不会报错,IDA直接卡死没反应

二、在IDA批处理部分模块时,RPC通信突然停止至某一模块的开始时刻不再继续,导致程序相当于暂停。但是单独跑一个模块时,发现IDApython并没有出现任何问题。
不管RPC已经通信多久,只要到达该模块,就一定会暂停通信。
经过一天的排查分析,发现是无界面程序idat64.exe中在调用输出模块导入表信息时,多加了一句print import_entry结构体。这行代码在一般的小模块中执行不会造成影响,但在导入表较多(350多个以上)的模块中稳定造成卡死。
所以批处理用到的idat64.exe的IDApython不要有print语句,而且还不能用中文注释。

三、python中的RPC通信,这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。有些参数在服务器端函数中传参时以字符串形式更好,整型和str等其他类型可能会出错。

info = searchheihei(1,'StorPortLogError','storport')
print info
ret = searchhaha('0','4104')                          
print ret

四、Windows命令行中最讨厌的就是有空格这种东西,使用Linux移植IDApython时一定要注意Wine命令中不要有空格。python路径中目录用\或者/都可以找到路径,但是在IDApython中只能用/左斜杠作为路径,否则的话找不到路径。

五、IDApython中print一个比较大的数组时,有可能会造成RPC通信阻断。所以IDApython最好不要有print。

猜你喜欢

转载自blog.csdn.net/qq_43312649/article/details/106857477