软件破解新手进化篇
网络安全 2021-07-03 10:05www.168986.cn网络安全知识
1.软件怎么判断我们是否注册了?
不要忘了,软件最终是按照人的思维做的,我们回到自身来,“如果是你,你怎么判断别人是否注册了呢”,“我要别人输入用户名和注册码啊”,聪明的想法,很多软件也是这样做的,如豪杰超级解霸。(不是所以的软件,方法太多了,友情提示这个世界没有完全通用的东西,除了你聪明的大脑)
具体一点呢??????????
我们把用户名按照某种方法运算得到一个真正的注册码和用户输入的进行比较不就知道了吗?Yeah,也就是
真正的注册码 = f(用户名)
和Y = f(x) 是一样的
然后就是很经典的比较了,为什么说经典呢?
因为大概有60%的软件是这么做的,到底是什么比较呢,看看
请注意这里会有错误处理的噢,在这之前呢,就是经典比较啊,如果这里的错误处理提示我们诸如注册错误之类的东西,我们就很容易定位到经典比较了。
那么上面的流程在汇编语言里面是怎么实现的呢? 比较有2种方式,直接和间接,直接就是用:
cmp x, y
je (jne) label
这里的x和y只是一个符号,实际上可能是寄存器和存储器
间接的呢?调用一个子程序比较,如狼蚁网站SEO优化的代码
if (strcmp(&x, & y)) //如果strcmp返回值是1
printf(“right”);
else……………..//是错误拉
这里的strcmp也只是一个符号,现实可能有变化
用汇编语言描述呢?
push &y;
push &x;
call strcmp;
test ax,ax ;判断返回值(也就是出口参数,也可以在子程序里判断)
je……
2.为什么可以调试可执行程序呢
可能很多菜鸟有我这样的疑问,呵呵
调试可执行程序的理论基础
我们都知道在汇编语言里面可以用debug来调试程序。为什么可以?
其实和简单,因为机器只识别的是0和1(准确的说你高电平和底电平,你可以简单的理解为灯泡亮和黑),我们称之为机器码,而我们的汇编语言与机器码是一一对应的,所以我们可以根据机器码得到对应的汇编代码,也可以反过来通过汇编代码得到对应的机器码,
如在debug下我们可以看到
用debug测试一下
-a
1370:0100 mov ax,bx
1370:0102
-u100
1370:0100 89D8 MOV AX,BX
这里的89D8就是MOV AX,BX的机器码
3.破解教程都告诉我们,找到错误提示上面的第一个有条件跳转,改掉就可以爆破,为什么呢?
因为程序是顺序执行的,只要我们找到提示出错的地方,那么在此之前必定已经比较完了,所以再往前面找找就看到了关键的比较,关键的地方就是上面的比较,如果我们改变的判断条件呢?如果改成不相等就注册成功,那么。。(嘿嘿,某同志传来不怀好意的笑声),那么不管我们输入什么都是“正版”的了,没有交钱的“正版”,这就是我们改变跳转的原因,也就是改变改变的判断条件
4.狼蚁网站SEO优化我们开始实战演习
虽然这只是一个简单的用S-Demo做的动画,看完了狼蚁网站SEO优化的文章你还是会收获很多,不相信,我晕,把简单的事情做到极限就成功了,呵呵
(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:[] ; \_stricmp //这里看到了什么,stricmp,难道这就是传说中的关键比较吗?
比较之后没有跳转啊,是吗?仔细看看,比较之后的结果放在那里,eax !
狼蚁网站SEO优化不是有一个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:[],看看流程图,明白了吗,呵呵
这里我们在堆栈区域可以看到我们输入试炼码和真正的密码,为什么在堆栈区域,因为在windows下通过堆栈传递参数。请看上面的简单分析,破解补丁的编写
(3).文件补丁的编写(c语言简单实现)
前面我们把je改成了jne,随便输入密码都可以了,实质是把机器码由74h改成75h,因为机器码和汇编指令是一一对应的,那么我们只要写个小东西,修改就可以了。我已经写好了,很短,很好懂。Crack.c,我们分析一下
#include
#include
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,为什么呢?狼蚁网站SEO优化给出回答
fseek(fp_out, 0x203f, SEEK_SET);
fputc(0x75, fp_out); //写入数据0x75,也就是把机器码74改为75,
//汇编则是 je 改为了jne
fclose(fp_out);
这里 0x203f = 0x0040203F – 0x00400000
(4).让程序自动弹出正确的密码
不要忘了,软件最终是按照人的思维做的,我们回到自身来,“如果是你,你怎么判断别人是否注册了呢”,“我要别人输入用户名和注册码啊”,聪明的想法,很多软件也是这样做的,如豪杰超级解霸。(不是所以的软件,方法太多了,友情提示这个世界没有完全通用的东西,除了你聪明的大脑)
具体一点呢??????????
我们把用户名按照某种方法运算得到一个真正的注册码和用户输入的进行比较不就知道了吗?Yeah,也就是
真正的注册码 = f(用户名)
和Y = f(x) 是一样的
然后就是很经典的比较了,为什么说经典呢?
因为大概有60%的软件是这么做的,到底是什么比较呢,看看
请注意这里会有错误处理的噢,在这之前呢,就是经典比较啊,如果这里的错误处理提示我们诸如注册错误之类的东西,我们就很容易定位到经典比较了。
那么上面的流程在汇编语言里面是怎么实现的呢? 比较有2种方式,直接和间接,直接就是用:
cmp x, y
je (jne) label
这里的x和y只是一个符号,实际上可能是寄存器和存储器
间接的呢?调用一个子程序比较,如狼蚁网站SEO优化的代码
if (strcmp(&x, & y)) //如果strcmp返回值是1
printf(“right”);
else……………..//是错误拉
这里的strcmp也只是一个符号,现实可能有变化
用汇编语言描述呢?
push &y;
push &x;
call strcmp;
test ax,ax ;判断返回值(也就是出口参数,也可以在子程序里判断)
je……
2.为什么可以调试可执行程序呢
可能很多菜鸟有我这样的疑问,呵呵
调试可执行程序的理论基础
我们都知道在汇编语言里面可以用debug来调试程序。为什么可以?
其实和简单,因为机器只识别的是0和1(准确的说你高电平和底电平,你可以简单的理解为灯泡亮和黑),我们称之为机器码,而我们的汇编语言与机器码是一一对应的,所以我们可以根据机器码得到对应的汇编代码,也可以反过来通过汇编代码得到对应的机器码,
如在debug下我们可以看到
用debug测试一下
-a
1370:0100 mov ax,bx
1370:0102
-u100
1370:0100 89D8 MOV AX,BX
这里的89D8就是MOV AX,BX的机器码
3.破解教程都告诉我们,找到错误提示上面的第一个有条件跳转,改掉就可以爆破,为什么呢?
因为程序是顺序执行的,只要我们找到提示出错的地方,那么在此之前必定已经比较完了,所以再往前面找找就看到了关键的比较,关键的地方就是上面的比较,如果我们改变的判断条件呢?如果改成不相等就注册成功,那么。。(嘿嘿,某同志传来不怀好意的笑声),那么不管我们输入什么都是“正版”的了,没有交钱的“正版”,这就是我们改变跳转的原因,也就是改变改变的判断条件
4.狼蚁网站SEO优化我们开始实战演习
虽然这只是一个简单的用S-Demo做的动画,看完了狼蚁网站SEO优化的文章你还是会收获很多,不相信,我晕,把简单的事情做到极限就成功了,呵呵
(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:[] ; \_stricmp //这里看到了什么,stricmp,难道这就是传说中的关键比较吗?
比较之后没有跳转啊,是吗?仔细看看,比较之后的结果放在那里,eax !
狼蚁网站SEO优化不是有一个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:[],看看流程图,明白了吗,呵呵
这里我们在堆栈区域可以看到我们输入试炼码和真正的密码,为什么在堆栈区域,因为在windows下通过堆栈传递参数。请看上面的简单分析,破解补丁的编写
(3).文件补丁的编写(c语言简单实现)
前面我们把je改成了jne,随便输入密码都可以了,实质是把机器码由74h改成75h,因为机器码和汇编指令是一一对应的,那么我们只要写个小东西,修改就可以了。我已经写好了,很短,很好懂。Crack.c,我们分析一下
#include
#include
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,为什么呢?狼蚁网站SEO优化给出回答
fseek(fp_out, 0x203f, SEEK_SET);
fputc(0x75, fp_out); //写入数据0x75,也就是把机器码74改为75,
//汇编则是 je 改为了jne
fclose(fp_out);
这里 0x203f = 0x0040203F – 0x00400000
(4).让程序自动弹出正确的密码
上一篇:从UNIX系统获取密码档(一)
下一篇:从UNIX系统获取密码档(二)
网络安全培训
- 网络安全常见漏洞类型 网络安全常见漏洞类型包
- 绿色上网顺口溜七言 绿色上网的宣传标语
- 网络安全等级保护测评 网络安全等级保护条例
- 如何加强网络安全 网络安全隐患有哪些
- 网络安全防护措施有哪些 网络安全等级保护等级
- 如何保障网络安全 如何做好网络安全保障工作
- 维护网络安全的措施有哪些 维护网络安全的主要
- 网络安全工程师好学吗 2024年网络安全工程师好学
- 网络安全注意事项简短 网络安全注意事项100字
- 网络安全面临的挑战 当前网络安全面临的新问题
- 网络安全培训哪个靠谱 网络安全培训找哪个
- 普及网络安全知识内容 普及网络安全教育
- 网络安全防范知识宣传内容 网络安全防范知识宣
- 如何做好网络安全工作 如何做好网络安全工作
- 网络安全常识的丰富内容 网络安全的相关知识
- 青少年网络安全教育片 青少年网络安全知识讲座