逆向一个软件
何为逆向?
公司最近在做WinXP的Wifi相关开发,谷歌、度娘皆无良方,无奈之下,想起了逆向一下猎豹、360Wifi,看看他们的思路(还好没加壳,不然更难)。闲话到此为止,什么是逆向?
众所周知,咱们用高级编程语言写的代码,会经过解释器和链接器转换成汇编代码,然后转换成机器语言让计算机来执行。所谓逆向,就是把编译好的程序反向还原,还原成执行的汇编语言,这个过程,就是逆向。
逆向很难么
有人一听,什么?汇编语言?!我不会汇编,是不是还得重新学习汇编语言。如果你想全部读懂整个程序的话,貌似还真得会汇编语言而且还得对寄存器、堆栈、内存地址等有所了解。一般PC上都是基于x86架构的汇编语言,所以如果有兴趣,可以学习一下x86汇编语言快速入门。
我对x86语言也不是非常精通,只是略知一二,但是这依然不影响我去摸清一个程序的思路。
举个一般逆向基础都会举的例子:
没错,就是---------密码验证(因为比较懒,就没有自己写这个程序,直接用的CSDN上的程序例子),我们的目标是?对,就是在不看源代码的情况下获取到用户名和序列号
程序界面既然想逆向就得先知道这个程序是干嘛的,也就是逆向的第一步:先了解程序的功能。你连程序的功能都不知道你逆向个蛋蛋。
既然让输入用户名和密码,那就输入呗,输入完了点击“登录”,如下图所示:
弹出一个对话框,既然这个程序是C++写的,那么说明程序里面肯定会用到MessageBoxA函数,那么这就是第二步:寻找特征点(函数)
打开OD,并且打开我们的程序,并打断点 BP MessageBoxA ----就是在MessageBoxA上打断点的意思。
MessageBoxA函数可以发现,MessageBoxA运行在76A2FD1E内存地址下,是将EDI寄存器进行自赋值(这条指令的添加主要是为了支持hotpatch,翻译过来好像是叫热修补,类似于Inline Hook,详情见注释),位于User32.dll模块中。当然,这些不是非常重要,重要的是看这个断点在程序运行时中断在哪里。回到CPU窗口,可以看到如下提示:
发现并没有什么卵用,这时候第三步,OD强大之处就体现出来了:在CPU窗口处,右键->分析->分析代码,会发现如下图所示:
这样就已经很明显了吧?如果用户名输入的是“15pb”,序列号就是“hackav”。
解除强大的破解软件,我们可以在不需要汇编语言的情况下来达到我们想要的目的。这个我们是借助特征函数来完成的,下一节我将介绍如何通过特征点来实现我们的目标。
注
编译器选项/hotpatch:
When /hotpatch is used in a compilation, the compiler ensures that first instruction of each function is at least two bytes, which is required for hot patching.
To complete the preparation for making an image hotpatchable, after you use /hotpatch to compile, you must use /FUNCTIONPADMIN to link. When you compile and link an image by using one invocation of cl.exe, /hotpatch implies /functionpadmin.
Because instructions are always two bytes or larger on the ARM architecture, and because x64 compilation is always treated as if /hotpatch has been specified, you don't have to specify /hotpatch when you compile for these targets; however, you must still link by using /functionpadmin to create hotpatchable images for them. The /hotpatch compiler option only affects x86 compilation.
大致含义:
当/hotpatch用于编译时,编译器会确保每个函数的第一条指令至少占两个字节,这是热修补的要求。
要使生成的映像文件可以热修补,除了使用/hotpatch来编译,你还必须使用/FUNCTIONPADMIN进行链接。当你使用cl.exe一次性完成编译和链接时,/hotpatch隐含了/FUNCTIONPADMIN。
因为ARM架构的指令至少占两个字节,而且x64编译总是视为/hotpatch已指定,所以当编译目标为这两种架构时不必指定/hotpatch参数;然而,你仍然必须使用/FUNCTIONPADMIN来为它们生成可以热修补的映像文件。/hotpatch编译器选项仅影响x86编译。
连接器选项/FUNCTIONPADMIN:
The amount of padding to add to the beginning of each function, 5, 6, or 16. x86 images require five bytes of padding, x64 images require 6 bytes, and images built for the Itanium Processor Family require 16 bytes of padding at the beginning of each function.
By default, the compiler will add the correct amount of space to the image, based on the machine type of the image.
In order for the linker to produce a hotpatchable image, the .obj files must have been compiled with /hotpatch (Create Hotpatchable Image).
When you compile and link an image with a single invocation of cl.exe, /hotpatch implies /functionpadmin.
机器译文:
要添加到每个函数开头的填充量,为 5、6 或 16字节。在每个函数的开头,x86 映像需要填充 5 个字节,x64 映像需要填充 6 个字节,为 Itanium 处理器系列生成的映像需要填充 16 个字节。
默认情况下,编译器根据映像的计算机类型将正确的空格数添加到映像中。
为了使链接器生成可热修补的映像,.obj 文件必须已使用 /hotpatch 进行编译。
使用 cl.exe 的单个调用来编译和链接映像时,/hotpatch 隐含表示 /functionpadmin。
MessageBoxA函数开头如下:
00000000 8BFF mov edi,edi;
00000002 55 push ebp;
00000003 8BEC mov ebp,esp;
可以看见mov edi,edi这个指令由00000000到00000002,正好满足了热修补的要求。