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写的程序,一些类搞得有点头痛,关键在于反复调试,就会找到关键算法部分。本地验证就解决了,网络验证还是利用了网站存在的漏洞,好像一直没有补过,呵呵!
------------------------------------------------------------------------
【版权声明】本文只在于研究算法和破解思路,请不要用于非法用途。 网络验证还是利用了网站存在的漏洞/:L 太棒了高手我才把他破成注册版后来一打开邮箱设置过一会邮箱设置就自动关了 我也自己玩试试看 不知道还有没暗桩呢? 应该还有暗桩没解决吧 大家注意了,他这个软件的接收邮箱可能用的是他服务器里面的邮箱地址发出的,谨防泄漏!因为这个软件上没有设置发送邮箱的地址!/:L 谢谢分享,看看 看看效果如何!!! 楼主个个方面都很精通嘛。。