废话不多说,我们直接步入正题。玩任何技术,都离不开工具,破解也不例外。下面我们先来认识下破解用到的工具--------OllyDBG,简称OD。大家自行下载软件。
打开OD后,进入主界面,在菜单栏中点击“文件”,选择”打开“,会弹出一个窗口,供我们寻找要破解的软件,找到之后,点击”打开“,就能把我们要破解的软件加载到OD中,接下来就是破解了。
在开始破解之前,先运行一遍我们要破解的软件,本贴中是CRECKME 0.exe(去我的网盘中下载)。打开exe文件后,我们看到一个界面,界面中有两个输入框,一个是NAME,需要我们输入用户名,另一个是SERIAL,需要我们输入序列号。我们先王这两个框中随意输入一些数据,比如NAME中输入”aaa“,SERIAL中输入”123“,点击确定后弹出一个窗口,上面写着”Name or Serial is too short“,这是一个提示语句,有提示语句就好办了。接下来我们回到OD主界面。
在OD主界面中我们可以看到有一个反汇编版面(就是现实一堆反汇编代码的地方),在反汇编中按下右击鼠标,选择”查找“下的”所有参考文本字串“,在参考文本字串界面中我们可以看到刚才出错对话框中的那句”Name or Serial is too short“,在那句话上点击左键,然后再单击右键,选择”反汇编窗口中跟随“,就会来到这个地方004015A0 . 56 push esi
004015A1 . 57 push edi
004015A2 . 6A 01 push 1
004015A4 . 8BF1 mov esi, ecx
004015A6 . E8 6B030000 call
004015AB . 8D7E 74 lea edi, dword ptr [esi 74]
004015AE . 8BCF mov ecx, edi
004015B0 . FF15 D0314000 call dword ptr [<&MFC71.#2902_ATL::CS>; MFC71.7C146AB0
004015B6 . 83F8 06 cmp eax, 6
004015B9 7D 1A jge short 004015D5
004015BB . 817E 78 A0860>cmp dword ptr [esi 78], 186A0
004015C2 7D 11 jge short 004015D5
004015C4 . 6A 00 push 0
004015C6 . 6A 00 push 0
004015C8 . 68 8C394000 push 0040398C ; ASCII "Name or Serial is too short!"
004015CD . E8 3E030000 call
004015D2 > 5F pop edi
004015D3 . 5E pop esi
004015D4 . C3 retn
004015D5 > 68 78394000 push 00403978 ; ASCII "IndolentAfternoon"
004015DA . 8BCF mov ecx, edi
004015DC . FF15 C0314000 call dword ptr [<&MFC71.#1482_ATL::CS>; MFC71.7C144DAE
004015E2 . 85C0 test eax, eax
004015E4 ^ 75 EC jnz short 004015D2
004015E6 . 817E 78 D7C75>cmp dword ptr [esi 78], 56C7D7
004015ED ^ 75 E3 jnz short 004015D2
004015EF . 6A 00 push 0
004015F1 . 6A 00 push 0
004015F3 . 68 44394000 push 00403944 ; ASCII "Congratulation! Correct Serial Num,do next one? "
004015F8 . E8 13030000 call
004015FD . 8B06 mov eax, dword ptr [esi]
004015FF . 5F pop edi
00401600 . 8BCE mov ecx, esi
00401602 . 5E pop esi
在上面反汇编代码中我们找到
004015C4 . 6A 00 push 0
004015C6 . 6A 00 push 0
004015C8 . 68 8C394000 push 0040398C ; ASCII "Name or Serial is too short!"
004015CD . E8 3E030000 call
很显然,这是调用MFC的MessageBox函数,当用户名或序列号长度太短时就调用这个函数显示一个对话框来提示我们。不过我们不怕,既然是破解者,就要把这个拦路虎给干掉。如何干掉?我们顺着这个函数往前看,很快我们就会看到两个跳转指令
004015B6 . 83F8 06 cmp eax, 6
004015B9 7D 1A jge short 004015D5
004015BB . 817E 78 A0860>cmp dword ptr [esi 78], 186A0
004015C2 7D 11 jge short 004015D5
这个我们可以猜的出来是检测用户名和密码长度的。由于这一课我们只学习爆破,不需要去了解它的用户名和密码是什么,那么只要修改这两个跳转就行。如何修改?我们在OD中的004015B9 7D 1A jge short 004015D5代码行左击数标,然后再右击鼠标,选择”汇编“,在弹出的对话框中吧”jge“改成”jmp“(无条件跳转,也就是不管我输入的用户名长度是多少,程序都跳转,不去执行那个弹出提示框的函数),点击”汇编“,这时代码就改成004015B9 7D 1A jmp short 004015D5,点击”取消“。接下来用同样的方法来修改004015C2 7D 11 jge short 004015D5,也是吧”jge“改成”jmp“,到这里为止,不论我们输入的用户名和序列号是多少,程序都不会再报 "Name or Serial is too short!"。
接下来就是如何让程序显示注册成功。我们可以再下面的代码中找到这么一段代码
004015D5 > 68 78394000 push 00403978 ; ASCII "IndolentAfternoon"
004015DA . 8BCF mov ecx, edi
004015DC . FF15 C0314000 call dword ptr [<&MFC71.#1482_ATL::CS>; MFC71.7C144DAE
004015E2 . 85C0 test eax, eax
004015E4 ^ 75 EC jnz short 004015D2
004015E6 . 817E 78 D7C75>cmp dword ptr [esi 78], 56C7D7
004015ED ^ 75 E3 jnz short 004015D2
004015EF . 6A 00 push 0
004015F1 . 6A 00 push 0
004015F3 . 68 44394000 push 00403944 ; ASCII "Congratulation! Correct Serial Num,do next one? "
004015F8 . E8 13030000 call
上面修改两个跳转指令后,无论我们输入的用户名和序列号是什么,程序都会跳到004015D5 > 68 78394000 push 00403978 ; ASCII "IndolentAfternoon"这个地方,顺着这往下看,我们看到这样一个函数
004015EF . 6A 00 push 0
004015F1 . 6A 00 push 0
004015F3 . 68 44394000 push 00403944 ; ASCII "Congratulation! Correct Serial Num,do next one? "
004015F8 . E8 13030000 call
这也是一个MessageBox函数,提示我们注册成功,而我们的目的也就是使得这个函数得以执行。如何让这个函数执行呢?我们顺着这个函数网上看,可以看到两个跳转指令
004015E4 ^ 75 EC jnz short 004015D2
004015E6 . 817E 78 D7C75>cmp dword ptr [esi 78], 56C7D7
004015ED ^ 75 E3 jnz short 004015D2
既然我们要让注册成功这个函数执行,那么就要废掉这两个跳转指令,如何废掉?我们按照上面的方法来处理。先是在004015E4 ^ 75 EC jnz short 004015D2
这行代码上左击鼠标,然后再右击鼠标,选择”汇编“,在弹出的对话框的编辑框中输入nop点击”汇编“,这时代码就变成
004015E4 90 nop
004015E5 90 nop
再点击”取消“。
用同样的方法处理004015ED ^ 75 E3 jnz short 004015D2这行代码。
这时MessageBox函数前面的代码就变成
004015E4 90 nop
004015E5 90 nop
004015E6 . 817E 78 D7C75>cmp dword ptr [esi 78], 56C7D7
004015ED 90 nop
004015EE 90 nop
004015EF . 6A 00 push 0
004015F1 . 6A 00 push 0
004015F3 . 68 44394000 push 00403944 ; ASCII "Congratulation! Correct Serial Num,do next one? "
004015F8 . E8 13030000 call
到此,我们的代码就改完了,接下来就是保存我们之前修改过的代码。在反汇编版面中右击鼠标,在”复制到可执行文件“一栏中选择”所有修改“,点击”全部复制“,我们会看到一个字体小一点的反汇编界面,在这个反汇编界面中右击鼠标,选择”保存文件“,输入我们破解后的文件名,点击保存即可。到此,我们的爆破也就完成了,运行我们破解后保存的可执行文件,在NAME和SERIAL编辑框中输入任意数据,他都会弹出一个序列号正确的对话框,说明我们成功把软件破解了。
下面来总结下我们爆破的过程:
1、先是运行我们要破解的软件(也就是CrackMe0.exe),在NAME和SERIAL中输入任意数据,点击确定,看是否有什么提示信息。
2、用OD加载要破解的软件,根据1中的提示信息,在OD中找到相关字串,并通过”反汇编跟随“跟随到字串所处的代码段。
3、从字串所处代码段附近查找,找到关键跳转指令后,将其修改,使其跳到我们想要的地方(上面的”jge“改为”jmp“部分)或是使其失效(上面的”jnz“改为”nop“),以便达到破解的目的。
4、破解之后,将破解的代码保存到可执行文件。
这样,一个简单的爆破就完成了,想学破解的同学,去试着玩玩吧