首页 >> 大全

逆向工程思路

2023-06-29 大全 59 作者:考证青年

说明:

RAX共64位----EAX是RAX的低32位----AX是EAX的低16位----而AH是AX的高8位,AL是AX的低8位;其他寄存器与EAX类似。

工程生产经理管理思路__逆向设计思路

4.1.3 OD断点

序号

断点名称

原理

适用范围

1

INT3断点

将下断处的指令改为INT3指令(CC),INT3会触发一个异常,OD捕获异常然后再将INT3修改回原指令

代码段(包括DLL的代码段)

2

硬件断点

将下断的指令地址存入DR0-DR3,CPU执行指令时会比较指令地址是否是DR0-DR3中的地址,如果是会主动给od发送异常

代码段

3

内存断点

将下断地址修改为不可读/写,当该地址被试图进行读/写时会触发异常

代码段、数据段

4

内存访问一次性断点

5

消息断点

一个消息的发送中包含句柄和消息编号两个参数

代码段

6

条件断点

当某个寄存器或堆栈段某处等于某值时中断

寄存器、堆栈段

7

条件记录断点

函数断点:

函数断点指对调用某个win32 api函数(比如.)的位置下断点,操作步骤是使用ctrl+n快捷键调出Names窗口里边即是程序所有从dll导入的函数。找到要下断点的函数(不支持搜索只能自己滚动查找,还算好的是按字母排序),然后在其上右键,点击“Set on every ”此时用户内存空间中所有call该函数(本质上是该函数的地址)的指令都会被设成int3断点。删除这些断点一样在函数上右键,选择“ all ”即可,当然由于本质是int3断点,所以也可以直接打开断点窗口进行管理。

4.1.4 od 绕过登录限制演示

在本文使用的示例程序中只有输入给定的用户名登录才能使用,我们这里想不管输入什么都能进入使用。这里就锁定我们的目标:逼近输入文字被获取并进行比较附近的代码。

获取文本框内容的函数是,ctrl+n呼出函数窗口,找到,右键选择“Set on every ”

工程生产经理管理思路__逆向设计思路

然后随便在窗口输入一些内容点击登录,比如我这里输“test”

工程生产经理管理思路__逆向设计思路

然后程序就断在了调用处

工程生产经理管理思路_逆向设计思路_

此时有很多call和jmp,比较代码是哪不是很明显,但比较代码一定在从这个到弹出错误窗口的这段范围内,我们一边按F8步过直到错误窗口弹出。最后看到如下

_工程生产经理管理思路_逆向设计思路

这样我们就锁定了比较代码应应该在和之间,不过由于函数调用并不是说比较代码就在这段连续的区间内

我们在处下断点,然后不断go to 往前走看是从哪跳到这边来的(或者也可以重新到一步步往后走,看是哪跳到这边来的),经过步步查看后定位到是的jnz跳过去的,可以猜测如果不跳那么就正常进入程序

工程生产经理管理思路_逆向设计思路_

在该条语句上右键,选择----“Fill wtih NOPs”

_逆向设计思路_工程生产经理管理思路

再次使用test登录,果真可进入程序主界面

_工程生产经理管理思路_逆向设计思路

4.2 IDA逼近目标代码

IDA经常被称为用于静态调试,所谓静态调试就是不能运行代码,解析大家都是可以的所以不能运行代码简单可以更解为ida比od少了指令对应程序表现、栈变化、寄存器变化这几项展现能力。

od使用各种窗口+断点逼近目标代码,ida使用同类窗口+交叉引用逼近目标代码。ida力图通过强化交叉引用能力来弥补断点缺失造成的能力损失,但毕竟交叉引用是断点的弱化版,所以动态调试效果应该来说会比静态调试好,至于还需要静态调试可能是比如病毒等不好动态调试正如老虎不宜随便放出笼来观察一样。

4.2.1 ida界面

_逆向设计思路_工程生产经理管理思路

1----导航带。整条就是-线性地址定间,点哪主视图窗口就显示哪。

2-----函数窗口。程序自己的函数列表,双击函数就可以去到其实义处。由于编译时不会保存原始函数名,所以如果没有源代码本程序的函数是列不出原始函数名的,只会用形式表示(表示其地址,注意这里说的是“如果没有源代码”,如果有源代码比如你打开的是vc项目debug文件夹下的exe他就能列出原始函数名);至于ida能识别出系统函数名也不是因为保存有原始函数名而是因为ida能把系统函数汇编代码与系统函数名对应上。另外注意这里只是用户自写的或静态链接入的系统函数,动态链接库的函数在窗口中。

