全是干货,笔者在使用IDA的过程,总结了很多场景下的使用,以下内容来自笔者+互联网总结。有些文章我不记得从哪看了,但是感谢大佬的分享。



Python条件断点与hook功能

目的:使程序在 rand返回值是16949时断下来,其他情况继续执行。让python脚本帮我们做。



导入脚本:



def bp():
rax = idc.get_reg_value('rax')
return rax == 16949

设置普通断点,在call rand()之后设置(此时能获取rand()函数的返回值)



[右键] --> [Edit Break ···]

[Condition] --> [···]



输入bp(),并选择语言为Python



运行样本程序,发现rax == 16949(0x4235)时断了下来



适用的情况:当达到条件时触发断点,然后执行脚本中的功能,然后继续运行程序。

总归还是一个很有用的技巧





IDA-Fork双进程调试法

fork的子进程特点:

无法直接启动调试,只能附加。

进程存在时间短,很可能执行完逻辑后就退出,开没开始附加进程就没了。

目的,想调试下面fork子进程的代码:



思路:

1将子进程的第一条指令patch为死循环

2循环处下断点,重新打开IDA附加子进程,恢复第一条patch后的指令,调试

步骤:

1fork调用处设置断点,断下来后,对子进程进行patch。

观察到第一条指令只是log输出,没什么用处。所以可以对<span class="ne-text">BL __android_log_print</span>指令进行patch:



patch后:(一个死循环,自己跳自己)





2f9使程序运行起来,再主线程Detach掉(取消附加)

3 然后死循环处下断点,重新附加子进程( 此时子进程由于死循环的关系,会一直存在



4子进程会断在死循环处:



5 最后使用SetIP跳出死循环到需要调试的代码上,就可以与愉快的调试子进程了:







IDA编写脚本语法提示

日常逆向,肯定需要编写IDA脚本,在vscode进行编写,如果有提示,那就很方便了

vscode 安装插件 idacode

配置环境变量



然后就可以获得提示啦:







堆栈不平衡-报错修复技巧

// positive sp value has been detected, the output may be wrong!

打开IDA设置









设置为0,就OK了





IDA Trace功能











Trace 的粒度:



第一个是指令级别的trace,就是记录的是每条指令的指令。

第二个是基本块的trace,基本块的概念 ollvm 里面有,可以找下文档。

第三个是函数级别的trace,仅仅记录函数的调用。

运行然后卡在断点处时,这个选项就可以选了



我们停止调试,打开 trace 窗口看看,打开菜单项 [Debugger] → [Tracing] → [Tracing Window] 查看 Trace 记录:



将这些数据导出,可以直接右键 export trace to text file,以文本模式导出来,这样可以直接用 python 处理,比较方便。











标签: python脚本, 逆向工程, IDA Pro, 调试技巧, 条件断点

添加新评论