《逆向工程核心原理》总结之入门介绍

       程序调试有静态调试和动态调试两种。静态调试是指将程序源代码编译成可执行程序之前,用手工或编译程序等方法对程序源代码进行测试,来查找和修正程序中的语法错误和逻辑错误。动态调试则是在可执行程序的运行过程中,来查找和修正程序中的语法错误和逻辑错误。随着系统安全与逆向工程的不断发展,程序调试已经成为信息安全爱好者所必备的一种技术。

​       汇编是将汇编代码编译、链接成可执行文件的过程。反汇编则是将可执行文件还原成汇编代码的过程。反汇编技术常常应用在逆向分析、软件破解、漏洞挖掘 等场景中,主要目的是逆向分析程序中的逻辑,然后改变程序的运行逻辑,达到更改程序执行的目的。

0x00:使用VS2017生成*.exe文件

创建Win32控制台程序

新建项目==》Visual C++中的Windows桌面==》Windows桌面向导;

Windows桌面项目对话框中选择:控制台应用程序,空项目;

解决方案资源管理器 的新建项目的源文件栏中添加xx.cpp文件,输入源代码,按F5编译运行后生成*.exe文件。

解决方案配置

选择 Reverse;根据情况选择 x86 或x64 ;

==============================================================================================

0x01:Ollydbg基础知识

1.0:汇编语言基础指令:

CALL xxxx 调用xxxx地址处的函数

JMP xxxx 跳转到xxxx地址处

PUSH xxxx 将xxxx压入栈

POP xxxx 将xxxx弹出栈

RETN 跳转到栈中保存的地址处,即CALL 指令的下一条指令处

 

1.1:运行界面

代码窗口:默认显示反汇编代码,还用于显示各种注释,标签,分析代码时显示循环,跳转位置等信息

寄存器窗口:实时显示CPU寄存器的值,可用于修改特定的寄存器;

数据窗口:以Hex/ASCII/Unicode值的形式显示进程的内存地址,也可以在此修改内存地址;

栈窗口:实时显示ESP寄存器指向的进程栈内存,并允许修改;

 

1.2:基本指令:

F2:在CPU窗口的反汇编窗口中,在选择的命令上设置断点[Breakpoint]

F7: 单步步入(step into);遇到子函数时跟进到子函数内部,并停在子函数的第一条命令上

F8:单步步过(step over);遇到子函数时直接运行完子函数

F9:运行;在遇到断点后可以单击F9继续运行程序

Ctrl+F2:重新载入调试程序;

Alt+F2:关闭调试程序;

空格键: 修改汇编代码。

Ctrl+B:二进制(十六进制)搜索;

Ctrl+E: 二进制(十六进制)编辑所选内容;

Ctrl+F9: 一直在函数代码内部运行,直到遇到RETN命令,跳出函数;

 

1.3:查找指定字符串与Windows API函数

查找字符串

​       在程序的界面出现一些字符串,学会使用OD来查找这些字符串,并利用这些字符串来帮助理解整个程序的程序逻辑。最终掌握了整个程序的逻辑之后,就可以利用OD来更改程序的逻辑,以达到想要的目的(功能破解、注册破解、打补丁、加入恶意代码等等)。

      ​ 在OD的CPU窗口,右键单击选择[查找] – [所有参考文本字串],在弹出来的参考窗口中可以清楚的看到这个程序的所有参考字符串。 通过双击参考窗口中的字符串(或者在指定的字符串处按回车键),即可以在CPU窗口中的反汇编处跟踪到相应字符串。这样的话整个程序的逻辑,就有了大致的了解。 在参考窗口中右键单击[查找文本],输入相应字符比如“sorry”(这里只进行模糊搜索,输入sorry即可,并且忽略大小写来进行搜索,若要精确搜索,则要输入更精确的字符串)。

查找Windows API

​       Windows API成千上万,不必通晓每一个,只要知道在逆向工程中用的比较多的。通常有文件访问、进程/线程有关、GUI图形用户界面、对话框、异常处理机制有关。

