| 
注册时间2010-1-1
阅读权限20
最后登录1970-1-1UID64991 以武会友  
 
 该用户从未签到 | 
 
| 【破文标题】QQ密码监控器邮箱版 3.5 完全注册分析 【破文作者】manbug
 【作者邮箱】
 【作者主页】
 【破解工具】peid,od
 【破解平台】xp
 【软件名称】QQ密码监控器邮箱版 3.5
 【软件大小】
 【原版下载】http://zhongyuantech.com.cn/src/EmailDDLook/index.html
 【保护方式】本地验证加网络验证
 【软件简介】QQ密码监控器邮箱版
 QQ密码监控器邮箱版 又名 QQ密码监控器 QQ密码记录器 和 QQ密码键盘记录器
 可以监控QQ2009和QQ2008所有版本的QQ密码,用户只要登录了QQ,密码马上就会被软件记录.
 并且可以将记录发送到你设置的邮箱地址.
 未注册用户限制:
 软件里面只显示 部分密码,并且不能设置上报邮箱地址
 提示: 软件打开一次,以后后台监视器会自动运行,并自动记录。
 
 
 严重声明:请不要将本软件用于非法用途,否则后果自负!
 【破解声明】
 ------------------------------------------------------------------------
 【破解过程】首先peid查壳,Microsoft Visual C++ 6.0 ,无壳,无壳相对简单些啦。先直接跑一遍程序,了解一下程序注册流程。点一下设置密码,提示未注册,会弹出注册框,这个注册和以前注册不一样了,有机器码了,随便输入注册码和订单号。点确定,是重启验证的。以前说过,重启验证无非就是写注册表或文件了。
 od载入程序,查找当前模块中的名称,找到
 右键在每个参考上设置断点。F9运行程序,第一次会断在复制代码名称位于 QQ2009密, 条目 1915
 地址=0043C2AC
 区段=.rdata
 类型=输入    (已知)
 名称=KERNEL32.GetProfileStringA
