» 您尚未 登录   注册 | 社区服务 | 在线音乐 | 帮助 | 转贴工具 | 社区 | 无图版

五颜六色论坛 -> 电脑学校 -> 软件破解新手进化篇
 XML   RSS 2.0   WAP 

常州五颜六色网络技术有限公司 五颜六色网 五颜六色网-Flash欣赏 五颜六色-在线音乐
五颜六色网诚聘市场营销人员(全职) 本论坛QQ群8375513,欢迎加入

--> 本页主题: 软件破解新手进化篇 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
zhangandt




该用户目前不在线
级别: 蓝色
精华: 0
发帖: 6320
威望: 1 点
金钱: 9198 RMB
贡献值: 0 点
在线时间:178(小时)
注册时间:2008-07-23
最后登录:2008-10-15
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子


软件破解新手进化篇

1.软件怎么判断我们是否注册了? z <Nf m  
>7 ="8  
不要忘了,软件最终是按照人的思维做的,我们回到自身来,“如果是你,你怎么判断别人是否注册了呢”,“我要别人输入用户名和注册码啊”,聪明的想法,很多软件也是这样做的,如豪杰超级解霸。(但是不是所以的软件,方法太多了,友情提示:这个世界没有完全通用的东西,除了你聪明的大脑) c Vc-  
Hl,W=2N  
具体一点呢?????????? ?32&]iM oW  
我们把用户名按照某种方法运算得到一个真正的注册码和用户输入的进行比较不就知道了吗?Yeah,也就是 [@ .!~E)P  
真正的注册码 = f(用户名) ?{[ v+t#  
和Y = f(x) 是一样的 YuO.yh_  
然后就是很经典的比较了,为什么说经典呢? ,5h)x"s  
因为大概有60%的软件是这么做的,到底是什么比较呢,看看 XuFYYx~ ^3  
{N+$Q'  
请注意这里会有错误处理的噢,在这之前呢,就是经典比较啊,如果这里的错误处理提示我们诸如:注册错误之类的东西,我们就很容易定位到经典比较了。 p;>ec:z3M  
cPlZXf  
那么上面的流程在汇编语言里面是怎么实现的呢? 比较有2种方式,直接和间接,直接就是用: , K~}\CR  
  cmp x, y   MDn ua  
  je (jne) label ``hf= `We  
这里的x和y只是一个符号,实际上可能是寄存器和存储器 Hquc o  
间接的呢?调用一个子程序比较,如下面的代码 K  &N  
if (strcmp(&x, & y)) //如果strcmp返回值是1 , s"^kFl  
printf(“right”); H&-zZc4\  
else……………..//当然是错误拉 T4Pgbop  
这里的strcmp也只是一个符号,现实可能有变化 GjvOM y  
用汇编语言描述呢? *nkoPVpC  
push &y; <Z mg#  
push &x; gCB |DY  
call strcmp; Rl?_^dPx  
test ax,ax ;判断返回值(也就是出口参数,也可以在子程序里判断) u04kF^  
je…… 86=}ZGWd  
^ B fC  
2.为什么可以调试可执行程序呢 S%Uutj\/W  
- =)H{  
可能很多菜鸟有我这样的疑问,呵呵 8Fz#A.%P  
调试可执行程序的理论基础: ^BikV  
我们都知道在汇编语言里面可以用debug来调试程序。但是为什么可以? |\pj;XU  
其实和简单,因为机器只识别的是0和1(准确的说你高电平和底电平,你可以简单的理解为灯泡亮和黑),我们称之为机器码,而我们的汇编语言与机器码是一一对应的,所以我们可以根据机器码得到对应的汇编代码,也可以反过来通过汇编代码得到对应的机器码, yg<R=$n,Q  
如:在debug下我们可以看到 +V ;l6D  
用debug测试一下: FXG]LoP  
-a |"8b_Cq{  
1370:0100 mov ax,bx un mJbY;t  
1370:0102 '}53f2%gKa  
-u100   -A^_{4X  
1370:0100 89D8       MOV   AX,BX  dVtG/0  
这里的89D8就是MOV   AX,BX的机器码 /$Nsd  
u5`u>.!  
3.破解教程都告诉我们,找到错误提示上面的第一个有条件跳转,改掉就可以爆破,为什么呢? )4e.k$X^  
 ?Jm^<  