​       在CPU窗口中右键单击[查找]-[当前模块中的名称],就可以看到当前正在调试的程序所调用的API。在弹出来的[所有名称]窗口中,可以输入API函数名来查找特定API函数 。

1.4:断点设置

​       Ollydbg可以让程序中断在需要的地方,从而方便调试器对程序进行跟踪与分析。调试器对断点有记忆功能,可以在一次调试中设置断点,下一次可以让程序自动运行到上一次设置断点的位置中断下来。

常用的断点包括:INT3断点、条件断点、消息断点、内存断点、硬件断点等

INT3断点

       OD中最常用的断点类型,通过快捷键F2即可在相应代码处设置INT3型断点。INT3断点将代码的第一个字节,用一个特殊命令INT3(调试器陷阱标志,十六进制表示为0xCC)来替代。可以在反汇编窗口中选中要设断点的指令行并通过快捷键F2就可以设定一个此类型的断点。也可以在快捷菜单中设置其他快捷键。当再次按下F2键时,断点将被删除。注意,程序将在设断指令被执行之前中断下来。

      ​ INT3断点的设置数量是没有限制的。当关闭被调试程序或者调试器的时候,OD将自动把这些断点保存到硬盘中,最好不要在数据段或者指令的中间设置这种断点,如果在代码段以外设置断点,OD将会给出一个警告。可以在安全选项[Security options]中永远关闭这个提示,在某些情况下调试器会插入自带的临时INT3断点。

内存断点

      OD每一时刻只允许有一个内存断点。可以在反汇编窗口、CPU窗口、数据窗口中选择一部分内存,然后使用快捷菜单设置内存断点。设置内存断点:

step1:在CPU窗口相应代码行的反汇编列处右键单击[数据窗口中跟随][立即数]

step2:在数据窗口中跟随相应字符串,并选中相应字符串右键单击[断点]-[内存访问]

step3:不断单击F9

硬件断点 

       OD允许设置4个硬件断点。和内存断点不同,硬件断点并不会降低执行速度,但是最多只能覆盖四个字节。设置硬件断点:

step1:在CPU窗口中相应消息字符串代码处右键单击[断点][硬件执行]

step2:当OD已经运行至硬件断点,可以看到OD左下角的信息提示窗口提示“硬件断点1位于……

==============================================================================================

0x02:常用概念

EP(EntryPoint,入口点)

EP是Windows可执行文件(EXE,DLL,SYS等)的代码入口点,是执行应用程序时最先执行的代码的起始位置,它依赖于CPU。

《逆向工程核心原理》总结之入门介绍_第1张图片

《逆向工程核心原理》总结之入门介绍_第2张图片

《逆向工程核心原理》总结之入门介绍_第3张图片

打补丁(patch)

​ 对应用程序文件进程内存内容的更改。

举个栗子:用“打补丁”技术将 Hello World.exe 程序信息窗口显示的“Hello World!”字符串修改为其它字符串。

修改字符串的两种方法:

一:直接修改字符串缓冲区

​      修改MessageBoxW()函数的字符串参数 “Hello World !” ,在数据窗口的dump区按Ctrl+G执行Go To命令,输入参数所在内存地址找到 “Hello World !” ,选中待修改字符串,按Ctrl+E打开编辑窗口,用新字符串覆盖Unicode区域原有字符串。 保存时,选中待保存区域,鼠标右键==》复制到可执行文件==》选择右键,保存文件。

《逆向工程核心原理》总结之入门介绍_第4张图片

 

《逆向工程核心原理》总结之入门介绍_第5张图片

 

《逆向工程核心原理》总结之入门介绍_第6张图片

PS:由于保存时未保存标题区域,因此标题并不发生变化。

二:在其他内存区域生成新字符串并传递给信息函数

​      向MessageBoxW( )函数传递字符串参数时,传递的是字符串所在区域的首地址。如果改变字符串地址,信息框会显示变更后的字符串。在内存的某个区域新建一个长字符串,并把新字符串的首地址传递给MessageBoxW()。

 

待更新。。。

《逆向工程核心原理》源代码

你可能感兴趣的:(《逆向工程核心原理》总结之入门介绍)