安恒笔记-逆向工程(01基础介绍)

本文为安恒课程学习记录,绝大部分资料来自于安恒。

如何学习

基础:
C,C++,汇编,windows编程在这里插入图片描述
进阶:
工具使用,简单实战
在这里插入图片描述
实战:
软件破解,逆向分析
在这里插入图片描述

OllyDbg窗口介绍

寄存器窗口:
在这里插入图片描述
日志窗口:
L图标或View->Log,显示日志窗口,通过配置,可以显示OllyDbg启动时保存在日志窗口的不同类型信息,也涉及条件断点的信息。这个窗口最重要的选项就是可以保存到文件。如果我们想把信息保存为文本文件,点击右键选择Logtofile。

模块窗口:
E按钮View->Executables显示程序运行使用的模块:exe,,dll,,ocx和其它。

内存窗口:
M按钮或View->Memory显示我们的程序映射到内存的信息,一个内存块可能被分为几个部分。右键点击可以搜索不同种类的字符串,可以在访问上设置中断。

线程窗口:
T按钮或View->Threads显示程序的线程窗口。

句柄窗口:
H按钮或View->Handles,句柄窗口。

修改、调用栈窗、断点窗口:
P按钮或View->Patches,如果程序经过了修改,这里显示修改的信息,没有被修改过程序就为空白。
K按钮或View->Callstack显示调用堆栈的窗口信息,可以尝试反向跟踪函数的调用顺序。
B按钮或View->Breakpoints显示程序普通断点的列表窗口,这里不显示硬件断点和内存断点。

参考窗口、跟踪窗口:
R按钮或View->Reference参考窗口,显示我们在OllyDbg中搜索的结果。
“…”按钮或View->Runtrace显示RUNTRACE(RUN跟踪)命令的结果。这里我们也可以通过Logtofile保存输出结果到文件。

OllyDbg操作快捷键

单步步入(F7):
执行一行代码,遇到CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。
单步步过(F8):
执行一行代码,遇到CALL 等子程序不进入其代码。
运行(F9):
运行调试程序,直到遇到断点停止运行。当程序运行时,在OllyDbg 的右下角会显示单词Running。
暂停(F12):临时暂停程序。
终止(DEBUG-> CLOSE):终止程序。

函数调用约定

函数的调用约定
是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的。
它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出栈,(3)以及产生函数修饰名的方法

__cdecl:
cdecl调用约定又称为C调用约定,是c/c++语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作有调用者负责,返回值在eax中。由于由调用者清理栈,所以允许可变参数函数存在。

__stdcall:
stdcall很多时候被称为pascal调用约定。pascal语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在eax中。

__fastcall:
fastcall的调用方式运行相对快,因为它通过寄存器来传递参数。它使用ecx和edx传送两个双字或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在eax中。

在这里插入图片描述
__thiscall:
__thiscall是C++类成员函数缺省的调用约定,但它没有显示的声明形式。因为在C++类中,成员函数调用还有一个this指针参数,因此必须特殊处理
参数入栈:参数从右向左入栈
this指针入栈:如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入栈。
栈恢复:对参数个数不定的,调用者清理栈,否则函数自己清理栈。

参考资料:
带你玩转Visual Studio——调用约定__cdecl、__stdcall和__fastcall

OD设置断点

普通断点:
在命令窗口使用[BP addr]命令
在想要下断点的指令地址处按F2
双击汇编窗口想要下断点的指令行的十六进制区域

查看断点:
断点下好之后,对应的地址处回变红。
可以在断点窗口看到所有断点。

编辑断点:
在断点窗口中进行。选中断点,右击。
Remove(删除):从列表中删除断点。
Disable(禁止):禁用断点但并不将断点从列表中删除。禁用时,断点并不会触发。
Edit condition(编辑条件):给断点设置触发条件。
Follow in disassembler(反汇编窗口中跟随):在反汇编窗口中显示断点。
Disable all or enable all(全部禁止):禁用/启用列表中的全部断点。
Copy to Clipboard(复制到剪贴板):把选中断点的信息复制到剪贴板。

断点设置原理(普通断点)

当我们设置断点后,OD会将对应指令处第一个字节指令替换成CC(例如,EAX的值本应为0xC7C30174,但实际上却变成了0xC7C301CC)。但是为了不影响界面显示效果,OD会将CC显示为原字节。但是,我们可以在内存单元中读取出其真实的内容,并且可以在反调试中用此方法来检测断点。
在这里插入图片描述

OD设置API断点