因为程序是顺序执行的,只要我们找到提示出错的地方,那么在此之前必定已经比较完了,所以再往前面找找就看到了关键的比较,关键的地方就是上面的比较,如果我们改变的判断条件呢?如果改成不相等就注册成功,那么。。(嘿嘿,某同志传来不怀好意的笑声),那么不管我们输入什么都是“正版”的了,没有交钱的“正版”,这就是我们改变跳转的原因,也就是改变改变的判断条件 MS~(D.@ZS  
t%0VJB,Q2  
4.下面我们开始实战演习 ? =Z?6fw  
Uiw2oi&_  
虽然这只是一个简单的用S-Demo做的动画,但是看完了下面的文章你还是会收获很多,不相信,我晕,把简单的事情做到极限就成功了,呵呵 t\dN DS  
w3ResQ   
(1).爆破 e'NJnPO  
这个很简单就不多讲了,运行程序,随便输入密码,确定,提示:“password wrong”, lgL%u K)  
用ollydbg载入这个动画,查找程序用到的字符串,找到password wrong,下个断点,还记得前面的理论吗? n:?a$Ldgm  
再向前找找就可以找到比较的关键地方了(条件跳转),好的,找到的地址是:0040203F PO: { t  
0040202A |. FFB6 A4000000 PUSH DWORD PTR DS:[ESI+A4]           ; /s2 Q->sV$^=T  
下个断点,看看到底压入了堆栈什么 y'q$ |  
00402030 |. 8D45 CC     LEA EAX,DWORD PTR SS:[EBP-34]         ; | 6@5+m 0`u3  
00402033 |. 50         PUSH EAX                       ; |s1 /{ g>nzP  
00402034 |. FF15 E0234100 CALL DWORD PTR DS:[<&MSVCRT._stricmp>]   ; \_stricmp   //这里看到了什么,stricmp,难道这就是传说中的关键比较吗? F v2-(  
但是比较之后没有跳转啊,是吗?仔细看看,比较之后的结果放在那里,eax ! Dw.J2>uj  
下面不是有一个je吗? 194)QeoFw  
0040203A |. 83C4 20     ADD ESP,20 ;平衡堆栈 <)H9V-5aZ  
0040203D |. 85C0       TEST EAX,EAX   ;测试返回值 p8O2Z? \  
0040203F |. 74 15       JE SHORT test.00402056 kVMg 1I@  
修改为jne,保存,运行,ok,搞定,请你再次回顾前面的流程图 `*R:gE=  
*i%.;Z"  
(2).寻寻觅觅找密码 [}=B8#Jl-C  
还记得前面的流程图吗?如果我们在程序比较的时候中断程序会有什么发现呢?呵呵,这个时候会看到真正的密码,重新用ollydbg载入这个动画,下断点00402034 UB@+c k  
为什么要在这里下断点?好问题,因为这里看到了call DWORD PTR DS:[<&MSVCRT._stricmp>],看看流程图,明白了吗,呵呵 FcU SE  
这里我们在堆栈区域可以看到我们输入试炼码和真正的密码,为什么在堆栈区域,因为在windows下通过堆栈传递参数。请看上面的简单分析,破解补丁的编写 ^6V[=!& H  
|/{=ww8|  
(3).文件补丁的编写(c语言简单实现) ;N0XFjdR  
前面我们把je改成了jne,随便输入密码都可以了,实质是把机器码由74h改成75h,因为机器码和汇编指令是一一对应的,那么我们只要写个小东西,修改就可以了。我已经写好了,很短,很好懂。Crack.c,我们分析一下 1>h]{%I  
#include <stdio.h> fIU#M]Xx  
#include <string.h> uy$e?{Jf  
int main(void) mz0X3  
{ bq*eH (qx  
FILE *fp_out; //要写入的文件 '\iCP1>+S  
printf("\n\t\t\t\t Copy Right by ngaut\n"); 2^ nxoye  
printf("Cracking......\n"); 1oGw4kD^x  
//打开文件test.exe fuySN!s  
if ((fp_out = fopen("test.exe", "r+"))==NULL) 3f{3Nz N  
{             64tvP^kp  
  printf("error!!! Can not open test.exe!!!\n\n"); F={a;Dvrn  
  printf("Press any key to continue\n"); Gyc]?m   
  getchar(); AoxA+.O  
  exit(0); VMWf>ZU  
} q(84+{>B  
//定位到要修改的地方,这里是 0x203f,为什么呢?下面给出回答 "4{r6[dn  
  fseek(fp_out, 0x203f, SEEK_SET); <R L]  
  fputc(0x75, fp_out);     //写入数据0x75,也就是把机器码74改为75, Ysv" 6b}  
//汇编则是 je 改为了jne 5=ryDrx   
  fclose(fp_out); PEZ!n.'S  
Cw&KVw*  
这里 0x203f = 0x0040203F – 0x00400000 )Pv%#P-<  
Y.p;1"  
(4).让程序自动弹出正确的密码 tKXI k9e  
)9]PMA?u  
本篇文章来源于 *基地 (www.*.com) 原文出处:http://www.*.com/Article/Text8/200808/11036.html

[楼 主] | Posted: 2008-09-08 09:53 顶端
a71705




该用户目前不在线
级别: 蓝色
精华: 0
发帖: 6108
威望: 1 点
金钱: 7225 RMB
贡献值: 0 点
在线时间:183(小时)
注册时间:2008-07-22
最后登录:2008-11-17
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子


看不懂
[1 楼] | Posted: 2008-09-08 11:56 顶端

五颜六色论坛 -> 电脑学校



[ 五颜六色网 ]
Copyright © 2003-2008 5y6s.net 苏ICP备05001866号 Powered by PHPWind 5.0.1
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
Total 0.043137(s) query 5, Gzip enabled