IDA学习笔记1020.docx

上传人:b****1 文档编号:23000841 上传时间:2023-04-30 格式:DOCX 页数:15 大小:620.05KB
下载 相关 举报
IDA学习笔记1020.docx_第1页
第1页 / 共15页
IDA学习笔记1020.docx_第2页
第2页 / 共15页
IDA学习笔记1020.docx_第3页
第3页 / 共15页
IDA学习笔记1020.docx_第4页
第4页 / 共15页
IDA学习笔记1020.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

IDA学习笔记1020.docx

《IDA学习笔记1020.docx》由会员分享,可在线阅读,更多相关《IDA学习笔记1020.docx(15页珍藏版)》请在冰豆网上搜索。

IDA学习笔记1020.docx

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运行程序

第五次交锋:

不识别的函数

第六次交锋:

保存更改的的指令。

(未完成的战斗)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1