【文章标题】: 双色球中奖机破解
【文章作者】: kelvar(老马)
【作者邮箱】: kelvar@sohu.com
【作者QQ号】: 44232165
【软件名称】: 双色球中奖机破解
【下载地址】: 自己搜索下载
【加壳方式】: 没查出来
【保护方式】: 加壳加网络验证
【编写语言】: 易语言
【使用工具】: OD,易语言自动脱壳机
【操作平台】: windows xp3
【软件介绍】: 双色球中奖机
【作者声明】: 凑热闹~^_^,小菜鸟写文章
--------------------------------------------------------------------------------
【详细过程】
第一步还是查壳,yoda's Protector v1.02 (.dll,.ocx) -> Ashkbiz Danehk
一看就是个不好惹的主,好在有E语言的自动脱壳机,运行下。程序自动给脱好了。方便。
第二步,OD载入脱壳后的程序,停在下面的入口处。
00401000 u>/$ E8 06000000 call unpack.0040100B
00401005 |. 50 push eax ; /ExitCode
00401006 \. E8 BB010000 call <jmp.&KERNEL32.ExitProces>; \ExitProcess
0040100B /$ 55 push ebp
0040100C |. 8BEC mov ebp,esp
0040100E |. 81C4 F0FEFFFF add esp,-110
00401014 |. E9 83000000 jmp unpack.0040109C
00401019 |. 6B 72 6E 6C 6E 2E >ascii "krnln.fnr",0
00401023 |. 6B 72 6E 6C 6E 2E >ascii "krnln.fne",0
E语言的入口有特定的字符串可以查找。OD载入后,就F9运行程序吧,当程序运行后,ALT+E
选中易语言的核心库krnln,双击进去。然后CTRL+B,查找FF 55 FC
查找到这个Call后F2下断。现在输入假码112233445566 和用户 kelvar 名后,单击 登陆软件
程序出现登陆失败对话框,不管它,点击确定。
出现错误对话框, 点击Alt+K,然后找到上面的一个MessageBoxExA
77D5085C u> 8BFF mov edi,edi
77D5085E 55 push ebp
77D5085F 8BEC mov ebp,esp
77D50861 6A FF push -1
77D50863 FF75 18 push dword ptr ss:[ebp+18]
77D50866 FF75 14 push dword ptr ss:[ebp+14]
77D50869 FF75 10 push dword ptr ss:[ebp+10]
77D5086C FF75 0C push dword ptr ss:[ebp+C]
77D5086F FF75 08 push dword ptr ss:[ebp+8]
77D50872 E8 8F5B0100 call user32.MessageBoxTimeoutA
77D50877 5D pop ebp
77D50878 C2 1400 retn 14
77D5087B 90 nop
在第二个MessageBoxA上点击,然后来到代码处,下断
77D5080E 85C0 test eax,eax
77D50810 75 0A jnz short user32.77D5081C
77D50812 C705 201BD777 010000>mov dword ptr ds:[77D71B20],1
77D5081C 6A 00 push 0
77D5081E FF75 14 push dword ptr ss:[ebp+14]
77D50821 FF75 10 push dword ptr ss:[ebp+10]
77D50824 FF75 0C push dword ptr ss:[ebp+C]
77D50827 FF75 08 push dword ptr ss:[ebp+8]
77D5082A E8 2D000000 call user32.MessageBoxExA
77D5082F 5D pop ebp
77D50830 C2 1000 retn 10
77D50833 90 nop
程序在77D5087B处断下来了,我们手动F8向下走吧。F8一步就来到了77D5082F处。继续F8
直到返回到主程序中
02C57D80 4C dec esp
02C57D81 0000 add byte ptr ds:[eax],al
02C57D83 83C4 28 add esp,28
02C57D86 E9 D5010000 jmp ssqzjj.02C57F60
02C57D8B EB 01 jmp short ssqzjj.02C57D8E
02C57D8D 7A 8B jpe short ssqzjj.02C57D1A
02C57D8F 5D pop ebp
02C57D90 F8 clc
此时观察堆栈中的数据发现,出现了假码
0012F51C 03D806D8 ASCII "112233445566"
0012F520 03D80D00 ASCII "42086A1EB5820DC80D0341CE709B675F"
0012F524 03D806A8
0012F528 0023C070
0012F52C 03D806B0
0012F530 03D806A8
0012F534 03D80D00 ASCII "42086A1EB5820DC80D0341CE709B675F"
0012F538 /0012F5A0
0012F53C |02C5C937 返回到 ssqzjj.02C5C937 来自 ssqzjj.02C579DE
好了,那我们就去02C5C937处下个断点吧。
由于假码"112233445566"还在堆栈中说明处理还没有完成,我们就一直向下走吧,不用修改它的流程。
当程序运行到下面时,用户名也开始出现在堆栈中了。
02C580C5 8BE5 mov esp,ebp
02C580C7 5D pop ebp
02C580C8 C2 1400 retn 14
02C580CB 55 push ebp
02C580CC 8BEC mov ebp,esp
F8一步,发现程序在我们刚才下的02C5C937处了,好关键快到了,我们继续
0086BF6C 68 06000000 push 6
0086BF71 E8 49082100 call unpack.00A7C7BF
0086BF76 83C4 04 add esp,4
0086BF79 8B5D E8 mov ebx,dword ptr ss:[ebp-18]
0086BF7C 85DB test ebx,ebx ; 判断用户名是否为空
0086BF7E 74 09 je short unpack.0086BF89
0086BF80 53 push ebx
0086BF81 E8 2D082100 call unpack.00A7C7B3
0086BF86 83C4 04 add esp,4
0086BF89 8B5D E4 mov ebx,dword ptr ss:[ebp-1C]
0086BF8C 85DB test ebx,ebx ; 判断密码是否为空
0086BF8E 74 09 je short unpack.0086BF99
0086BF90 53 push ebx
0086BF91 E8 1D082100 call unpack.00A7C7B3 ; 关键Call
0086BF96 83C4 04 add esp,4
0086BF99 837D FC 00 cmp dword ptr ss:[ebp-4],0 ; 关键比较
0086BF9D 0F84 38020000 je unpack.0086C1DB ; 关键跳转 nop掉就好了。或者将38020000改为全零
0086BFA3 8B1D 80020301 mov ebx,dword ptr ds:[1030280]
0086BFA9 895D F0 mov dword ptr ss:[ebp-10],ebx
破解的不完美,程序登陆的时候还是要跳出一个注册名错误对话框,但是再次点击就可以去除了。最近比较忙,就不再弄了
。另外,这个程序即使用真正的用户名和注册码登陆貌似也要点击两次。具体的算法也不会分析。期待高手出现。分析下算法
--------------------------------------------------------------------------------
【经验总结】
E语言的东西没什么好说的了,查找事件按钮,下断,跟进,找关键Call和关键跳转。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年11月09日 16:04:38 |