逆向工程,调试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;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

开始调试

用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”。
在这里插入图片描述

2.在其他内存区域新建字符串并传递给消息函数

更新中。。。。

文章来源: blog.csdn.net,作者:_ZXR_,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/bits_stdc/article/details/105978657

(完)