/*403ED3*/ CMP CL,DL /*403ED5*/ JNZ SHORT superdic.00403EE5 /*403ED7*/ ADD ESI,2 /*403EDA*/ ADD EDI,2 /*403EDD*/ TEST AL,AL /*403EDF*/ JNZ SHORT superdic.00403EBD /*403EE1*/ XOR EAX,EAX /*403EE3*/ JMP SHORT superdic.00403EEA /*403EE5*/ SBB EAX,EAX /*403EE7*/ SBB EAX,-1 /*403EEA*/ XOR EDX,EDX /*403EEC*/ PUSH 476 /*403EF1*/ TEST EAX,EAX /*403EF3*/ SETE DL /*403EF6*/ MOV ECX,EBX /*403EF8*/ MOV DWORD PTR DS:[EBX+90],EDX 这段代码即是:BqwITTcm8kG5lcEk 与 l6345q789 的对比过程,如果相等就注册成功。 作者的大题思路就是这样吧,如果爆破的话只需要把 403EF1 处改为下面的代码即可。 /*403EF1*/ MOV DL,1 但分析到这里,爆破已经满足不了我的欲望了,再说离我的两个小 时还差的远呢。接着看看作者算法的思路吧。 既然我分析的思路已经清晰,我在这里再稍作整理:、设 CALL superdic.004034E0 函数=f1() CALL superdic.00403630 函数=f2() 如果 f1(申请号)=f2(注册码) 那么就注册成功。 看来 f2()函数是关键啊,需要写出它的逆函数,f7 进去一看,貌似还很长,如图 23: ![]()
仅仅图 23 的一页,还显示不完,我再次像骆驼一样的 f7 走来走去,再加上 ida 的 f5,
终于对段代码有了初步的了解。 最终我使用了一种巧妙的办法写出了这段代码的逆函数如下。 有点基础的朋友自己看代码吧。我也不好在这里占用太大篇幅去深析这个算法的逆向过程。 void DicDecode(char *str) { char end[64]={0}; if (strlen(str) !=16) *str=0; for(int i=0,j=0;i<16,j<64;i++,j=j+4) { if(str[i]<='9' && str[i]>='0') { end[j]=str[i]-22; goto LABEL_a; } if(str[j]<='z' && str[i]>='a') { end[j]=str[i]-61; goto LABEL_a; } if(str[i]<='Z' && str[i]>='A') { LABEL_a: ; } end[j]=str[i]-65; }
for(i=0;i<64;i=i+4)
{ if(end[i]<=i) { end[i]=i-end[i]; } } int v10[16]; for(int k=0,n=0;k<16,n<64;k++,n=n+4) { v10[k]=(int)end[n]; } for(i=0;i<16;i++) { if(v10[i] <= 25 && v10[i]>=0) { str[i]=v10[i]+ 65; goto LABEL_bb; } if(v10[i] <= 35 && v10[i]>=26) { str[i]=v10[i]+ 22; goto LABEL_bb; } if(v10[i] < 61 && v10[i]>=36) { } LABEL_bb: ; str[i]=v10[i]+ 61; } char sigeliu[5]={0x36,0x36,0x36,0x36,0}; strcat(str,sigeliu); } 总之最后累的跟骆驼似的终于还是凑出了这个半成品的注册机。如图 24: ![]()
该注册机的用法是在 00403D5B 处,看堆栈得到 f1(申请号)= BqwITTcm8kG5lcEk.
把这个值写入密文框内,点击解密就得到其注册码。这时看了看表大概用了 110 分钟,好险, 差点损失 15 块钱。 discuz!提示问题也是浮云,碰撞 V5 字典生成器破解完后,我开始酝酿写这个 discuz! 提示问题的碰撞程序。由于 php 的易 用性,我选择用它来写。说白了也就是个穷举的过程。代码如下: <? /*discuz 提示问题答案暴力破解程序。by kyo327*/ error_reporting(0); if ($argc<2) { print_r(' ------------------------------------------------------------------ Usage: php '.$argv[0].' hash Example: php '.$argv[0].' 91de8255 ------------------------------------------------------------------ '); die; } $fd=fopen("pass.dic",r); if(!$fd) { echo "error:打开字典文件错误" ; die; } |