首页
社区
课程
招聘
[QQ密码键盘记录器]简单算法分析!
2005-10-12 18:35 10793

[QQ密码键盘记录器]简单算法分析!

2005-10-12 18:35
10793
【软件名称】QQ密码键盘记录器
【下载地址】自己找
【应用平台】Win9x/NT/2000/XP
【软件大小】未知
【软件限制】Nag
【破解声明】看到论坛有人问这个软件,最近也想学一下算法,所以就有了此文。从未写过破文,各位大侠见笑了!只是对技术感兴趣,无其它目的。如果有人利用此文做出注册机做坏事,与本人没有任何关系!失误之处敬请诸位大侠赐教!
【破解工具】od,ida
【软件简介】记录QQ密码!
========================================================================================
【分析过程】

1.查壳,无壳,vc编写;
2.od载入,运行老罗的字符参考插件,很容易找到关键处!
输入假码"1234567890ABCDEF"
00402440 <>/$  6A FF      push -1                         ;  sub_402440

00402442   |.  68 8832410>push <QQPwd.loc_413288>         ;  SE 句柄安装

00402447   |.  64:A1 0000>mov eax,dword ptr fs:[0]

0040244D   |.  50         push eax

0040244E   |.  64:8925 00>mov dword ptr fs:[0],esp

00402455   |.  83EC 18    sub esp,18

00402458   |.  53         push ebx

00402459   |.  8B4C24 2C  mov ecx,dword ptr ss:[esp+2C]   ;  假码->ecx

0040245D   |.  33C0       xor eax,eax

0040245F   |.  894424 05  mov dword ptr ss:[esp+5],eax

00402463   |.  33DB       xor ebx,ebx

00402465   |.  66:894424 >mov word ptr ss:[esp+9],ax

0040246A   |.  895C24 24  mov dword ptr ss:[esp+24],ebx

0040246E   |.  884424 0B  mov byte ptr ss:[esp+B],al

00402472   |.  8B41 F8    mov eax,dword ptr ds:[ecx-8]    ;  假码长度->eax

00402475   |.  83F8 10    cmp eax,10

00402478   |.  885C24 04  mov byte ptr ss:[esp+4],bl

0040247C   |.  0F8C C0000>jl <QQPwd.loc_402542>           ;  假码长度<16则跳

00402482   |.  56         push esi

00402483   |.  68 0401000>push 104

00402488   |.  8D4C24 34  lea ecx,dword ptr ss:[esp+34]   ;  假码->ecx

0040248C   |.  E8 DFC5000>call <QQPwd.sub_40EA70>         ;  假码->eax

00402491   |.  8B10       mov edx,dword ptr ds:[eax]      ;  假码第1个4位->edx

00402493   |.  33F6       xor esi,esi

00402495   |.  895424 10  mov dword ptr ss:[esp+10],edx   ;  假码第1个4位->[12efa4]

00402499   |.  8B48 04    mov ecx,dword ptr ds:[eax+4]    ;  假码第2个4位->ecx

0040249C   |.  894C24 14  mov dword ptr ss:[esp+14],ecx   ;  假码第2个4位->[12efa8]

004024A0   |.  8B50 08    mov edx,dword ptr ds:[eax+8]    ;  假码第3个4位->edx

004024A3   |.  895424 18  mov dword ptr ss:[esp+18],edx   ;  假码第3个4位->[12efac]

004024A7   |.  8B40 0C    mov eax,dword ptr ds:[eax+C]    ;  假码最后4位->eax

004024AA   |.  894424 1C  mov dword ptr ss:[esp+1C],eax   ;  假码最后4位->[12efb0]

