自由英语XP 脱壳&pj手记
Cracked By WksWlj999@Sohu.com
[SHADOW=255,blue,1]感谢67676767兄提供程序下载地址[/SHADOW]
***************************************************
软件名称:自由英语XP
0.9.7 Buid 761:
下载地址:http://www.ynxx.com/estudy
大 小:4.04MB
加密方式:Aspack
2.12 + Lock98 1.00.28 + 注册码
使用工具:SoftICE 4.05 For Win9X,TRW2000 1.23
RegMon,GUW32
1.0 Beta8,eXeScope6.10,Hiew6.81
pj日期:2002年7月19日
***************************************************
软件说明:本软件不但为学习者提供了一个能够实现英语复读、听力对比、写作练习等功能的完全虚拟的学习平台,而且还具备电脑录音、电脑复读、英语听写等多种语言处理功能,使学习者通过自由地听、写、读、背等练习,全面提高听、说、读、写、译的能力,并解决了困扰中国人英语学习中"聋哑英语"的难题,从而使学习者找到一种真正适合自己的英语学习方法。
提供两种pj方法:
(1)先脱壳主程序,再pj
安装后用FileInfo2.5r查看EStudy.exe和ESrun.dll都是ASPACK
2.12加的壳。
UASPACK1091无法识别类型,GUW32 1.0beta8也不行。看来只有手动脱壳啦。以前脱过ASPACK2.001和2.1的壳,感觉不是很难。试试......
手动脱壳:
用TRW2000
1.23加载EStudy.exe,停在入口处,用F8和F10交替使用,注意有一些CALL指令是JMP指令的变形,只能用F8,不能用F10,否则会跑丢的!判断方法是CALL的地址与他本身很接近。好象这个版本有动态地址保护,另外遇到一些循环时,注意循环中的一些条件跳转指令,如果有的跳转地址可以跳出循环,可以试试G
XXXXXXXX命令,往往可以快速跳出循环,总之,这个入口点还是比较好找,最后跳出一个大循环后来到这里:
......
017F:0064038F
8B9522040000 MOV EDX,[EBP+0422]
017F:00640395
E9EBFEFFFF JMP 00640285
017F:0064039A
B8A0C02300 MOV EAX,0023C0A0<==真正入口点的相对偏移
017F:0064039F
50 PUSH EAX
017F:006403A0
038522040000 ADD EAX,[EBP+0422]
017F:006403A6
59 POP ECX
017F:006403A7
0BC9 OR ECX,ECX
017F:006403A9
8985A8030000 MOV [EBP+03A8],EAX <==过了这一句后006403BA处的指令由PUSH
DWORD 00变为PUSH DWORD 0063C0A0
017F:006403AF 61
POPA <==与PUSHA对应,找到它离入口点就不远了
017F:006403B0
7508 JNZ 006403BA<==跳
017F:006403B2
B801000000 MOV EAX,01
017F:006403B7
C20C00 RET 0C
017F:006403BA
6800000000 PUSH DWORD 0063C0A0<==真正入口点
017F:006403BF
C3 RET <==过了这个RET就是真正入口点,可以看到明显的领空跳转
好了知道了真正的入口点,我们就可以脱壳了,加载EStudy.exe下命令G
63C0A0,来到入口点,下命令PEDUMP D:\DUMP.exe成功dump出来原始大小1.25MB脱壳后2.26MB,这里不能用MAKEPE命令,会出错。脱壳后程序运行正常,用EXESCOPE6.10查看资源除了图标和版本资源外其他资源都可以正常显示了。再用FI2.5r查看发现脱掉ASPACK2.12壳后的程序还有一个LOCK98
1.00.28的壳,这个壳用GUW32 1.0beta8很快搞定,至此程序完全脱壳,FI2.5r显示为Borland Delphi程序。
开始pj
用eXeScope6.10打开全脱壳程序,在RCData资源中的TREGISTERFORM下找这项:
object BtnRegister: TButton<==“立即注册”按钮
Left = 335
Top = 168
Width = 72
Height = 23
Caption = #31435#21363#27880#20876
Enabled = False
TabOrder = 1
OnClick = BtnRegisterClick<==当按下“立即注册”后程序要调用的过程
end
用16进制编辑器HIEW6.81打开程序,查找字串"BtnRegisterClick",找到四处:
第一处:
?00508F70:
46 6F 72 6D-53 68 6F 77-17 00 B0 93-50 00 10 42 FormShow 皳P B
?00508F80:
74 6E 52 65-67 69 73 74-65 72 43 6C-69 63 6B 16 tnRegisterClick
第二处:
?00509890:
6B 17 00 64-9B 50 00 10-42 74 6E 52-65 67 69 73 k d汸 BtnRegis
?005098A0:
74 65 72 43-6C 69 63 6B-12 00 74 9B-50 00 0B 4C terClick t汸 L
第三处:
?005B64E0:
72 64 65 72-02 01 07 4F-6E 43 6C 69-63 6B 07 10 rderOnClick
?005B64F0:
42 74 6E 52-65 67 69 73-74 65 72 43-6C 69 63 6B BtnRegisterClick
?005B6500:
00 00 07 54-42 75 74 74-6F 6E 08 42-74 6E 43 6C TButtonBtnCl
第四处:
?00637680:
08 54 61 62-4F 72 64 65-72 02 01 07-4F 6E 43 6C TabOrderOnCl
?00637690:
69 63 6B 07-10 42 74 6E-52 65 67 69-73 74 65 72 ickBtnRegister
?006376A0:
43 6C 69 63-6B 00 00 07-54 42 75 74-74 6F 6E 09 Click TButton
三,四两处是资源本身,一,二两处在地址表中,观察一处,在字串"BtnRegisterClick"前有一个字节"10"这个代表字串长度为16位,其前面有个DWORD值"B0 93 50 00",这个就是OnClick = BtnRegisterClick过程在内存中的地址,倒过来就是"005093B0",同理找到第二处的地址为"00509B64".(注:这些地址也可以用DeDe2.5很方便的找到,若你没有或不会用DeDe就按上面的方法找吧)
现在打开TRW2000下断点"bpx 005093b0"和"bpx 00509b64",运行主程序随便输入注册号"12345-23456-34567-45678-56789",点"立即注册",TRW2000拦截中断在017F:005093b0处:
017F:005093B0
55 PUSH EBP<==停在这里
017F:005093B1
8BEC MOV EBP,ESP
017F:005093B3
33C9 XOR ECX,ECX
017F:005093B5
51 PUSH ECX
017F:005093B6
51 PUSH ECX
017F:005093B7
51 PUSH ECX
017F:005093B8
51 PUSH ECX
017F:005093B9
51 PUSH ECX
017F:005093BA
53 PUSH EBX
017F:005093BB
56 PUSH ESI
017F:005093BC
8BF2 MOV ESI,EDX
017F:005093BE
8BD8 MOV EBX,EAX
017F:005093C0
33C0 XOR EAX,EAX
017F:005093C2
55 PUSH EBP
017F:005093C3
68CD945000 PUSH DWORD 005094CD
017F:005093C8
64FF30 PUSH DWORD [FS:EAX]
017F:005093CB
648920 MOV [FS:EAX],ESP
017F:005093CE
8D55FC LEA EDX,[EBP-04]
017F:005093D1
8B8320030000 MOV EAX,[EBX+0320]
017F:005093D7
E86067F4FF CALL 0044FB3C
017F:005093DC 8B45FC
MOV EAX,[EBP-04]
017F:005093DF
50 PUSH EAX<==[eax]="45678"
017F:005093E0
8D55F8 LEA EDX,[EBP-08]
017F:005093E3
8B8324030000 MOV EAX,[EBX+0324]
017F:005093E9
E84E67F4FF CALL 0044FB3C
017F:005093EE 8B45F8
MOV EAX,[EBP-08]
017F:005093F1
50 PUSH EAX<==[eax]="56789"
017F:005093F2
8D55F4 LEA EDX,[EBP-0C]
017F:005093F5
8B831C030000 MOV EAX,[EBX+031C]
017F:005093FB
E83C67F4FF CALL 0044FB3C
017F:00509400 8B45F4
MOV EAX,[EBP-0C]
017F:00509403
50 PUSH EAX<==[eax]="34567"
017F:00509404
8D55F0 LEA EDX,[EBP-10]
017F:00509407
8B8318030000 MOV EAX,[EBX+0318]
017F:0050940D
E82A67F4FF CALL 0044FB3C
017F:00509412 8B45F0
MOV EAX,[EBP-10]
017F:00509415
50 PUSH EAX<==[eax]="23456"
017F:00509416
8D55EC LEA EDX,[EBP-14]
017F:00509419
8B8314030000 MOV EAX,[EBX+0314]
017F:0050941F
E81867F4FF CALL 0044FB3C
017F:00509424 8B45EC
MOV EAX,[EBP-14]<==[ebp-14]="12345"
017F:00509427
5A POP EDX
017F:00509428
59 POP ECX
017F:00509429
E806270100 CALL 0051BB34
017F:0050942E 8B1594735200
MOV EDX,[00527394]
017F:00509434 8902
MOV [EDX],EAX
017F:00509436
A194735200 MOV EAX,[00527394]
017F:0050943B
8138B8220000 CMP DWORD [EAX],22B8<==关键比较,这里把[eax]指向地址0030:0051E47C的
017F:00509441
740D JZ 00509450
值改为B8 22 00 00,即可注册成功.
017F:00509443 A194735200
MOV EAX,[00527394]
017F:00509448 81380F270000
CMP DWORD [EAX],270F
017F:0050944E 754A
JNZ 0050949A
017F:00509450 A154795200
MOV EAX,[00527954]
017F:00509455 8B00
MOV EAX,[EAX]
017F:00509457
8BD6 MOV EDX,ESI
......
017F:0050949A
6A00 PUSH BYTE +00
017F:0050949C
B9DC945000 MOV ECX,005094DC
017F:005094A1
BA3C955000 MOV EDX,0050953C
017F:005094A6
A12C775200 MOV EAX,[0052772C]
017F:005094AB
8B00 MOV EAX,[EAX]
017F:005094AD
E8BA78F6FF CALL 00470D6C<==注册错误对话框!
017F:005094B2
33C0 XOR EAX,EAX
017F:005094B4
5A POP EDX
注册成功后,程序把注册表HKEY_LOCALMACHINE\SoftWare\ynxx\EStudy\RegInfo="Unregistered Version"改为"yi8z2k0d2k4jg595g71jg551h91ehbtwhd18"
(2)对不脱壳的主程序的直接pj
用RegMon监控发现程序对注册表键值HKEY_LOCALMACHINE\SoftWare\ynxx\EStudy\RegInfo="Unregistered Version"的可疑读操作,猜测程序会把读到的数据与正确的信息进行比对以确定是否以注册版方式运行,所以在SoftICE中下条件断点"bpx regqueryvalueexa if *(esp->8)=='RegI' do "d esp->14"",这个断点的作用是当有程序读取注册表中前四位为"RegI"的键值时,SoftICE将中断并显示读出的数据.运行程序,SoftICE中断,F12返回程序领空,查看数据区是否为"Unregistered Version",若没有就继续F5运行程序,在第三次中断时发现读取的正是RegInfo,这时"Unregistered Version"字串的地址是0030:00EB21F8,下一步程序肯定要对这个地址进行读操作来比对,所以先bc *清除以前的断点,下地址断点"bpm eb21f8",F5后中断在下面:
017F:00409FCE
8BC0 MOV
EAX,EAX
017F:00409FD0 89FA
MOV EDX,EDI
017F:00409FD2 89C7
MOV
EDI,EAX
017F:00409FD4 B9FFFFFFFF MOV
ECX,FFFFFFFF
017F:00409FD9 32C0
XOR AL,AL
017F:00409FDB
F2AE REPNZ SCASB<==停在这里,在计算字串的长度,不赶兴趣,继续F5
017F:00409FDD
B8FEFFFFFF MOV EAX,FFFFFFFE
017F:00409FE2
29C8 SUB
EAX,ECX
017F:00409FE4 89D7
MOV EDI,EDX<==edi=14h(即十进制的20,“Unregistered
Version”不是20位吗!)
017F:00409FE6 C3
RET
再次中断停在下面:
017F:00404F57
7426 JZ
00404F7F
017F:00404F59 8B0E
MOV ECX,[ESI]
017F:00404F5B
8B1F MOV
EBX,[EDI]
017F:00404F5D 39D9
CMP ECX,EBX<==停在这里,往上看发现ecx来自[esi],"d
esi"看到一长串字符
017F:00404F5F 7558
JNZ 00404FB9 "yi8z2k0d2k4jg595g71jg551h91ehbtwhd18"
017F:00404F61
4A DEC
EDX 而ebx来自[edi],"d edi"看到是"Unregistered
Version"
017F:00404F62 7415
JZ 00404F79
017F:00404F64 8B4E04
MOV ECX,[ESI+04]
017F:00404F67
8B5F04 MOV
EBX,[EDI+04]
017F:00404F6A 39D9
CMP ECX,EBX
017F:00404F6C 754B
JNZ
00404FB9
先记下这串可疑字串,再次F5运行程序又中断在017F:017F:00404F5D处,这次"d esi"发现变为"yi8z2k0d2k4jg595g71jg551020y04ocw4oc"而"d edi"看到的仍然是"Unregistered Version",再次F5把控制权交还给程序,程序运行了,SoftICE没用中断.下面打开注册表找到"RegInfo"将键值改为"yi8z2k0d2k4jg595g71jg551h91ehbtwhd18",然后运行程序,打开"关于"菜单,哈哈~~~~显示为"已注册版本"!!!而改为第二次发现的字串"yi8z2k0d2k4jg595g71jg551020y04ocw4oc"后运行程序,发现也是注册版,不过在关于里显示的是"友情注册版"。
[SHADOW=255,blue,1]补充说明:关于自由英语XP1.00 Build 778版的pj[/SHADOW]
关于自由英语XP1.0
Build 778版本,加密方式与0.97版一样,关键比对在0050e603,0050e610,0050e61d,对比成功后,分别为“友情注册版”“已注册版”“60天试用版”。
破解方法:脱壳后用二进制编辑器查找“8138611E0000741AA198245300”改为“C700B8220000C700B822000090”,或用内存修改法。