1.软件Software如何判断我们是否注册了?
不要忘了软件Software最终是按照人思维做我们回到自身来“如果是你你如何判断别人是否注册了呢”“我要别人输入用户名和注册码啊”聪明想法很多软件Software也是这样做如豪杰超级解霸(但是不是所以软件Software思路方法太多了友情提示:这个世界没有完全通用东西除了你聪明大脑)
具体点呢??????????
我们把用户名按照某种思路方法运算得到个真正注册码和用户输入进行比较不就知道了吗?Yeah也就是
真正注册码 = f(用户名)
和Y = f(x) 是样
然后就是很经典比较了为什么说经典呢?
大概有60%软件Software是这么做到底是什么比较呢看看
请注意这里会有处理噢在这的前呢就是经典比较啊如果这里处理提示我们诸如:注册的类东西我们就很容易定位到经典比较了
那么上面流程在汇编语言里面是如何实现呢? 比较有2种方式,直接和间接,直接就是用:
cmp x, y
je (jne) label
这里x和y只是个符号实际上可能是寄存器和存储器
间接呢?个子比较,如下面代码
(strcmp(&x, & y)) //如果strcmp返回值是1
prf(“right”);
……………..//当然是拉
这里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.破解教程都告诉我们找到提示上面第个有条件跳转改掉就可以爆破为什么呢?
是顺序执行只要我们找到提示出错地方那么在此的前必定已经比较完了所以再往前面找找就看到了关键比较关键地方就是上面比较如果我们改变判断条件呢?如果改成不相等就注册成功那么(嘿嘿某同志传来不怀好意笑声)那么不管我们输入什么都是“正版”了没有交钱“正版”这就是我们改变跳转原因也就是改变改变判断条件
=pediy>4.下面我们开始实战演习
=pediy>虽然这只是个简单用S-Demo做动画但是看完了下面文章你还是会收获很多不相信我晕把简单事情做到极限就成功了呵呵
=pediy>(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搞定请你再次回顾前面流程图
=pediy>(2).寻寻觅觅找密码
还记得前面流程图吗?如果我们在比较时候中断会有什么发现呢?呵呵这个时候会看到真正密码重新用ollydbg载入这个动画下断点00402034
为什么要在这里下断点?好问题这里看到了call DWORD PTR DS:[<&MSVCRT._stricmp>]看看流程图明白了吗呵呵
这里我们在堆栈区域可以看到我们输入试炼码和真正密码为什么在堆栈区域在windows下通过堆栈传递参数请看上面简单分析破解补丁编写
=pediy>(3).文件补丁编写(c语言简单实现)
前面我们把je改成了jne随便输入密码都可以了,实质是把机器码由74h改成75h机器码和汇编指令是对应那么我们只要写个小东西修改就可以了我已经写好了很短很好懂Crack.c我们分析下
# <stdio.h>
# <.h>
(void)
{
FILE *fp_out; //要写入文件
prf("\n\t\t\t\t Copy Right by ngaut\n");
prf("Cracking......\n");
//打开文件test.exe
((fp_out = fopen("test.exe", "r+"))NULL)
{
prf("error!!! Can not open test.exe!!!\n\n");
prf("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
=pediy>(4).让自动弹出正确密码
最新评论