逆向基础知识
1.逆向分析Hello World程序
源码
#include <Windows.h>
#include <stdio.h>
int main(int aggc, TCHAR *argv[])
{
MessageBox(NULL,
L"Hello World!",
L"www.baidu.com",
MB_OK);
return 0;
}
2.查找main函数

调用main(int aggc, TCHAR *argv[])函数
main(int aggc, TCHAR *argv[])函数汇编
使用运行函数跳转到EntryPoint(系统调用的进入窗口),点击步进,逐步运行,知道弹窗,就可以查找到main函数



加入断点


(步进)进入可以发现传入了四个参数

快捷键使用
| 指令 | 快捷键 | 含义 |
|---|---|---|
| 跳转 | Ctrl+G | 移动到指定地址,用来查看看代码或内存,运行时不可用 |
| 运行 | F9 | 运行(若设置断点,则执行至断点处) |
| 转到上一个 | "_" | 显示上一个光标的位置 |
| 步进 | F7 | 进入函数内部 |
| 步过 | F8 | 跳过函数不进入 |
| 修改 | space | 修改汇编代码 |
| 断电 | F2 | 设置/取消 |
| 运行到返回 | Ctrl+F9 | 执行到ret处 |
| 注释 | ; | 添加注释 |
3.访问目标地址的4种方法
- 使用跳转命令(Ctrl+G)
- 比如跳转到地址003C1000


- 设置断点(F2)
- 使用F2设置和取消断点,点击断点界面显示已设置的断点,双击某个断点即可跳转到断点位置

- 注释(:)
- 按键盘的";"键可以在指定在地址处添加注释,点击注释窗口可以查找到


- 标签
- 按键盘“:”键可以找到已经设置的所有标签



3.快速查找指定代码的常用方法
代码执行法
有明确特征并且代码量不是很大的情况下推荐使用,例如我们需要查找的是main()函数中调用MessageBox()函数的戴拿
例如 执行到地址003911DF时弹出消息框,那么003911DF这个地址的CALL就是我们定位的一个标记进入内部查看,发现调用MessageBox函数,那么这个CALL就是main()函数


字符串检索法
假设我们知道一些显示特征,比如调用MessageBox函数,显示Hello World,我们可以使用右键->搜索/字符串(shift+D)查找到模块内所有字符串内容

API检索法(1)搜索跨模块调用API
前面的hello world.exe程序执行的时候,弹出消息框,我们可以推测可能调用了WIN32 API函数MessageBox
右键->搜索/当前模块/跨模块调用,双击即可切换到调用地址处




API检索法(2)在AP处设置断点
使用跳转指令(Ctrl+G)输入MessageBox然后设置断点之后返回调用

双击返回调用

调用代码,可以确定是我们查找的函数位置

4.使用打补丁方式修改Hello World字符串
修改字符串的两种方法
- 直接修改字符串缓冲区
- 在其他内存区域生成新字符串并传递给消息函数
1.直接修改字符串缓冲区




修改的内容不能超过原有内容,否则会损坏字符串后面的数据

保存更改到执行文件
选择补丁->修补文件

2.在其他内存区域生成新字符串并传递给消息函数
找一块未使用的NULL填充区,写入内容,然后把地址传递给消息函数

