利用OD暴力破解TRACEME.EXE

首先,我们来看一下今天要破解的这个EXE,画风是相当的老了。

traceme原样

traceme错误

接下来我们来练习Ollydbg调试器(之后简称OD)的使用,这是一个漫长的故事,最开始的时候采用了win7平台下的OD,但是当程序加载进od时,我们发现其地址的值都以77开头,这表明我们进入了系统的DLL,停留在了系统领域。同样的,网络上也存在有人在win7上od同一程序出来不同的地址值,在大佬指引之下, 我查阅到了关于win7的ASLR机制。

win7下od的traceme

ASLR的作用是把系统代码处在入口阶段的数据分散给内存,这样入口数据就处于不可预测位置。在这种情况下,即使是有恶意代码发动攻击,因为不了解入口数据位置,不能准确定位win7系统功能的所处位置,发动恶意攻击成功机率就会降低很多。有了ASLR技术支持,win7系统内存以及数据的储藏位置会不断发生变化。就算是今天win7系统被恶意代码攻击找到了储藏位置,在明天甚至是下一秒,因为储藏位置发生了改变,想要继续实施攻击就非常困难。 关于如何关闭win7的ASLR可以参考:吾爱破解

于是我果断换成xp,xp下载入的程序就比较的正常了。 xp下od该程序

之后就是按部就班的F8调试,进入第一次暂停,弹出TRACEME界面,记下断点之后我们随意向其中输入信息,会直接提示错误。重新载入后到达断点,然后F7跟进这个调用继续向下调试之后又会第二次出现程序界面,再次设置断点,并把之前的断点停止,然后重复之前的操作。emmmm然后我们很自然的就进入一个死循环了。

死循环的原因

消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:

struct tagMsg
{
       HWND    hwnd;       //接受该消息的窗口句柄
       UINT    message;    //消息常量标识符,也就是我们通常所说的消息号
       WPARAM  wParam;     //32位消息的特定附加信息,确切含义依赖于消息值
       LPARAM  lParam;     //32位消息的特定附加信息,确切含义依赖于消息值
       DWORD   time;       //消息创建时的时间
       POINT   pt;         //消息创建时的鼠标/光标在屏幕坐标系中的位置
}MSG;

更加具体的资料可以参考输入链接说明

//////////////////////////////////////////////

OD调试的重要步骤其实是根据不同程序的表现选择跟踪不同的系统函数。如本程序应该选择跟踪GetDlgItemTextA这个函数(该程序为ASCII码版本)。

int GetDlgItemText( HWND hDlg , int nID, LPTSTR lpStr, int nMaxCount) const;
int GetDlgItemText( int nID, CString& rString) const;
动态链接库:user32.dll
头文件:在Winuser.h中定义,需包含Windows.h文件
库文件:User32.lib
如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。
如果函数调用失败,返回值为 0 。

跟踪并下断点之后,我们跟入了输入的函数,因为我看到了我输入的用户名和序列号

输入

对应的寄存器的值

我们可以很清楚的看到寄存器的值EAX存放了序列号,EBX存放了用户名的长度,EDX存放了用户名,大致为这样的一个函数,传入了上述三个参数。而每个函数的返回值必然放于EAX中,对于test eax,eax必然是作为标志位判断,也就是说破解程序全靠下面两行了。

004011F3   .  85C0          test    eax, eax
004011F5      74 37         je      short 0040122E

之后我们强制修改标志位ZF,程序破解成功。

成功

同时我们可以用nop指令替换原有的跳转指令

004011F3   .  85C0          test    eax, eax
004011F5      90            nop
004011F6      90            nop

并将其生成位一个新的EXE,该EXE对所有输入都将成功通过。

好了孩子们,该睡觉了。

猜你喜欢

转载自my.oschina.net/u/3763247/blog/1787771