IDA Pro使用总结

使用总结

  1. C:将十六进制数据分析为代码;D键--当作数据进行分析;P键--将该段代码分析为函数。
  2. CTRL+S:打开段视图,可以选择某个数据段进行跳转。
  3. x:光标停留在某个函数、变量,按该键,可以查看交叉引用。
  4. n:重命名变量或函数。
  5. y:更改变量的类型。
  6. u:取消对函数、代码、数据的定义。
  7. 打开函数调用图:菜单栏中,view-->graphs-->Function calls(快捷键Ctrl+F12)。
  8. CTRL+F7运行至返回,直到遇到RETN(或断点)时才停止。
  9. Alt+K:修改栈指针。实在改不对就nop掉吧。
  10. CTRL+F5:导出反编译文件。

用户自定义函数调用约定

IDA支持用户自定义函数调用约定,这个功能在逆向go等非C或C++的程序时十分有用,因为go编译程序的函数调用约定并非我们常见的cdecl、stdcall、fastcall以及thiscall等函数调用约定,它们有自己设计的函数调用约定。所以,ida反编译时往往无法正常识别函数调用约定,如下图所示。

 图中第一个net_http___ServeMux__Handle函数对其重定义了函数调用约定,第二个net_http___ServeMux__Handle函数则没有重定义。

用户自定义函数调用约定的方法:在反编译窗口中,函数名处右键选择"set call type",然后在输入框中输入如“void (__usercall *)(int @<eax>, _BYTE* @<ebx>,int @<edi>, int@ <esi>)”的内容。

表示函数有四个参数:第一个参数通过eax寄存器传递,第二个参数通过ebx寄存器传递,第三个参数通过edi寄存器传递,第四个参数通过esi寄存器传递。

又如“int __usercall func@<ebx>(int x, int y@<esi>)”,表示函数有两个参数:第一个参数通过堆栈传递,第二个参数通过esi寄存器传递,返回值保存在ebx寄存器中。

 在重定义函数调用约定后,函数的参数列表成功识别出来。

 持续更新ing~~~~

一些疑问和想法

  1. idc脚本的使用--加密与解密P83。
  2. 如果函数中存在花指令或者一些故意破坏堆栈的指令,可以先patch掉后按p分析为函数。
  3. 在创建函数时,若无法确定函数结束位置或者发现非法指令,则会创建失败。alt+p创建一个函数,需要设定开头和结尾。如果还不行,就在编辑里创建一个新的segment。
  4. 导入自己设计的结构体或C库中的:View-->Open Subviews-->Local Types中可以看到本地已有的结构体,在该窗口中右击insert可以添加新的结构体。
  5. ida似乎无法同时调试父子进程(在子进程中使用ptrace(0,0,0,0)时),暂时没有深入研究。
  6. patch后的代码需要在Edit-->Patch Progam-->Apply patches to input file才能保存到原文件。
  7. 撤销patch,Edit-->Keypatch-->undo last patch。
  8. 如果打了很多次patch,不好分清该撤销哪一次的patch,那么可以在菜单栏中打开patched bytes界面。(view-->open subviews-->patched bytes)

参考

参考并推荐以下博文:

https://xz.aliyun.com/t/4205#toc-11
https://ckcat.github.io/2020/10/27/IDA%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/#%E5%BF%AB%E6%8D%B7%E9%94%AE
https://blog.csdn.net/xkdlzy/article/details/107786348
posted @ 2020-07-03 21:55  An2i  阅读(1240)  评论(0)    收藏  举报