3----反汇编窗口。和od的反汇编窗口类似,不过这里能显示非代码段部分。

4----其他窗口。包括十六进制窗口、导出窗口、导入窗口、结构体窗口、枚举窗口、字符串窗口、名称窗口、段窗口等,和od相比少了寄存器窗口和堆栈窗口其他基本都是一样。所有窗口都可以通过菜单----view----Open 来打开。

5---输出窗口。ida输出日志的窗口。

4.2.2 交叉引用

我们前面说过交叉引用里断点的弱化版,我们这里具体来看一下交叉引用长什么样。不过首先要再次说明动态调试也可以有交叉引用,只是动态调试本身可运行程序,没有很大必要去搞交叉引用而已。

引用----或者叫调用、使用,比如jmp、call等

交叉引用---既有正向从调用者地址跳转到被调用者地址的链接,也具有反向从被调用者地址跳转回调用者地址链接的引用。也叫交叉参考。

交叉引用又分为代码交叉引用和数据交叉引用,代码交叉引用指的是代码之间的调用与被调用,数据交叉引用指代码与数据间的调用与被调用,使用上其实没有什么区别都是双击交叉引用链接就跳转到其调用或被调用处。这里只介绍交叉引用的各成分,具体长什么样见下节演示。

交叉引用会被用“;CODE XREF: .text:↑j”的格式标出,各成分解析如下:

;----注释符号

CODE----表示是代码交叉引用,如果是DATA则表示数据交叉引用。

XREF----交叉引用(Cross )的缩写

.text----表示其引用处在代码段

----引用处的的地址,另外有可能会是_main+4等相对写法都一个意思

↑----表示引用地址在当前地址上方,相应的↓就表示在当前地址的下方

j----在代码交叉引用中可以是j或p;j表示跳转流jump,即jmp等跳转指令的引用,在高级语言即if;p表示调用流,即call指令的引用,在高级语言就是函数调用

在数据交叉引用中可以是r或w,r表示读引用,w表示写引用

4.2.3 ida绕过登录限制演示

假设我们使用和od一样的思路,从函数入手,首先说因为很多地方都可能调用所以确定哪个调用的指令才是登录处调用的的指令是困难的。其次还是由于无法运行我们得逐条指令分析才能知道哪里是弹出报错窗口。所以函数入手思路确定目标代码的起始地址和结束地址都是困难的。

报错时弹出了“好意思,和你不熟”语句我们不防从该句入手。首先菜单--------text查找该字符串,找到其在处,然后通过双击数据交叉引用,跳到到数据调用处。

工程生产经理管理思路__逆向设计思路

再次通过代码交叉引用跳转到,代码调用处。

工程生产经理管理思路__逆向设计思路

观察上下文,可以推断,只要该处不跳转即可进入程序主界面

逆向设计思路__工程生产经理管理思路

五、分析目标代码逻辑

分析目标代码关键是且只是自己知道怎么写代码。逆向学汇编建议直接学32位汇编,不用学16位汇编也不用学win 32位汇编(当然也可能我能力不足经验尚浅不解深意读者自己判断)。

虽然说实模式是老祖宗,16位汇编的道理到32位还是可用的,但32位汇编和16位汇编在寻址待方面指令写法毕竟有区别,折腾半天学了16位汇编看32位汇编不一定很顺,类似你掌握了c语言写也不一定很顺。逆向出来的都是32位汇编所以感觉可以直接学32位汇编。

另外关于win32汇编,win32汇编就是可调用 api可以使用.if等伪指令的32位汇编。但是一是 api汇编本就可以调用;二是汇编/反汇编的难点就在栈操作、条件判断跳转和循环,现在汇编使用./.if/.while等伪指令把push、jnz和loop等指令隐藏起来而汇编是容易了,反汇编却反汇编不出伪指令。所以我不能理解罗云彬说的“win32汇编是汇编的不二选择”是什么意思,反而觉得win32汇编在给反汇编增加难度帮倒忙,至少我照着《环境下32位汇编语言程序设计》写了个记事本并没有感觉能更好读懂32位汇编代码(不过理解VC倒确实是很有帮助)。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了