七、IDA逆向技巧(更新中)

7.1 IDA与OD的联合使用

一边使用OD下断点,找到关键代码位置,然后使用IDA静态看流程,需要注意的是IDA的需要与OD基地址对齐,这样才方便在IDA中查找代码位置,具体方式如下:

Edit --->  Segment ----- Rebase  Program  : 设置基地址;

在WINdbg中基地址在“符号”中查看;在OD中基地址在Model中查看;

IDA中G + 地址,即可找对对应位置;

IDA的逆向分析水平就是一个逆向工程师的水平;

 

7.2 数据不小心转换成为函数,如何处理?

如果不小心使用P将数据识别成了函数,可以使用D,转换成数据,再用C转换成为代码;

毕竟IDA不存在撤销功能;

 

7.3 IDA如何创建结构体?

7.3.1 结构体的创建   

IDA中结构体成员一般出现在:类初始化的地方(XX.dll);

根据成员的多少,我们创建结构体的大小,注意虚表vt占4个字节;一般有三个地方有助于我们创建结构体:初始化函数成员列表、memcpy函数的使用、数据库字段;

在初始化函数中看见最后一个成员为V1[239],可以 使用“Reset Point   Type” 可以改为:v1-> 1036,这样就能看到成员在的偏移,就可以设置结构体大小为1036 + 4.。

创建了结构体后,structure窗口中可以N改写字段的名称;

7.3.2 结构体的使用

创建好结构体后,我们就可以使用Y来修改分析的数据类型;

7.3.3 结构体的导入和导出使用

有时我们需要在一个数据库中创建结构体,在另外的一个数据库中使用,具体方法:

在数据库A的localtype视图中选中需要导出的数据类型,右键 --- “export to header”,如果是多个结构体写到同一个文件,请选择追加方式(Append),导出到一个.h文件;

接下来是导入到另外一个数据库,具体方法:

Ctrl + F9 :”选择一个C文件头去解析”,选择需要导入的一个文件,这样我们就会可以在LocalType中查看我们自建的结构体;

7.4 IDA如何创建虚表?

虚表的创建方式与结构体很类似,关键是要找到虚表的位置,需要使用 OD来进行跟踪,虚表的地址一般存在于EAX中,对应找过去就能知道是那个库里面的函数集合;

可以直接写一个虚函数的调用例子,使用IDA来分析;

7.5 IDA如何确定数据是数组类型?

Data区中被引用的地方一般是数组;

见:《如何提取DLL中的数据》

见:《如何访问DLL的函数》

7.6 IDA 如何使用UTF-8 显示中文字符

Alt + A 可以改变字符显示 格式,在DLL中所有的data区都是使用十六进制的数值显示的;

Alt + A : 设置---- “ASCII String style ”-----“set  default encoding”。

如果想要在Hex -rays的伪代码中显示出字符串,可以设置:“Edit”---plugins ---- Option----Analysis --- “Print only constant string literals”

 

7.7 IDA 的强大之处---- 交叉引用

X:一个地方引用另外一个地方;

体现:双击、X、subView-Cross ref

在IDA-View-A 模式下,Xrefs graph to :表示该函数被其他哪些函数调用的信息;Xrefs graph  from :函数调用其他函数的信息;

 

7.8 IDA 反编译失败1--- Decomplication failure

IDA经常会解析错误,我们要学会如何处理这些错误,才能得到伪代码;

可能原因1:函数约定的错误;

可能原因2:函数参数识别错误;

解决方法:分析函数的参数个数和调用约定,Y重新定义函数;

如果判断不出是哪种约定,可以D成数据,再用tab进行转成伪代码,可以看到反编译后成为了Jumpout(xxxxx),屏蔽了细节,这种方式,只是用来随便看看代码;

 

7.9 IDA 反编译失败2--- SP- analysis failed

使用IDA -- Options ---Disassembly ---Display disassenmly  Line Parts ---- Stack Pointer,勾上可以看到SP,正常情况下SP的值在函数头和尾都是0000 ,表示堆栈是平衡的;

如果函数识别错误,Alt + p: 可以指定函数的头尾;

 

7.10 IDA 反编译失败3--- Positive sp value has  been found

有些汇编指令无函数名,表示是虚函数,IDA很容易出错;

如: call  dword   ptr[eax + 4]

解决:ALT + K,设置SP当前为0x4X,这里X表示的是Call 之前有几个push。这样做能识别代码,能分析,但是会引起堆栈不平衡。

....

猜你喜欢

转载自blog.csdn.net/yuqian123455/article/details/82317425