4.下面我们开始实战演习
虽然这只是一个简单的用S-Demo做的动画,但是看完了下面的文章你还是会收获很多,不相信,我晕,把简单的事情做到极限就成功了,呵呵
(1).爆破
这个很简单就不多讲了,运行程序,随便输入密码,确定,提示:“password wrong”,
用ollydbg载入这个动画,查找程序用到的字符串,找到password wrong,下个断点,还记得前面的理论吗?
再向前找找就可以找到比较的关键地方了(条件跳转),好的,找到的地址是:0040203F
0040202A |. FFB6 A4000000 PUSH DWORD PTR DS:[ESI+A4] ; /s2
下个断点,看看到底压入了堆栈什么
00402030 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] ; |
00402033 |. 50 PUSH EAX ; |s1
00402034 |. FF15 E0234100 CALL DWORD PTR DS:[<&MSVCRT._stricmp>] ; \_stricmp //这里看到了什么,stricmp,难道这就是传说中的关键比较吗?
但是比较之后没有跳转啊,是吗?仔细看看,比较之后的结果放在那里,eax !
下面不是有一个je吗?
0040203A |. 83C4 20 ADD ESP,20 ;平衡堆栈
0040203D |. 85C0 TEST EAX,EAX ;测试返回值
0040203F |. 74 15 JE SHORT test.00402056
修改为jne,保存,运行,ok,搞定,请你再次回顾前面的流程图
(2).寻寻觅觅找密码
还记得前面的流程图吗?如果我们在程序比较的时候中断程序会有什么发现呢?呵呵,这个时候会看到真正的密码,重新用ollydbg载入这个动画,下断点00402034
为什么要在这里下断点?好问题,因为这里看到了call DWORD PTR DS:[<&MSVCRT._stricmp>],看看流程图,明白了吗,呵呵
这里我们在堆栈区域可以看到我们输入试炼码和真正的密码,为什么在堆栈区域,因为在windows下通过堆栈传递参数。请看上面的简单分析,破解补丁的编写
(3).文件补丁的编写(c语言简单实现)
前面我们把je改成了jne,随便输入密码都可以了,实质是把机器码由74h改成75h,因为机器码和汇编指令是一一对应的,那么我们只要写个小东西,修改就可以了。我已经写好了,很短,很好懂。Crack.c,我们分析一下
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp_out; //要写入的文件
printf("\n\t\t\t\t Copy Right by ngaut\n");
printf("Cracking......\n");
//打开文件test.exe
if ((fp_out = fopen("test.exe", "r+"))==NULL)
{
printf("error!!! Can not open test.exe!!!\n\n");
printf("Press any key to continue\n");
getchar();
exit(0);
}
//定位到要修改的地方,这里是 0x203f,为什么呢?下面给出回答
fseek(fp_out, 0x203f, SEEK_SET);
fputc(0x75, fp_out); //写入数据0x75,也就是把机器码74改为75,
//汇编则是 je 改为了jne
fclose(fp_out);
这里 0x203f = 0x0040203F – 0x00400000
(4).让程序自动弹出正确的密码
| 另类破解鸽子连接密码 | 03-21 | |
| 教菜鸟写注册机 | 12-27 | |
| QQ聊天记录察看器 5.2算法分析 | 12-04 | |
| 如何汉化一个软件 | 12-02 | |
| 扭曲变换加密 【目前防止软件被破 | 11-02 | |
| 破解利器Olldbg脚本教学(二)- | 11-01 | |
| 破解利器Olldbg脚本教学(二)- | 10-31 | |
| 破解利器Olldbg脚本教学(一)- | 10-30 | |
| 破解|利器|ollydbg|教学|Run tra | 10-28 | |
| 破解WebEasyMail v3.6.2.1 企业版 | 10-24 | |
| 破解利器OllyDBG入门系列(五)- | 10-18 | |
| 破解利器OllyDBG入门系列(四)- | 10-17 | |