【文章标题】: 易语言非常规破解思路秒杀
【文章作者】: BoXer[ICY]
【作者邮箱】: scship@163.com
【作者主页】: http://www.yumisu.cn
【作者QQ号】: **********
【软件名称】: MP4转换器 V3.8
【软件大小】: 8580 KB
【下载地址】: http://www.skycn.com/soft/28436.html
【加壳方式】: PECompact 2.x -> Jeremy Collake
【编写语言】: 易语言
【使用工具】: OD
【操作平台】: 盗版中的原装版xp sp2
【软件介绍】: 视频文件转换到MP4视频文件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
菜鸟写的垃圾文章,高手不要看,笑掉大牙本人绝不负责!
==============================================================================================
1、脱壳
下载,安装,查壳,发现是:PECompact 2.x -> Jeremy Collake
熟悉 PECompact 2.x 的人都知道,这个壳的入口点就是程序的入口点,我们直接OD载入,
看到EIP那里就是入口点1000
在输入 he eip 回车,F9运行,直接飞到OEP ,删除硬件断点,dump!
不知道是不是我OD的dump插件的问题,我用了几个OD怎么dump出来修复的都没用
只好 LoadPE 来dump ,然后 修复 ImportREC 修复
OEP输入00401000,自动找RVA,修复,ok!
再查壳:E language *
==============================================================================================
2、常规方法
由于常规方法我只讲思路,就是EcE或者用bp MessageBoxA找找按钮事件,然后找到之好改跳转。
但是随便输入注册码都能提示注册成功,而软件还是没有注册。经过冥想,我找到了以下方法。
==============================================================================================
3、非常规方法
细心的人会发现,od载入这个软件会发现提示有压缩代码,一般我们加载压缩壳都会有这样的提示。
但是这个软件我们已经脱壳了,显示E language *
我们这时候用我师兄(luocong师兄,比我高几届,我现在还没毕业)的查找字符串插件是找不到字符串的。
这就是E语言封装的结果,我们来突破易语言的封装,找真正的“ OEP”吧。
==============================================================================================
E语言的通用入口点
00401000 > E8 06000000 call 0040100B ; F7进入
00401005 50 push eax ; 这是退出代码
00401006 E8 BB010000 call <jmp.&kernel32.ExitProcess> ; 退出释放进程
。。。。。(华丽的省略号)。。。。。
004010A2 50 push eax ; 初始化,准备加载E语言支持库
004010A3 E8 44010000 call 004011EC
004010A8 68 19104000 push 00401019 ; ASCII "krnln.fnr"
004010AD 8D85 FCFEFFFF lea eax, dword ptr [ebp-104]
004010B3 50 push eax
004010B4 E8 25010000 call <jmp.&kernel32.lstrcat> ; lstrcatA函数
004010B9 50 push eax ; 文件名
004010BA E8 19010000 call <jmp.&kernel32.LoadLibraryA> ; LoadLobraryA函数
004010BF 85C0 test eax, eax ; 测试支持库加载是否成功,成功就使下一句跳转
004010C1 0F85 9E000000 jnz 00401165 ; 不成功就从注册表中找E程序的安装目录
。。。。。(又是菜鸟最喜欢的华丽的省略号)。。。。。
00401191 FFD0 call eax ; 加载E格式进行本地封装等操作,F7进去
00401193 6A 00 push 0 ; ExitCode=0
00401195 E8 2C000000 call <jmp.&kernel32.ExitProcess> ; 退出释放进程
。。。。。(还是无比华丽的省略号)。。。。。
1002998A 55 push ebp
1002998B 8BEC mov ebp, esp
1002998D 8B45 08 mov eax, dword ptr [ebp+8]
10029990 50 push eax
10029991 B9 10DB0E10 mov ecx, 100EDB10
10029996 E8 04F5FFFF call 10028E9F ; F7进去
1002999B 5D pop ebp
1002999C C2 0400 retn 4
==============================================================================================
到了看krnln.fnr的领空了
1002998A 55 push ebp
1002998B 8BEC mov ebp, esp
1002998D 8B45 08 mov eax, dword ptr [ebp+8]
10029990 50 push eax
10029991 B9 10DB0E10 mov ecx, 100EDB10
10029996 E8 04F5FFFF call 10028E9F ; F7进去
1002999B 5D pop ebp
1002999C C2 0400 retn 4
之后就到了这里:
10028E9F 55 push ebp ; 对E语言格式进行封装
10028EA0 8BEC mov ebp, esp
10028EA2 83EC 08 sub esp, 8
10028EA5 53 push ebx
10028EA6 56 push esi
10028EA7 57 push edi
10028EA8 894D F8 mov dword ptr [ebp-8], ecx
10028EAB FF15 E0230C10 call dword ptr [<&KERNEL32.GetProc>; kernel32.GetProcessHeap
10028EB1 8B4D F8 mov ecx, dword ptr [ebp-8]
10028EB4 8981 50040000 mov dword ptr [ecx+450], eax
10028EBA 8B55 08 mov edx, dword ptr [ebp+8]
10028EBD 8B42 30 mov eax, dword ptr [edx+30]
10028EC0 83E0 01 and eax, 1
10028EC3 85C0 test eax, eax
10028EC5 75 10 jnz short 10028ED7
10028EC7 8B4D 08 mov ecx, dword ptr [ebp+8]
10028ECA 51 push ecx
10028ECB 8B4D F8 mov ecx, dword ptr [ebp-8]
10028ECE E8 4DFB0200 call 10058A20 ; 封装完成
10028ED3 FFE0 jmp eax ; 跳到程序真正的OEP
==============================================================================================
0041E5EF FC cld ;程序真正的OEP,可以搜索字符串了
0041E5F0 DBE3 finit
0041E5F2 E8 F7FFFFFF call 0041E5EE
0041E5F7 68 A1E54100 push 0041E5A1
0041E5FC B8 03000000 mov eax, 3
0041E601 E8 36000000 call 0041E63C
0041E606 83C4 04 add esp, 4
0041E609 E8 A2E1FFFF call 0041C7B0
0041E60E 68 CC000152 push 520100CC
0041E613 E8 1E000000 call 0041E636
0041E618 83C4 04 add esp, 4
0041E61B 6A 00 push 0
0041E61D E8 0E000000 call 0041E630
0041E622 E8 03000000 call 0041E62A
0041E627 83C4 04 add esp, 4
0041E62A - FF25 F9B24100 jmp dword ptr [41B2F9] ; krnln.10029892
0041E630 - FF25 FDB24100 jmp dword ptr [41B2FD] ; krnln.100297FD
0041E636 - FF25 01B34100 jmp dword ptr [41B301] ; krnln.10029827
0041E63C - FF25 05B34100 jmp dword ptr [41B305] ; krnln.10028F95
0041E642 - FF25 F5B24100 jmp dword ptr [41B2F5] ; krnln.1002995A
0041E648 - FF25 E9B24100 jmp dword ptr [41B2E9] ; krnln.100297D6
0041E64E - FF25 DDB24100 jmp dword ptr [41B2DD] ; krnln.10028FBA
0041E654 - FF25 E1B24100 jmp dword ptr [41B2E1] ; krnln.10029011
0041E65A - FF25 E5B24100 jmp dword ptr [41B2E5] ; krnln.100297B7
0041E660 - FF25 EDB24100 jmp dword ptr [41B2ED] ; krnln.10029852
0041E666 - FF25 D5B24100 jmp dword ptr [41B2D5] ; krnln.10029799
。。。。。(最后一次华丽的省略抢风头)。。。。。。。。
==============================================================================================
经过上面无聊的分析后发现:
那么以后找E语言真正的OEP只要在脱壳后的程序“右键”-“查找”-“二进制字符串”
输入 “ FC DB E3 ” 就可以到真正的易语言OEP了。
==============================================================================================
找到真正的OEP后就非常方便了,我们可以搜索字符串,找到关键字就可以秒杀了。
对真正的OEP按 F4 运行到所选,之后立刻“右键”-“超级字符串参考”-“查找ascii”
就会发现很多关于注册的字样,那么究竟谁才是真正的关键字眼呢?
一般都是找注册失败的提示啊,然后改跳转让它成功。
最后我找啊找,终于下面这句才是关键语句:
超级字串参考, 项目 30
地址=0041C33D
反汇编=PUSH dumped_.004032EF
文本字串=未注册版本,您只能转换10次,请您注册此软件!
双击来到这里:
0041C33D |68 EF324000 push 004032EF ; 未注册版本,您只能转换10次,请您注册此软件!
往上看看有个je跳,是这样的:
0041C330 /0F84 48000000 je 0041C37E ;这个跳,改jmp跳过就注册了
0041C336 |68 04000080 push 80000004
0041C33B |6A 00 push 0
0041C33D |68 EF324000 push 004032EF ; 未注册版本,您只能转换10次,请您注册此软件!
0041C342 |68 01030080 push 80000301
0041C347 |6A 00 push 0
0041C349 |68 02000000 push 2
0041C34E |68 02000400 push 40002
0041C353 |68 EF000116 push 160100EF
0041C358 |68 CC000152 push 520100CC
0041C35D |68 03000000 push 3
0041C362 |BB 80000000 mov ebx, 80
0041C367 |B8 03000000 mov eax, 3
0041C36C |E8 DD220000 call 0041E64E
0041C371 |83C4 28 add esp, 28
0041C374 |C705 00229A00 0>mov dword ptr [9A2200], 1
0041C37E \6A 00 push 0
最后保存,运行,发现。。。已经注册了。。。连注册码都不用输入。。。
给同学测试,成功!
--------------------------------------------------------------------------------
【经验总结】
本文重点是讨论易语言的封装问题,突破易语言的封装去寻找用易语言编写的程序的字符串进行突破。经过这样做,才有上
面的1字节秒杀效果。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年03月21日 13:40:36
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)