manbug 发表于 2010-3-2 10:31:12

QQ密码监控器邮箱版 3.5 完全注册分析

【破文标题】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载入程序,查找当前模块中的名称,找到名称位于 QQ2009密, 条目 1915
地址=0043C2AC
区段=.rdata
类型=输入    (已知)
名称=KERNEL32.GetProfileStringA右键在每个参考上设置断点。F9运行程序,第一次会断在004037D2|.FF15 ACC24300 call    near dword ptr [<&KERNEL32.GetPr>; \GetProfileStringA向上观察一下,好像是读取密码之类的,这个不是我们所要的,F2取消这个断点,F9继续 会断在下面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:          ; |
0040E93D|.8D4C24 18   lea   ecx, dword ptr           ; |
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以上是读取订单号。一直F8,0040E9DA|.E8 718CFFFF   call                         ;得到机器码函数以上这个call是读取硬盘相关的东西。大家可能会问,我怎么知道的,呵呵,单步跟出来的结果,单步跟时要注意观察OD各个窗口的变化。一直F8,因为程序读取了注册码之后一定会验证的,所以我们单步跟00409066|.51            push    ecx
00409067|.8BCC          mov   ecx, esp
00409069|.896424 14   mov   dword ptr , esp
0040906D|.68 6CED4400   push    offset
00409072|.E8 301B0200   call   
00409077|.B9 10ED4400   mov   ecx, offset
0040907C|.E8 DF5C0000   call到0040907c这个call之后一定要F7跟进,然后F8单步来到0040EDC4|.896424 28   mov   dword ptr , esp
0040EDC8|.52            push    edx
0040EDC9|.E8 D9BD0100   call   
0040EDCE|.8BCD          mov   ecx, ebp
0040EDD0|.E8 7BFDFFFF   call                         ;此处为验证处了到40EDD0还是F7跟进。就是算法过程了0040EB50 >/$6A FF         push    -1                               ;sub_40EB50
0040EB52|.68 C0A54300   push               ;SE 处理程序安装
0040EB57|.64:A1 0000000>mov   eax, dword ptr fs:
0040EB5D|.50            push    eax
0040EB5E|.64:8925 00000>mov   dword ptr fs:, 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
0040EB71|.68 7CED4400   push    offset
0040EB76|.8BCD          mov   ecx, ebp
0040EB78|.C74424 2C 000>mov   dword ptr , 0
0040EB80|.896C24 20   mov   dword ptr , ebp
0040EB84|.E8 32C40100   call   
0040EB89|.8D43 0C       lea   eax, dword ptr
0040EB8C|.8D4C24 10   lea   ecx, dword ptr
0040EB90|.50            push    eax
0040EB91|.E8 11C00100   call   
0040EB96|.C64424 28 01mov   byte ptr , 1
0040EB9B|.8B4B 24       mov   ecx, dword ptr
0040EB9E|.8B41 F8       mov   eax, dword ptr
0040EBA1|.83F8 0A       cmp   eax, 0A
0040EBA4|.7D 26         jge   short
0040EBA6|.8D4C24 10   lea   ecx, dword ptr
0040EBAA|.C64424 28 00mov   byte ptr , 0
0040EBAF|.E8 7EC20100   call   
0040EBB4|.8D4C24 30   lea   ecx, dword ptr
0040EBB8|.C74424 28 FFF>mov   dword ptr , -1
0040EBC0|.E8 6DC20100   call   
0040EBC5|.33C0          xor   eax, eax
0040EBC7|.E9 7F010000   jmp   
0040EBCC >|>8B5424 10   mov   edx, dword ptr           ;用户名送edx
0040EBD0|.837A F8 0A    cmp   dword ptr , 0A            ;比较用户名长度是不是为0x0A
0040EBD4|.7D 26         jge   short                ;小于0x0a则跳出
0040EBD6|.8D4C24 10   lea   ecx, dword ptr
0040EBDA|.C64424 28 00mov   byte ptr , 0
0040EBDF|.E8 4EC20100   call   
0040EBE4|.8D4C24 30   lea   ecx, dword ptr
0040EBE8|.C74424 28 FFF>mov   dword ptr , -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
0040EC05|.E8 96C20100   call   
0040EC0A|.68 7CED4400   push    offset
0040EC0F|.8D4C24 18   lea   ecx, dword ptr
0040EC13|.C64424 2C 02mov   byte ptr , 2
0040EC18|.E8 83C20100   call   
0040EC1D|.C64424 28 03mov   byte ptr , 3
0040EC22|.8B4B 24       mov   ecx, dword ptr
0040EC25|.33C0          xor   eax, eax
0040EC27|.8B51 F8       mov   edx, dword ptr          ;机器码长度送edx
0040EC2A|.85D2          test    edx, edx
0040EC2C|.7E 55         jle   short
0040EC2E >|>0FBE2C08      /movsx   ebp, byte ptr          ;将机器码逐个送ebp
0040EC32|.8D78 01       |lea   edi, dword ptr
0040EC35|.BE 68000000   |mov   esi, 68
0040EC3A|.3BFA          |cmp   edi, edx                        ;如果edi>=机器码长度跳
0040EC3C|.7D 07         |jge   short
0040EC3E|.0FBE7408 01   |movsx   esi, byte ptr        ;将机器码下一位送esi
0040EC43|.03F5          |add   esi, ebp                        ;esi+=ebp
0040EC45 >|>8D45 05       |lea   eax, dword ptr           ;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
0040EC57|.68 14BE4400   |push    offset                      ;%d
0040EC5C|.52            |push    edx
0040EC5D|.E8 FEA50100   |call    ;余数送给一个字符串
0040EC62|.83C4 0C       |add   esp, 0C
0040EC65|.8D4424 14   |lea   eax, dword ptr
0040EC69|.8D4C24 18   |lea   ecx, dword ptr
0040EC6D|.50            |push    eax
0040EC6E|.E8 D7C50100   |call    ;合并字符串
0040EC73|.8B4B 24       |mov   ecx, dword ptr          ;机器码送ecx
0040EC76|.8BC7          |mov   eax, edi                        ;eax=edi
0040EC78|.8B51 F8       |mov   edx, dword ptr           ;机器码长度送edx
0040EC7B|.3BC2          |cmp   eax, edx
0040EC7D|.^ 7C AF         \jl      short
0040EC7F|.8B6C24 1C   mov   ebp, dword ptr
0040EC83 >|>8B4C24 10   mov   ecx, dword ptr           ;loc_40EC83
0040EC87|.8B5424 18   mov   edx, dword ptr
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
0040EC9D|.C64424 28 02mov   byte ptr , 2
0040ECA2|.E8 8BC10100   call   
0040ECA7|.8D4C24 18   lea   ecx, dword ptr
0040ECAB|.C64424 28 01mov   byte ptr , 1
0040ECB0|.E8 7DC10100   call   
0040ECB5|.8D4C24 10   lea   ecx, dword ptr
0040ECB9|.C64424 28 00mov   byte ptr , 0
0040ECBE|.E8 6FC10100   call   
0040ECC3|.8D4C24 30   lea   ecx, dword ptr
0040ECC7|.C74424 28 FFF>mov   dword ptr , -1
0040ECCF|.E8 5EC10100   call   
0040ECD4|.33C0          xor   eax, eax
0040ECD6|.EB 73         jmp   short
0040ECD8 >|>C743 14 01000>mov   dword ptr , 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
0040ED0F|.C64424 28 02mov   byte ptr , 2
0040ED14|.E8 19C10100   call   
0040ED19|.8D4C24 18   lea   ecx, dword ptr
0040ED1D|.C64424 28 01mov   byte ptr , 1
0040ED22|.E8 0BC10100   call   
0040ED27|.8D4C24 10   lea   ecx, dword ptr
0040ED2B|.C64424 28 00mov   byte ptr , 0
0040ED30|.E8 FDC00100   call   
0040ED35|.8D4C24 30   lea   ecx, dword ptr
0040ED39|.C74424 28 FFF>mov   dword ptr , -1
0040ED41|.E8 ECC00100   call   
0040ED46|.B8 01000000   mov   eax, 1
0040ED4B >|>8B4C24 20   mov   ecx, dword ptr           ;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:, ecx
0040ED5A|.83C4 1C       add   esp, 1C
0040ED5D\.C2 0400       retn    4我已经写成了注册机了,源代码如下:



**** Hidden Message *****
如果有什么问题请指正!


------------------------------------------------------------------------
【破解总结】由于是MFC写的程序,一些类搞得有点头痛,关键在于反复调试,就会找到关键算法部分。本地验证就解决了,网络验证还是利用了网站存在的漏洞,好像一直没有补过,呵呵!
------------------------------------------------------------------------
【版权声明】本文只在于研究算法和破解思路,请不要用于非法用途。

MAPLE-XFX 发表于 2010-3-2 18:34:01

网络验证还是利用了网站存在的漏洞/:L

77u 发表于 2010-3-2 21:51:54

太棒了高手我才把他破成注册版后来一打开邮箱设置过一会邮箱设置就自动关了

adys 发表于 2010-3-2 23:12:00

我也自己玩试试看

sztxgg 发表于 2010-3-3 09:46:20

不知道还有没暗桩呢?

ljdlhly12 发表于 2010-3-3 11:29:54

应该还有暗桩没解决吧

MAPLE-XFX 发表于 2010-3-3 13:01:57

大家注意了,他这个软件的接收邮箱可能用的是他服务器里面的邮箱地址发出的,谨防泄漏!因为这个软件上没有设置发送邮箱的地址!/:L

cbkxh 发表于 2010-3-3 13:55:57

谢谢分享,看看

小举 发表于 2010-3-4 13:10:36

看看效果如何!!!

walili 发表于 2010-3-6 07:47:30

楼主个个方面都很精通嘛。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: QQ密码监控器邮箱版 3.5 完全注册分析