自由英语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”,或用内存修改法。