IDA学习笔记1020.docx
- 文档编号:23000841
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:15
- 大小:620.05KB
IDA学习笔记1020.docx
《IDA学习笔记1020.docx》由会员分享,可在线阅读,更多相关《IDA学习笔记1020.docx(15页珍藏版)》请在冰豆网上搜索。
IDA学习笔记1020
IDA学习笔记
【文章标题】:
IDA学习笔记
【文章作者】:
GoodGavin
【作者邮箱】:
gavin_soung@
【编写语言】:
Microsoft Visual C++ 6.0
【使用工具】:
IDA5.2,Hex-Rays.Decompiler.v1.0(IDA插件),OD,UltraEidt
【操作平台】:
Winxp
【时间】:
2009年10月
【作者说明】:
IDA据说是个好东西,功能也很强大。
但确实不易上手。
学习一下,顺便做点笔记。
从零开始吧!
希望大家指正。
(原来只要找,IDA的资料还是很多的,推广有效!
)
【详细过程】
用最简单的CM做实验。
首先帮助里说了:
IfyouarestartingtouseIDAfortheveryfirsttime,therearesomecommandsyouwillfindveryuseful:
-converttoinstruction(转换成指令):
thehotkeyis"C"
-converttodata(转换成数据):
thehotkeyis"D"
在IDAView-A窗口的指令或数据上按上述按键进行指令和数据的转换,算是学习的第一步。
第一次交锋:
根据OD的使用情况,查找字符串。
(快捷键:
shift+F12)。
IDA中的菜单命令位置如下图:
或者菜单上的按钮:
在String窗口中找到关键字符串:
双击,来到IDAView-A代码窗口:
这句:
data:
00403020aFaildb'fail!
',0;DATAXREF:
.text:
004016A6_o
双击后面的004016A6地址,来到使用fail数据的代码处(这样就是方便哦!
)
鼠标单击loc_4016A2:
标签,所有的都会高亮显示。
(这个功能verygood!
)
第二次交锋:
更改代码,爆破
有两处地方跳到了注册失败。
OK,改掉他就算爆破了!
可是怎么改了?
用OD,Ultraedit,WinHex都可以改。
但是强大的IDA不会没有这个功能吧?
不知道怎么办?
学习第一招:
查帮助或者手册(Help->HelpIndex),如果E文不好,看雪有中文版的。
更改指令的菜单位置为:
MainMenuBar->Edit->PatchProgram功能。
高兴啊!
结果发现我的IDA中没有这个子菜单。
无语。
学习第二招:
搜索引擎
XX搜索:
“IDA没有patchprogram菜单”,看到这篇:
原来要设置IDA的配置文件。
修改IDA的cfg目录下的idagui.cfg文件:
DISPLAY_PATCH_SUBMENU=NO
改为
DISPLAY_PATCH_SUBMENU=YES
更改配置文件之后,选中要更改的那行指令,然后选择MainMenuBar->Edit->PatchProgram->changebyte
弹出对话框:
把7415改为9090,这条指令是两个字节的,
通过如下方法可以在IDA中看到:
当然经过如下设置,可以和OD一样看到指令的机器码:
Options->general->number of opcode bytes 设定一个数(显示几个字节的机器码)
但是个人觉得,显示上之后没有原来的样子好看了。
(*^__^*)嘻嘻……
(这里有个功能,记忆之前改的数据,个人反而觉得不好用。
第二次敲90直接把第一次改的那串数据放进去了,这样还得把整行的数据都敲一遍。
)
如何保存更改后的程序?
据说File->Productfile->CreateEXEfile是这个功能,可惜:
帮助:
IDAproducesexecutablefilesonlyfor:
-MSDOS.exe
-MSDOS.com
-MSDOS.drv
-MSDOS.sys
-generalbinary
-IntelHexObjectFormat
-MOSTechnologyHexObjectFormat
Forotherfileformatspleasecreateadifferencefile.
难道PE文件不是generalbinary?
不明白。
File->Productfile->CreateDifffile有效。
生成的dif文件的内容如下:
ThisdifferencefileiscreatedbyTheInteractiveDisassembler
myEasyCM.exe
00001675:
7590
00001676:
2B90
0000168B:
7490
0000168C:
1590
直接用UltraEidt安照如上内容更改数据程序就告破。
但是IDA中为啥就找不到这个功能呢?
Baidu上没有找到解决的办法,到Google上用E文搜索:
发现相关的说法都是下面的意思(IDA只是对内存中数据的修改,没有写入硬盘。
如果需要更改请用HEXEditer。
)暂时先放弃用IDA更改了。
(留下个问题:
1是如何用IDA更改代码)
whenyouusethepatchfeatureduringadebugsessionitsimplypatches
theprocessesmemoryonlyandalsoonlythedatabasedisassembly,no
informationiswrittenbacktodisk,sowhenyourelaunchtheprocessthe
orignalbytesareonceagaininmemory.
Youreallyneedtoalsopatchtheexecutablewithahexeditor,atworse
perhapestheIDAwriteexemightwork.Ifyoudopatchwithahexeditor
youcanchoosefromtheidafilemenutosimplyreloadtheinputfile,ithink
this"shouldnt"destroyyourdatabaseandnotes.
DataRescueaimstheproductattheanalysismarketandthisisthesimple
reasonwhyfeaturessuchascodemodificationareactivelydevelopedupon.
/yates.
第三次交锋:
分析代码
IDA分析代码的能力很强。
现在知道的方法有:
1、IDA的TextView
2、IDA的Graphview
3、Hex-Rays.Decompiler插件的反编译功能,可以生成类C的代码,大大增加易读性
安装这个插件之后,光标定位在函数上,按F5,即会生成源代码。
其他的高级功能我不知道了,另外还有一个教程专门说的他的数据功能的,也学习一下,看看能有什么收获。
好了,MFC生成的代码不仔细看了(水平有限),只针对自己写个判断序列号的函数看一下。
比较比较。
看5种代码:
1、OD生成的汇编代码(字符串查找下断或者F12中断法都可以定位关键代码)
2、IDA生成的汇编代码(TextView)
IDA有两个有点,一是循环和跳转比较明确,用了不同的箭头表示(粗箭头表示的是循环);二是进行了代码的分析,生成了一些变量,如arg_4,这样可以便于分析。
3、IDA生成的图形代码(GraphView)
当光标定位在函数上时,和TextView-A通过右键菜单切换或者空格键切换。
流程看上去更直观。
4、IDA的Hex-Rays.Decompiler插件生成的类C语言源代码
对于一般人(习惯高级语言的),这个源代码要容易读懂。
当然对于习惯于看汇编代码的高手就另当别论了。
仅对于本程序而言,第一次看这样生成的代码有些别扭,有些地方不理解,和自己写的方式也有出入。
但如果了解了这种代码的特点,对理解代码应该是有帮助的。
这段代码里有些地方不明白:
(似乎好好看看编译原理会明白些)
一是*(_BYTE*)v3是什么意思?
应该是取a1[v3],但是对这句不理解。
二是strlen(a1)==1的时候就表示成功,为什么不是零?
更改*(_BYTE*)v3为a1[v3];strlen(a1)为strlen(a1)+1和原始的代码结果相同。
函数用如下方式调用。
sub_401590(serial,(name-serial))\\参看汇编代码,可以更清楚的理解为什么会这样
5、我自己写的代码(供参考)
第四次交锋:
用IDA运行程序
据说IDA动态调试程序的功能还不强大(不然OD就该下岗了)。
但他还是有动态调试功能的,尝试一下。
首先说明一下之前在IDAView-A窗口中更改的代码对调试状态的代码没有影响(最初尝试运行更改后的程序,希望可以看到效果,结果发现无效。
或许是我不会设置吧)。
需要在调试器运行的状态下更改代码(F1键说:
如果在调试器处于活动状态引用这条命令[patchprogram],IDA会修改内存和数据库。
如果数据库不包含修改的字节,那么进程内存将会被修改。
)
打开调试器窗口,运行代码。
这时候会有几个新窗口。
IDAView-EIP,IDAView-ESP,Thread等,在IDAView-EIP中找到关键跳,改掉。
单击sign(注册),输入任意用户名和序列号都提示成功了。
F2依然是下断点,依然可以查找字符串和函数,基本的调试还是没有问题的。
点击黑色的箭头窗口会显示相应的地址或堆栈的内容,当然选择EIP后的黑色箭头回到代码位置。
有个问题是如果我关闭了IDAView-EIP和IDAView-ESP窗口,不知道如何再次打开。
尝试Open->Viewsubviews->Disassembly,在不停止调试的状态下可以同样使用,但如果重新开始调试之后,再用如上方式打开IDAView-A,则无法显示代码。
在IDAView-EIP或ESP窗口右键更改synchronizewith选项,依然会导致下次不能正常运行,应该是运行设置的问题,但没找到设置的地方
第五次交锋:
不识别的函数
注册按钮单击后的代码如下,IDA没有认出这是一个函数,因此图形视图(GraphView)和F5反编译源码功能都不能用。
Align的作用是指令对齐,应该是伪指令。
.text:
004015DCalign10h
.text:
004015E0subesp,0C8h
………………………………………
.text:
00401672cmpecx,edx
.text:
00401674popebx
.text:
00401675jnzshortloc_4016A2;关键跳
.text:
00401677leaeax,[esp+0]
.text:
0040167Bleaecx,[esp+64h]
.text:
0040167Fpusheax
.text:
00401680pushecx
.text:
00401681callsub_401590;调用关键代码
.text:
00401686addesp,8
.text:
00401689testeax,eax
.text:
0040168Bjzshortloc_4016A2;关键跳
.text:
0040168Dpush0
.text:
0040168Fpush0
.text:
00401691pushoffsetaSuccess;"success!
"
.text:
00401696call?
AfxMessageBox@@YGHPBDII@Z
;AfxMessageBox(charconst*,uint,uint)
.text:
0040169Baddesp,0C8h
.text:
004016A1retn
.text:
004016A2;---------------------------------------------------------------------------
.text:
004016A2
.text:
004016A2loc_4016A2:
;CODEXREF:
.text:
00401675_j
.text:
004016A2;.text:
0040168B_j
.text:
004016A2push0
.text:
004016A4push0
.text:
004016A6pushoffsetaFail;"fail!
"
.text:
004016ABcall?
AfxMessageBox@@YGHPBDII@Z
;AfxMessageBox(charconst*,uint,uint)
.text:
004016B0addesp,0C8h
.text:
004016B6retn
.text:
004016B6;---------------------------------------------------------------------------
.text:
004016B7align10h
.text:
004016C0moveax,[ecx]
.text:
004016C2jmpdwordptr[eax+0D0h]
.text:
004016C2;---------------------------------------------------------------------------
.text:
004016C8align10h
.text:
004016D0
怎么办?
在这段代码的开始align10h指令的后的一条指令上点击右键->CreateFunction(快捷键P),OK,整段代码被IDA识别伪一个函数了。
如果不在开始的位置CreateFunction,会导致函数识别错误。
如下图:
Sp-analysisfailed(堆栈分析错误)——堆栈不平衡了
这个时候,GraphView和F5源代码都有了:
如果想恢复原来不识别这个函数的状态怎么办?
在函数开始的标签上(text:
004015E0sub_4015E0procnear)“右键->Undefine(快捷键u)”这时整段代码变为数据(未定义状态),提示:
Doyouwanttoundifinethecurrentfunction?
选Yes(确认)。
再“右键->Code(快捷键c)”,就恢复了。
第六次交锋:
保存更改的的指令。
(未完成的战斗)
说到爆破的时候,遇到更改代码,在IDA中没有找到找到相应的功能,据我查到的不完全资料,似乎需要其他工具予以辅助。
但同时,IDA生成的dif文件其实已经将所有的更改信息记录了下来,只要很简单的代码就可以实现保存更改程序的功能。
开始想正好可以尝试着写个简单插件,无奈水平很有限,最近也没有太多的时间和精力,就先那C++写个patch程序吧。
实践一下,至少算是先把思路记录下来。
读dif文件中的内容(在非调试状态下改动代码之后通过IDA的File->ProduceFile->CreateDIFFile生成);将程序相应的物理地址中的数据改掉(以二进制的方式打开程序并改写程序相应位置就OK了)
物理地址原始数据改后数据
00001675:
7590
00001676:
2B90
0000168B:
7490
0000168C:
1590
用API在IDA中定位关键代码
?
第一次交锋:
根据OD的使用情况,查找字符串。
第二次交锋:
更改代码,爆破
第三次交锋:
分析代码
第四次交锋:
用IDA运行程序
第五次交锋:
不识别的函数
第六次交锋:
保存更改的的指令。
(未完成的战斗)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IDA 学习 笔记 1020