参考 https://bbs.kanxue.com/thread-266419.htm
本文适用于初次使用IDA的小白(我本身也是小白),大佬请略过。
在我们开始修改结构体之前,首先为最初的IDB做一个快照是良好的习惯,这样可以帮助我们迅速还原某个时间点的IDB状态。比如我们改错了某个数据却没办法撤销IDB所作的修改。使用快捷键Ctrl+Shift+W唤起IDB快照窗口,为当前IDB快照起个名字后点击OK。
![](upload/attach/202103/784955_TG73FM5QZDBP4TM.jpg)
随意修改一处数据,我这里直接将WinMain函数内容的解析取消掉了。![](upload/attach/202103/784955_YK9KV7NX9JS3WFW.jpg)
使用快捷键Ctrl+Shift+T唤出IDB快照弹窗。
![](upload/attach/202103/784955_MUZJSUHFMZKK68C.jpg)
双击提示是否恢复IDB快照,我们点击YES还原IDB初始状态。
![](upload/attach/202103/784955_SY8YHZMQRXCTUDV.jpg)
可以看到IDB被还原。
![](upload/attach/202103/784955_KJSKN4Q3RT5NYCE.jpg)
我们在逆向的过程中为关键的判断或者指令设置标记可以方便我们迅速定位标记位置,防止我们回过头来找不到之前的关键点。选择Jump->Make position选项设置地址0x40162A处的指令作为标记,可以轻松回到当前指令位置。(快捷键Alt+M)
![](upload/attach/202103/N53DWURU628DPP3.jpg)
同样需要为标记点起个名字
![](upload/attach/202103/784955_7DMP4HWWY95FE77.jpg)
接下来随意移动到一处位置的IDB位置。
![](upload/attach/202103/784955_E44MAT4ZXJSJNKR.jpg)
可以选择Jmp->Jmp to make position选择要跳转的指令标记。也可以使用Ctrl+M快捷键。
![](upload/attach/202103/784955_2YF23B4XRE8JBZV.jpg)
双击回到标记点
![](upload/attach/202103/784955_Q2SFZ4AYUTH9P6H.jpg)
首先打开IDA,使用快捷键Shift+F1打开本地类型窗口。
![image.png](upload/attach/202103/784955_NYV6S36WKBDEHAU.jpg)
按下insert快捷键,弹出类型声明窗口,在该窗口的编辑区域以C语言语法定义结构体。
![image.png](upload/attach/202103/784955_KVCVW9NSZ6NG2Q6.jpg)
输入定义的结构体。
![image.png](upload/attach/202103/784955_ZKQAQGS6R9Q55GT.jpg)
Ctrl+F5搜索我们刚定义的结构体名,此时结构体还没有被导入到IDB中。
![image.png](upload/attach/202103/784955_X8PMXND8FFEMRFD.jpg)
双击我们想要导入的结构体,选择导入结构体。
![image.png](upload/attach/202103/784955_S73XND5Q4C987CB.jpg)
点击OK后IDA会自动解析我们定义的结构体。
![image.png](upload/attach/202103/784955_A3S6AUAS5QCAYBM.jpg)
再定义好结构体后我们往往还想在F5的伪C代码中定义结构体指针。我们以以下函数为例子,我们想把第一个参数定义成IPHeader的指针类型。
![image.png](upload/attach/202103/784955_ECMEYYSF2Y5T33V.jpg)
右键选择我们想定义结构体指针的参数->选择Conver to Struct *选项。可以看到弹出让我们选择想要转换城的结构体指针类型。
![image.png](upload/attach/202103/784955_M6BZUWTH2R97MTD.jpg)
搜索我们想要的结构体类型后点击OK。
![image.png](upload/attach/202103/784955_WFJXRC55ZWR3MFM.jpg)
可以看到结构体被解析成结构体指针。
![image.png](upload/attach/202103/784955_YHZVYXSMQ6HG5ZU.jpg)
定义一个结构体数组钱,首先要定义数组的结构体元素。我这里定义了3个大小为DWORD的成员,结构体整体大小为12字节。
![image.png](upload/attach/202103/784955_V8XNHAGCVMENKMG.jpg)
选择要定义结构体数组的首地址,按下快捷键ALT+Q,让结构体数组的第一个元素定义为结构体。
![image.png](upload/attach/202103/784955_RK995RB3864HPCQ.jpg)
按下快捷键shift+*定义数组,因为我们选中了MyStruct结构体,所以默认该结构体为数组元素。
![image.png](upload/attach/202103/784955_S2U4TWRY4XY9F2Q.jpg)
设置好数组元素个数点击OK即可。
![image.png](upload/attach/202103/784955_J3GJ68JE3FHKUJP.jpg)
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。