向上观察一下,好像是读取密码之类的,这个不是我们所要的,F2取消这个断点,F9继续 会断在下面复制代码004037D2  |.  FF15 ACC24300 call    near dword ptr [<&KERNEL32.GetPr>; \GetProfileStringA
以上是读取注册码,F8单步向下走复制代码0040E930  |.  8B2D ACC24300 mov     ebp, dword ptr [<&KERNEL32.GetPr>;  kernel32.GetProfileStringA
0040E936  |.  68 00010000   push    100                              ; /BufSize = 100 (256.)
0040E93B  |.  F3:AB         rep     stos dword ptr es:[edi]          ; |
0040E93D  |.  8D4C24 18     lea     ecx, dword ptr [esp+18]          ; |
0040E941  |.  51            push    ecx                              ; |ReturnBuffer
0040E942  |.  68 7CED4400   push    offset                      ; |Default = ""
0040E947  |.  68 84C64400   push    offset                ; |notetext
0040E94C  |.  52            push    edx                              ; |Section
0040E94D  |.  FFD5          call    near ebp                         ; \GetProfileStringA
以上是读取订单号。一直F8,复制代码0040E98B  |.  68 00010000   push    100
0040E990  |.  51            push    ecx
0040E991  |.  68 7CED4400   push    offset 
0040E996  |.  68 7CC64400   push    offset                  ;  noteid
0040E99B  |.  52            push    edx
0040E99C  |.  FFD5          call    near ebp
以上这个call是读取硬盘相关的东西。大家可能会问,我怎么知道的,呵呵,单步跟出来的结果,单步跟时要注意观察OD各个窗口的变化。一直F8,因为程序读取了注册码之后一定会验证的,所以我们单步跟复制代码0040E9DA  |.  E8 718CFFFF   call                         ;  得到机器码函数
到0040907c这个call之后一定要F7跟进,然后F8单步来到复制代码00409066  |.  51            push    ecx
00409067  |.  8BCC          mov     ecx, esp
00409069  |.  896424 14     mov     dword ptr [esp+14], esp
0040906D  |.  68 6CED4400   push    offset 
00409072  |.  E8 301B0200   call    
00409077  |.  B9 10ED4400   mov     ecx, offset 
0040907C  |.  E8 DF5C0000   call  
到40EDD0还是F7跟进。就是算法过程了复制代码0040EDC4  |.  896424 28     mov     dword ptr [esp+28], esp
0040EDC8  |.  52            push    edx
0040EDC9  |.  E8 D9BD0100   call    
0040EDCE  |.  8BCD          mov     ecx, ebp
0040EDD0  |.  E8 7BFDFFFF   call                         ;  此处为验证处了
我已经写成了注册机了,源代码如下:复制代码0040EB50 >/$  6A FF         push    -1                               ;  sub_40EB50
0040EB52  |.  68 C0A54300   push                 ;  SE 处理程序安装
0040EB57  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
0040EB5D  |.  50            push    eax
0040EB5E  |.  64:8925 00000>mov     dword ptr fs:[0], esp
0040EB65  |.  83EC 10       sub     esp, 10
0040EB68  |.  53            push    ebx
0040EB69  |.  55            push    ebp
0040EB6A  |.  56            push    esi
0040EB6B  |.  57            push    edi
0040EB6C  |.  8BD9          mov     ebx, ecx
0040EB6E  |.  8D6B 20       lea     ebp, dword ptr [ebx+20]
0040EB71  |.  68 7CED4400   push    offset 
0040EB76  |.  8BCD          mov     ecx, ebp
0040EB78  |.  C74424 2C 000>mov     dword ptr [esp+2C], 0
0040EB80  |.  896C24 20     mov     dword ptr [esp+20], ebp
0040EB84  |.  E8 32C40100   call    
0040EB89  |.  8D43 0C       lea     eax, dword ptr [ebx+C]
0040EB8C  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
0040EB90  |.  50            push    eax
0040EB91  |.  E8 11C00100   call    
0040EB96  |.  C64424 28 01  mov     byte ptr [esp+28], 1
0040EB9B  |.  8B4B 24       mov     ecx, dword ptr [ebx+24]
0040EB9E  |.  8B41 F8       mov     eax, dword ptr [ecx-8]
0040EBA1  |.  83F8 0A       cmp     eax, 0A
0040EBA4  |.  7D 26         jge     short 
0040EBA6  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
0040EBAA  |.  C64424 28 00  mov     byte ptr [esp+28], 0
0040EBAF  |.  E8 7EC20100   call    
0040EBB4  |.  8D4C24 30     lea     ecx, dword ptr [esp+30]
0040EBB8  |.  C74424 28 FFF>mov     dword ptr [esp+28], -1
0040EBC0  |.  E8 6DC20100   call    
0040EBC5  |.  33C0          xor     eax, eax
0040EBC7  |.  E9 7F010000   jmp     
0040EBCC >|>  8B5424 10     mov     edx, dword ptr [esp+10]          ;  用户名送edx
0040EBD0  |.  837A F8 0A    cmp     dword ptr [edx-8], 0A            ;  比较用户名长度是不是为0x0A
0040EBD4  |.  7D 26         jge     short                ;  小于0x0a则跳出
0040EBD6  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
0040EBDA  |.  C64424 28 00  mov     byte ptr [esp+28], 0
0040EBDF  |.  E8 4EC20100   call    
0040EBE4  |.  8D4C24 30     lea     ecx, dword ptr [esp+30]
0040EBE8  |.  C74424 28 FFF>mov     dword ptr [esp+28], -1
0040EBF0  |.  E8 3DC20100   call    
0040EBF5  |.  33C0          xor     eax, eax
0040EBF7  |.  E9 4F010000   jmp     
0040EBFC >|>  68 7CED4400   push    offset                      ;  loc_40EBFC
0040EC01  |.  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
0040EC05  |.  E8 96C20100   call    
0040EC0A  |.  68 7CED4400   push    offset 
0040EC0F  |.  8D4C24 18     lea     ecx, dword ptr [esp+18]
0040EC13  |.  C64424 2C 02  mov     byte ptr [esp+2C], 2
0040EC18  |.  E8 83C20100   call    
0040EC1D  |.  C64424 28 03  mov     byte ptr [esp+28], 3
0040EC22  |.  8B4B 24       mov     ecx, dword ptr [ebx+24]
0040EC25  |.  33C0          xor     eax, eax
0040EC27  |.  8B51 F8       mov     edx, dword ptr [ecx-8]           ;  机器码长度送edx
0040EC2A  |.  85D2          test    edx, edx
0040EC2C  |.  7E 55         jle     short 
0040EC2E >|>  0FBE2C08      /movsx   ebp, byte ptr [eax+ecx]         ;  将机器码逐个送ebp
0040EC32  |.  8D78 01       |lea     edi, dword ptr [eax+1]
0040EC35  |.  BE 68000000   |mov     esi, 68
0040EC3A  |.  3BFA          |cmp     edi, edx                        ;  如果edi>=机器码长度跳
0040EC3C  |.  7D 07         |jge     short 
0040EC3E  |.  0FBE7408 01   |movsx   esi, byte ptr [eax+ecx+1]       ;  将机器码下一位送esi
0040EC43  |.  03F5          |add     esi, ebp                        ;  esi+=ebp
0040EC45 >|>  8D45 05       |lea     eax, dword ptr [ebp+5]          ;  eax=ebp+5
0040EC48  |.  B9 0A000000   |mov     ecx, 0A                         ;  ecx=0xA
0040EC4D  |.  0BC6          |or      eax, esi                        ;  eax|=esi
0040EC4F  |.  99            |cdq
0040EC50  |.  F7F9          |idiv    ecx                             ;  eax/0xA
0040EC52  |.  52            |push    edx
0040EC53  |.  8D5424 18     |lea     edx, dword ptr [esp+18]
0040EC57  |.  68 14BE4400   |push    offset                      ;  %d
0040EC5C  |.  52            |push    edx
0040EC5D  |.  E8 FEA50100   |call    ;  余数送给一个字符串[esp+0x18]
0040EC62  |.  83C4 0C       |add     esp, 0C
0040EC65  |.  8D4424 14     |lea     eax, dword ptr [esp+14]
0040EC69  |.  8D4C24 18     |lea     ecx, dword ptr [esp+18]
0040EC6D  |.  50            |push    eax
0040EC6E  |.  E8 D7C50100   |call    ;  合并字符串
0040EC73  |.  8B4B 24       |mov     ecx, dword ptr [ebx+24]         ;  机器码送ecx
0040EC76  |.  8BC7          |mov     eax, edi                        ;  eax=edi
0040EC78  |.  8B51 F8       |mov     edx, dword ptr [ecx-8]          ;  机器码长度送edx
0040EC7B  |.  3BC2          |cmp     eax, edx
0040EC7D  |.^ 7C AF         \jl      short 
0040EC7F  |.  8B6C24 1C     mov     ebp, dword ptr [esp+1C]
0040EC83 >|>  8B4C24 10     mov     ecx, dword ptr [esp+10]          ;  loc_40EC83
0040EC87  |.  8B5424 18     mov     edx, dword ptr [esp+18]
0040EC8B  |.  51            push    ecx
0040EC8C  |.  52            push    edx
0040EC8D  |.  E8 68B80000   call    <__mbscmp>                       ;  本地验证,比较输入的注册码是否正确
0040EC92  |.  83C4 08       add     esp, 8
0040EC95  |.  85C0          test    eax, eax
0040EC97  |.  74 3F         je      short                ;  本地验证失败则跳了
0040EC99  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
0040EC9D  |.  C64424 28 02  mov     byte ptr [esp+28], 2
0040ECA2  |.  E8 8BC10100   call    
0040ECA7  |.  8D4C24 18     lea     ecx, dword ptr [esp+18]
0040ECAB  |.  C64424 28 01  mov     byte ptr [esp+28], 1
0040ECB0  |.  E8 7DC10100   call    
0040ECB5  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
0040ECB9  |.  C64424 28 00  mov     byte ptr [esp+28], 0
0040ECBE  |.  E8 6FC10100   call    
0040ECC3  |.  8D4C24 30     lea     ecx, dword ptr [esp+30]
0040ECC7  |.  C74424 28 FFF>mov     dword ptr [esp+28], -1
0040ECCF  |.  E8 5EC10100   call    
0040ECD4  |.  33C0          xor     eax, eax
0040ECD6  |.  EB 73         jmp     short 
0040ECD8 >|>  C743 14 01000>mov     dword ptr [ebx+14], 1            ;  loc_40ECD8
0040ECDF  |.  8B3D C8C24300 mov     edi, dword ptr [<&KERNEL32.Sleep>;  kernel32.Sleep
0040ECE5  |.  33F6          xor     esi, esi
0040ECE7 >|>  8BCB          /mov     ecx, ebx                        ;  loc_40ECE7
0040ECE9  |.  E8 32FDFFFF   |call                        ;  此处为网络验证了
0040ECEE  |.  85C0          |test    eax, eax
0040ECF0  |.  75 0D         |jnz     short 
0040ECF2  |.  68 E8030000   |push    3E8
0040ECF7  |.  FFD7          |call    near edi
0040ECF9  |.  46            |inc     esi
0040ECFA  |.  83FE 03       |cmp     esi, 3
0040ECFD  |.^ 7C E8         \jl      short 
0040ECFF >|>  68 E0C64400   push    offset                      ;  loc_40ECFF
0040ED04  |.  8BCD          mov     ecx, ebp
0040ED06  |.  E8 B0C20100   call    
0040ED0B  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
0040ED0F  |.  C64424 28 02  mov     byte ptr [esp+28], 2
0040ED14  |.  E8 19C10100   call    
0040ED19  |.  8D4C24 18     lea     ecx, dword ptr [esp+18]
0040ED1D  |.  C64424 28 01  mov     byte ptr [esp+28], 1
0040ED22  |.  E8 0BC10100   call    
0040ED27  |.  8D4C24 10     lea     ecx, dword ptr [esp+10]
0040ED2B  |.  C64424 28 00  mov     byte ptr [esp+28], 0
0040ED30  |.  E8 FDC00100   call    
0040ED35  |.  8D4C24 30     lea     ecx, dword ptr [esp+30]
0040ED39  |.  C74424 28 FFF>mov     dword ptr [esp+28], -1
0040ED41  |.  E8 ECC00100   call    
0040ED46  |.  B8 01000000   mov     eax, 1
0040ED4B >|>  8B4C24 20     mov     ecx, dword ptr [esp+20]          ;  loc_40ED4B
0040ED4F  |.  5F            pop     edi
0040ED50  |.  5E            pop     esi
0040ED51  |.  5D            pop     ebp
0040ED52  |.  5B            pop     ebx
0040ED53  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
0040ED5A  |.  83C4 1C       add     esp, 1C
0040ED5D  \.  C2 0400       retn    4
 
 
 
 如果有什么问题请指正!
 
 
 ------------------------------------------------------------------------
 【破解总结】由于是MFC写的程序,一些类搞得有点头痛,关键在于反复调试,就会找到关键算法部分。本地验证就解决了,网络验证还是利用了网站存在的漏洞,好像一直没有补过,呵呵!
 ------------------------------------------------------------------------
 【版权声明】本文只在于研究算法和破解思路,请不要用于非法用途。
 | 
 评分
查看全部评分
 |