004024AE <>|>  8A4C34 10  /mov cl,byte ptr ss:[esp+esi+10>;  -|取每位注册码,如果是数字,取其ascii码值与30之差,如果是字母A-F则取其ascii值与37之差,其余则取FF

004024B2   |.  51         |push ecx                       ;   |

004024B3   |.  E8 68FFFFF>|call <QQPwd.sub_402420>        ;   |追进此call可知,注册码每位只能取0-9及A-F

004024B8   |.  83C4 04    |add esp,4                      ;   |-->此循环的实际作用:将假码每位补0,如2->02

004024BB   |.  884434 10  |mov byte ptr ss:[esp+esi+10],a>;   |差值->[12efa4]

004024BF   |.  46         |inc esi                        ;   |计数

004024C0   |.  83FE 10    |cmp esi,10                     ;   |

004024C3   |.^ 7C E9      \jl short <QQPwd.loc_4024AE>    ;  _|是否循环完

004024C5   |.  33C0       xor eax,eax

004024C7   |.  8D4C24 10  lea ecx,dword ptr ss:[esp+10]   ;  保存上面循环变换后的值地址(堆栈12efa4)->ecx

004024CB   |.  5E         pop esi

004024CC <>|>  8A51 01    /mov dl,byte ptr ds:[ecx+1]     ;  依次取假码的偶数位(2,4,6,8,10,12,14,16)位经上面循环变换后的结果,记为OU

004024CF   |.  8A19       |mov bl,byte ptr ds:[ecx]       ;  依次取假码的奇数位(1,3,5,7,9,11,13,15)经上面循环变换后的结果,记为QI

004024D1   |.  C0E2 04    |shl dl,4                       ;  shl OU,4(实际就是反转ascii,如:02->20)

004024D4   |.  02D3       |add dl,bl                      ;  (shl OU,4)+QI,每次结果记为A(i)

004024D6   |.  83C1 02    |add ecx,2                      ;  移到下2个

004024D9   |.  885404 04  |mov byte ptr ss:[esp+eax+4],dl ;  A(i)->[12ef9c]

004024DD   |.  40         |inc eax                        ;  计数

004024DE   |.  83F8 08    |cmp eax,8

004024E1   |.^ 7C E9      \jl short <QQPwd.loc_4024CC>    ;  是否循环完

004024E3   |.  8A4424 07  mov al,byte ptr ss:[esp+7]      ;  A(4)[12ef9f]->al

004024E7   |.  8A5C24 04  mov bl,byte ptr ss:[esp+4]      ;  A(1)[12ef9c]->bl

004024EB   |.  8A4C24 0B  mov cl,byte ptr ss:[esp+B]      ;  A(8)[12efa3]->cl

004024EF   |.  8A5424 05  mov dl,byte ptr ss:[esp+5]      ;  A(2)[12ef9d]->dl

004024F3   |.  32C3       xor al,bl                       ;  xor A(4),A(1),结果记为B1

004024F5   |.  8A5C24 06  mov bl,byte ptr ss:[esp+6]      ;  A(3)->bl

004024F9   |.  32CA       xor cl,dl                       ;  xor A(8),A(2),结果记为B2

004024FB   |.  8A5424 09  mov dl,byte ptr ss:[esp+9]      ;  A(6)->dl

004024FF   |.  32D3       xor dl,bl                       ;  xor A(6),A(3),结果记为B3

00402501   |.  8A5C24 08  mov bl,byte ptr ss:[esp+8]      ;  A(5)->bl

00402505   |.  325C24 0A  xor bl,byte ptr ss:[esp+A]      ;  xor A(7),A(5),结果记为B4

00402509   |.  3C 55      cmp al,55

0040250B   |.  75 35      jnz short <QQPwd.loc_402542>    ;  B1 !=55则跳

0040250D   |.  80F9 6E    cmp cl,6E

00402510   |.  75 30      jnz short <QQPwd.loc_402542>    ;  B2 !=6E则跳

00402512   |.  80FA 4E    cmp dl,4E

00402515   |.  75 2B      jnz short <QQPwd.loc_402542>    ;  B3 !=4E则跳

00402517   |.  80FB 19    cmp bl,19

0040251A   |.  75 26      jnz short <QQPwd.loc_402542>    ;  B4 !=19则跳

0040251C   |.  8D4C24 2C  lea ecx,dword ptr ss:[esp+2C]   ;  4024ae处循环变换后值保存地址->ecx

00402520   |.  C74424 24 >mov dword ptr ss:[esp+24],-1

00402528   |.  E8 5FC3000>call <QQPwd.sub_40E88C>

0040252D   |.  B8 0100000>mov eax,1

00402532   |.  5B         pop ebx

00402533   |.  8B4C24 18  mov ecx,dword ptr ss:[esp+18]

00402537   |.  64:890D 00>mov dword ptr fs:[0],ecx

0040253E   |.  83C4 24    add esp,24

00402541   |.  C3         retn


综合上面的,思考观察一下可得出:

A(1)=假码1,2位反转
A(2)=假码3,4位反转
A(3)=假码5,6位反转
A(4)=假码7,8位反转
A(5)=假码9,10位反转
A(6)=假码11,12位反转
A(7)=假码13,14位反转
A(8)=假码15,16位反转
========================================================================================

【分析总结】
1.注册码长度为16
2.注册码每位只能是数字0-9,和字母A-F(大写)
3.运算关系:
xor A(4),A(1)=55
xor A(8),A(2)=6E
xor A(6),A(3)=4E
xor A(7),A(5)=19
4.注册码求逆:
随机生成4个10进制2位数,作为A(1),A(2),A(3),A(5)的值,因为由A xor B=C可得出A=B xor C,所以就可以反算出A(4),A(6),A(7),A(8)了,再将A(1)-A(8)转为16进制字符,反转后再按顺序连接即是注册码。

用delphi表述如下:
procedure TForm1.btnGenSnClick(Sender: TObject);
var
A1,A2,A3,A4,A5,A6,A7,A8:integer;
S1,S2,S3,S4,S5,S6,S7,S8,sn:string;
begin
edtsn.Text:='';
A1:=GetNum; //随机产生
A4:=A1 xor 85;
S1:=reverse(OcttoHex(A1)); //转为16进制字符,再反转
S4:=reverse(OcttoHex(A4));

A2:=GetNum;
A8:=A2 xor 110;
S2:=reverse(OcttoHex(A2));
S8:=reverse(OcttoHex(A8));

A3:=GetNum;
A6:=A3 xor 78;
S3:=reverse(OcttoHex(A3));
S6:=reverse(OcttoHex(A6));

A5:=GetNum;
A7:=A5 xor 25;
S5:=reverse(OcttoHex(A5));
S7:=reverse(OcttoHex(A7));

sn:=s1+s2+s3+s4+s5+s6+s7+s8; //连接

edtsn.text:=sn;

end;

========================================================================================
                                                   2005-10-12

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 254
活跃值: (86)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
fwycfpg 1 2005-10-13 04:11
2
0
似懂非懂~~~
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
zhaoocn 7 2005-10-13 20:17
3
0
啥时候咱也写个自己的注册机
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
skyege 2 2005-10-13 23:25
4
0
不错。支持一下 !!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
geforceX 2005-10-15 15:06
5
0
谢谢!
请问有没有做QQ珊瑚虫外挂之类的教程?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48657119 2005-10-15 18:21
6
0
不错哦!继续努力
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
yuqli 2 2005-10-15 21:16
7
0
最初由 geforceX 发布
谢谢!
请问有没有做QQ珊瑚虫外挂之类的教程?

看雪精华精华里面有相关的文章,不过不是讲外挂 去看看还是蛮有收获的
游客
登录 | 注册 方可回帖
返回