【文章标题】: 密码监听器v2.5算法分析
【文章作者】: frozenrain
【作者邮箱】: frozenrain15061986@yahoo.com.cn
【作者主页】: blog.sina.com.cn/lengyu1986
【作者QQ号】: 403121809
【软件名称】: 密码监听器v2.5
【软件大小】: 450K
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VC++
【使用工具】: PEiDv0.94,OllyDbg1.1,W32Dsm8.93
【操作平台】: WINXP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
学破解才半个月,分析的不是很清楚。在学校图书馆找了2本汇编书看了看,就在网上找了个东西,以前用过还可以。不过没注册。总的来说算法很简单,给新手看看,高手飘过。我也是新手。 呵呵!!
现在可以用注册的拉 哈哈!现在有3.0的不敢去动他 只好先拿个2.5的练下手感。
先拿PEiD查无壳,这好办 VC++写的。W32Dasm反汇编,查找字符串。发现“您注册成功”,“注册失败”没发现什么可用信息。OD载入,发现有个比较的函数,断下试试。若断不下断MessageBox。0040BA65 断下了。 继续往下看。经过多次测试,得到如下信息:
0040BA59 . 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
0040BA5C . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
0040BA5F . 50 PUSH EAX
0040BA60 . 68 15040000 PUSH 415
0040BA65 . C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
0040BA69 . E8 2C200000 CALL <JMP.&MFC42.#3097> ; 取用户名长度
0040BA6E . 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
0040BA71 . 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
0040BA74 . 50 PUSH EAX
0040BA75 . 68 16040000 PUSH 416
0040BA7A . E8 1B200000 CALL <JMP.&MFC42.#3097> ; 取注册码长度
0040BA7F . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
0040BA82 . E8 711C0000 CALL <JMP.&MFC42.#6282>
0040BA87 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
0040BA8A . E8 631C0000 CALL <JMP.&MFC42.#6283>
0040BA8F . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BA92 . E8 611C0000 CALL <JMP.&MFC42.#6282>
0040BA97 . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BA9A . E8 531C0000 CALL <JMP.&MFC42.#6283>
0040BA9F . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
0040BAA2 . 3978 F8 CMP DWORD PTR DS:[EAX-8],EDI ; 用户名为空就挂
0040BAA5 . 0F84 F6020000 JE pswmonit.0040BDA1 ; 等于就挂了
0040BAAB . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0040BAAE . 3978 F8 CMP DWORD PTR DS:[EAX-8],EDI ; 注册码空就挂
0040BAB1 . 0F84 EA020000 JE pswmonit.0040BDA1
0040BAB7 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
0040BABA . E8 1D1D0000 CALL <JMP.&MFC42.#4202> ; 用户名为大写字母则转化为小写,
0040BABF . A1 00704100 MOV EAX,DWORD PTR DS:[417000]
0040BAC4 . 33F6 XOR ESI,ESI
0040BAC6 . 3BC7 CMP EAX,EDI
0040BAC8 . 7E 3F JLE SHORT pswmonit.0040BB09
0040BACA > 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
0040BACD . 56 PUSH ESI
0040BACE . 50 PUSH EAX
0040BACF . B9 F86F4100 MOV ECX,pswmonit.00416FF8
0040BAD4 . E8 CA9DFFFF CALL pswmonit.004058A3
0040BAD9 . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0040BADC . C645 FC 02 MOV BYTE PTR SS:[EBP-4],2
0040BAE0 . E8 F71C0000 CALL <JMP.&MFC42.#4202> ; 返回固定字符串(系统注释)
0040BAE5 . FF75 EC PUSH DWORD PTR SS:[EBP-14]
0040BAE8 . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0040BAEB . E8 F61B0000 CALL <JMP.&MFC42.#2764> ; EAX为FFFFFFFF
0040BAF0 . 85C0 TEST EAX,EAX
0040BAF2 . 7D 6A JGE SHORT pswmonit.0040BB5E
0040BAF4 . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0040BAF7 . C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
0040BAFB . E8 801B0000 CALL <JMP.&MFC42.#800> ; EAX清零
0040BB00 . 46 INC ESI
0040BB01 . 3B35 00704100 CMP ESI,DWORD PTR DS:[417000]
0040BB07 ^7C C1 JL SHORT pswmonit.0040BACA
0040BB09 > 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
0040BB0C . 6A 01 PUSH 1
0040BB0E . 50 PUSH EAX
0040BB0F . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BB12 . E8 111C0000 CALL <JMP.&MFC42.#4129>
0040BB17 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040BB19 . 8B35 AC044100 MOV ESI,DWORD PTR DS:[<&MSVCRT._mbscmp>] ; msvcrt._mbscmp
0040BB1F . BB 60524100 MOV EBX,pswmonit.00415260
0040BB24 . C645 FC 03 MOV BYTE PTR SS:[EBP-4],3
0040BB28 . 53 PUSH EBX ; /s2 => "0"
0040BB29 . 50 PUSH EAX ; |s1 (若s1=0则挂了)
0040BB2A . FFD6 CALL ESI ; \_mbscmp
0040BB2C . 59 POP ECX
0040BB2D . 85C0 TEST EAX,EAX
0040BB2F . 59 POP ECX
0040BB30 . 74 4E JE SHORT pswmonit.0040BB80 ; 等于就跳了
0040BB32 . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
0040BB35 . 6A 01 PUSH 1
0040BB37 . 50 PUSH EAX
0040BB38 . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BB3B . E8 F21D0000 CALL <JMP.&MFC42.#5710>
0040BB40 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040BB42 . 53 PUSH EBX
0040BB43 . 50 PUSH EAX
0040BB44 . FFD6 CALL ESI
0040BB46 . 8BD8 MOV EBX,EAX
0040BB48 . 59 POP ECX
0040BB49 . F7DB NEG EBX
0040BB4B . 59 POP ECX
0040BB4C . 1ADB SBB BL,BL
0040BB4E . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0040BB51 . FEC3 INC BL
0040BB53 . E8 281B0000 CALL <JMP.&MFC42.#800> ; BL清0
0040BB58 . 84DB TEST BL,BL
0040BB5A . 75 24 JNZ SHORT pswmonit.0040BB80
0040BB5C EB 24 JMP SHORT pswmonit.0040BB82
0040BB8E . 84DB TEST BL,BL
0040BB90 74 0B JE SHORT pswmonit.0040BB9D ; 不等于就挂了
0040BB92 . 51 PUSH ECX
0040BB93 . 8BCC MOV ECX,ESP
0040BB95 . 8965 E0 MOV DWORD PTR SS:[EBP-20],ESP
0040BB98 . E9 0A020000 JMP pswmonit.0040BDA7 ; 跳就挂
0040BB9D > BB BC554100 MOV EBX,pswmonit.004155BC ; ASCII "whm_w"
0040BBA2 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
0040BBA5 . 53 PUSH EBX
0040BBA6 . E8 D71B0000 CALL <JMP.&MFC42.#941> ; 将whm_w加到用户名后面 用户名长度放ECX
0040BBAB . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
0040BBAE . 33C9 XOR ECX,ECX
0040BBB0 . 897D DC MOV DWORD PTR SS:[EBP-24],EDI
0040BBB3 . 8B50 F8 MOV EDX,DWORD PTR DS:[EAX-8] ; 新用户名长度放EDX
0040BBB6 . 3BD7 CMP EDX,EDI
0040BBB8 . 7E 0E JLE SHORT pswmonit.0040BBC8
0040BBBA > 0FBE3401 MOVSX ESI,BYTE PTR DS:[ECX+EAX] ; 逐个取新用户名
0040BBBE . 0175 DC ADD DWORD PTR SS:[EBP-24],ESI ; 加上自身ASCII存堆栈0013E4B0中
0040BBC1 . 41 INC ECX
0040BBC2 . 3BCA CMP ECX,EDX
0040BBC4 .^7C F4 JL SHORT pswmonit.0040BBBA
0040BBC6 . 33FF XOR EDI,EDI
0040BBC8 > 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0040BBCB . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BBCE . 8B40 F8 MOV EAX,DWORD PTR DS:[EAX-8] ; 取注册码长度放EAX中
0040BBD1 . 83C0 FE ADD EAX,-2 ; 注册码长度减2
0040BBD4 . 50 PUSH EAX
0040BBD5 . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
0040BBD8 . 57 PUSH EDI
0040BBD9 . 50 PUSH EAX
0040BBDA . E8 511C0000 CALL <JMP.&MFC42.#4278> ; 去掉注册码后2位
0040BBDF . FF30 PUSH DWORD PTR DS:[EAX] ; /s
0040BBE1 . 8B35 C4044100 MOV ESI,DWORD PTR DS:[<&MSVCRT.atol>] ; |msvcrt.atol
0040BBE7 . FFD6 CALL ESI ; \atol
0040BBE9 . 59 POP ECX
0040BBEA . 8BF8 MOV EDI,EAX
0040BBEC . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0040BBEF . E8 8C1A0000 CALL <JMP.&MFC42.#800>
0040BBF4 . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
0040BBF7 . 6A 02 PUSH 2
0040BBF9 . 50 PUSH EAX
0040BBFA . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0040BBFD . E8 301D0000 CALL <JMP.&MFC42.#5710> ; 取注册码后2位
0040BC02 . FF30 PUSH DWORD PTR DS:[EAX] ; /s
0040BC04 . FF15 C0044100 CALL DWORD PTR DS:[<&MSVCRT.atoi>] ; \atoi
0040BC0A . 59 POP ECX
0040BC0B . 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX
0040BC0E . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0040BC11 . E8 6A1A0000 CALL <JMP.&MFC42.#800>
0040BC16 . 337D D8 XOR EDI,DWORD PTR SS:[EBP-28] ; 注册码前n-2位与后2位异或(设注册码长度为n)
0040BC19 . 397D DC CMP DWORD PTR SS:[EBP-24],EDI ; 与前面逐个用户名相加的结果比较
0040BC1C 0F85 66010000 JNZ pswmonit.0040BD88 ; 关键跳转,不相等就挂 应该可以做爆破点
0040BD3A . 68 30100000 PUSH 1030
0040BD3F . 68 085E4100 PUSH pswmonit.00415E08
0040BD44 . 68 F85D4100 PUSH pswmonit.00415DF8
0040BD49 . E8 9E190000 CALL <JMP.&MFC42.#4224> ; 哇噻! 成功了!
0040BD8B . 68 30100000 PUSH 1030
0040BD90 . 68 085E4100 PUSH pswmonit.00415E08
0040BD95 . 68 1C5E4100 PUSH pswmonit.00415E1C
0040BD9A E8 4D190000 CALL <JMP.&MFC42.#4224> ; 失败处
0040BD9F . EB 16 JMP SHORT pswmonit.0040BDB7
0040BDA1 > 51 PUSH ECX
0040BDA2 . 8BCC MOV ECX,ESP
0040BDA4 . 8965 E0 MOV DWORD PTR SS:[EBP-20],ESP
0040BDA7 > 68 1C5E4100 PUSH pswmonit.00415E1C
0040BDAC . E8 71190000 CALL <JMP.&MFC42.#537>
0040BDB1 E8 39BAFFFF CALL pswmonit.004077EF ; 失败处
--------------------------------------------------------------------------------
【经验总结】
输入的用户名后面加上固定的字符,把他们所有的字符串ASCII码加起来
取输入的密码后2位和前面的几位异或
他们相等则表示注册码相等。
个人感觉算法不严密,每个用户名差不多都有好几个注册码。
现给出一组注册码供参考:
用户名:frozenrain
注册码:166331(其实有好几组)
PS:4位注册码 不能成功。程序中没T掉4位的注册码
上面是我的分析 不知道有没有错的地方 学破解没多久, 希望能增加自己的信心 ~_~!
算法不算复杂 ,我也不懂算法, 用C++写了个注册机。下面代码已经通过VC++6.0编译。
#include <iostream.h>
#include <string.h>
void Calc(int m);
void main()
{
char Client[32]={0},Result[32]={0};
cout<<"请输入用户名"<<endl;
do{
cin>>Client;
int length=strlen(Client);
for(int i=0;i<length;i++)
{
if(Client[i]>64&&Client[i]<91)
Client[i]=Client[i]+32;
}
strcat(Client,"whm_w");
int asciisum=0;
length=strlen(Client);
for(int j=0;j<length;j++)
asciisum+=Client[j];
Calc(asciisum);
}while(1);
}
void Calc(int m)
{
int s=0,t=0;
int n=0;
for(int i=0;i<9999;i++)
{
for(int j=0;j<100;j++)
{
n=s^t;
if(m==n)
{
cout<<"注册码为:"<<t<<s<<endl;
break;
}
t++;
}
s++;
}
}
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年01月18日 22:23:46
--------------------------------------------------------------------------------
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法