逆向工程,调试Hello,World ! 程序(更新中)
逆向分析法
静态分析法
是在不执行代码文件的情形下,对代码进行静态分析的一种方法。并不执行代码,而是观察代码文件的外部特征,获取文件的类型,大小,PE头信息,内部字符串,是否运行时解压缩等。
动态分析法
是在程序文件的执行过程中对代码进行动态分析的一种方法,它通过调试来分析代码流,获得内存的状态等。
虽然代码调试过程在代码逆向分析过程中占据很大比重,但它只是代码逆向分析的一个从属概念
调试hello world 程序
代码
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR * argv[])
{
MessageBox(NULL,"Hello World!","张轩瑞",MB_OK);
return 0;
}
开始调试
用OllyDbg调试工具打开程序
左上 代码窗口
- 默认用于显示反汇编代码,还用于显示各种注释、标签,分析代码时显示循环、跳转位置等信息。
右上 寄存器窗口
- 实时显示CPU寄存器的值,可用于修改特定的寄存器。
左下 数据窗口
- 以Hex/ASCII/Unicode值的形式显示进程的内存地址,也可在修改内存地址。
右下 栈窗口
- 实时显示ESP寄存器指向的进程栈内存,并修改。
OllyDbg 基本指令 (适用于代码窗口)
项目 | Value | 含义 |
---|---|---|
Restart | Ctrl+F2 | 重新开始调试 |
Step Into | F7 | 执行一句OP code (操作码),若遇到调用命令(CALL),将进入函数代码内部 |
Step Over | F8 | 执行一句OP code (操作码),若遇到调用命令(CALL),仅执行函数自身,不跟随进入 |
Execute till Return | Ctrl+F9 | 一直在函数代码内部运行,直到遇到RETN命令,跳出函数 |
设置断点的四种方法
1.goto 命令
执行Go to(Ctrl + G) 命令,打开一个“输入跟踪表达式”的对话框。
在文本框中输入“地址”。
光标自动定位到该地址处,执行F4命令,让调试流运到此处,然后从该处调试。
2.设置断点
可以设置BP(Break Point,断点) (快捷键F2)
设置断点后,运行到断点处就会暂停。
可以打开Breakpoints框(ATL+B)查看设置的断点。
双击某个断点会直接跳转到相应位置。
3.注释
按键盘上的“;”可以添加注释
同时也可以查找到他。
4.标签
我们也可以通过标签提供的功能在指定地址
比如在00401BF0中设置标签,main func
因为00401385处调用00401BF0的函数,所以就会显示,main func
标签和注释一样也可以检索
快速查找指定代码的四种方法
调试代码时,main()函数并不直接位于可执行文件的EP位置上,出现在此的是开发工具生成的启动函数。
(EP是windows可执行文件(EXE,DLL,SYS等)的代码入口点,是执行应用程序时最先执行的代码的起始位置,它依赖于CPU。)
1. 代码执行法
逐条执行指令来查找需要查找的位置。代码执行法仅使用于被调试的代码量不大、且程序功能明确的情况。
2.字符串检索法
直接查找字符串。
寻找所需要的字符串,然后双击。
3.在调试代码中设置断点
查找->所有模块间的调用
查看调用了那些函数
4.在API代码中设置断点
打开“所有模块中的名称”并敲下MessageBox,光标会直接定位。
使用“打补丁”方式修改“hello world!”字符串
修改字符的两种方法
1.直接修改缓冲区
我在搜索的时候,发现注释hello world的地方更改没有用。
找到主函数后,设置断点。
然后按F4,进行调试。
在右下方站窗口找到ASCII码“hello world”。
然后双击查看,进入数据窗口,去更改缓存区。
去更改,hello world 改成 hello rever
尽量不要用更长的字符串,覆盖原字符串,这样会使数据遭到破坏。
改完之后,去运行程序,之后就会弹出窗口。
我们发现以前的hello world 变成了 hello rever。
保存更改到可执行文件
上面的调试中,我们通过修改字符串缓冲区更改了程序显示的消息内容,但是这种更改只是暂时的,我们终止调试的时候。程序中的原字符串没有改变。如果想保存下来,就要把更改后的程序保存一个可执行文件。
- 在左下数据窗口中,选中更改后的字符串,点击鼠标右键,在弹出的菜单中选择“复制到可执行文件”,然后点击“备份”——>“保存到数据文件”然后输入文件名保存为exe文件。
当我们打开这个已经保存好的文件的时候,弹出的字符串变成了“hello rever”。