API断点可以通过在命令窗口输入
BP API函数名 来进行设置
例如:BP MessageBoxA
此处必须指定API函数的确切名称,而且大小写敏感
BPX命令可以给引用或者调用了指定API函数的指令都下断点。例如:BPX MessageBoxA

特殊断点

1.内存访问断点:
这种类型的断点修改内存页的访问属性。当前我们设置了内存断点。任何代码访问(读,写或者执行代码)了该处代码的话,都会触发异常。

内存访问断点有两个缺点:
(1)它们不会出现[B]断点列表中和其他的地址。所以,你必须记得设置在什么地址处。
(2)不能同时设置多个内存断点。如果你设置了一个那么你之前设置的就会被自动删除。

删除内存断点:
可以数据窗口中单击鼠标右键选择-Breakpoint-Remove memory breakpoint。还可以设置一个新的内存断点,旧的内存断点会自动被删除。

“Memory,on access”是内存访问断点(读或者写),“Memory,on write”是内存写断点。OD也可以对区段设置内存断点,我们打开内存窗口,选择区段设置断点。

在同一个API函数中,如果通过bp命令设置断点会被程序检测而导致断点失效的话,也许设置内存访问断点可以绕过这个检测。设置内存访问断点这个方法也可以通过检测内存页的属性并恢复内存页的属性来进行保护,但是这在反调试技巧中并不常见。

2.硬件断点:
硬件断点(简称:HBP)是处理器的特性之一,设置硬件断点可以使程序中断下来。在OD中我们最多可以设置4个硬件断点。

硬件断点分为:硬件执行断点(ON EXECUTION),硬件写入断点(ON WRITE),硬件访问断点(ON ACCESS)3种。硬件执行断点与普通的CC断点作用一样,但硬件执行断点并不会将指令首字节修改为CC,所以更难检测。
可以通过命令:
HE 地址
例如:HE 401013来设置硬件执行断点

OD中有个特殊的窗口,通过它我们可以查看和管理硬件断点。我们选择菜单栏中的Debug-Hardware breakpoints就可以打开这个窗口。

在硬件断点窗口中,如果我们单击Follow按钮,反汇编窗口中该硬件断点所对应的那一行指令就会灰色高亮显示。如果我们单击Delete按钮,那么相应的硬件断点就会被清除。

如果我们重启OD,可以看到硬件断点依然存在。

硬件访问/写入断点是断在触发硬件断点的下一条指令处,跟内存断点不一样,内存断点会断在触发断点指令处。

3.条件断点:
条件断点实际上就是普通的CC断点,只不过该断点的触发需要满足设置的条件,如果满足设置的条件,那么程序就会中断下来,如果不满足条件的话,就和没有设置CC断点差不多。

单击鼠标右键选择-Breakpoint-Conditional,即可设置条件断点。
例如,如果你想当前EAX等于400000的时候,程序中断下来,那么条件应该写成:“EAX == 400000”。
在这里插入图片描述
设置了条件断点的语句地址显示的是粉红色。
我们在主菜单项中选择-Help-Contents。
在这里插入图片描述
选择超链接Breakpoints,紧接着选择超链接expression。
在这里插入图片描述
即可访问OD文档中对条件表达式的规定以及示例。

4.条件记录断点:
条件记录断点跟条件断点差不多,区别在于,我们可以通过设置该断点来记录下设置的条件的精确值。例如,我们给一个API函数设置条件记录断点,程序中有很多地方调用了这个API函数,通过该条件记录断点我们可以精确的记录程序中每处调用该API函数传递给它的内容。

在反汇编窗口中单击鼠标右键选择-Goto-Expression转到MessageBoxA函数的入口处。单击鼠标右键选择-Breakpoint-Conditional log即可设置条件记录断点。

既然我们不想程序中断下来,那么Condition(条件)编辑框这一栏我们就不填,Pause program(中断程序)这个单选按钮选着Never(不中断)即可。Expression(表达式)这个编辑框我们填写[ESP],我们知道在API函数的入口处,栈顶存放的是函数的返回地址。接着,Log value of expression(记录表达式的值)这个单选按钮我们选择Always(总是),即总是记录表达式的值,也就是[ESP]的值。Log function arguments(记录函数参数)这个单选按钮我们也选择Always(总是),即记录函数的参数个数/参数内容。
在这里插入图片描述
F9键运行程序。看日志窗口什么也没有记录,因为MessageBoxA并没有被调用。我们打开注册窗口,输入指定的用户名和序列号。
可以查看日志窗口,会记录函数调用的信息,只有满足了设置的条件才会断下来,否则是记录。

猜你喜欢

转载自blog.csdn.net/AlienEowynWan/article/details/114276151
今日推荐