【文章标题】: 破解Dr.eye的日语翻译限制
【文章作者】: kaien
【软件名称】: Dr.eye 译典通 2005
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【使用工具】: OD,Ultraedit
【操作平台】: winxp
【软件介绍】: 词典翻译软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【前面的话】
  Dr.eye是一款翻译软件,本人感觉还是挺好用的。
  她支持英汉日三语的单词互译和文本翻译功能,当然还有其它很多不错的功能。
  然而,美中不足的是,这个软件的非正式用户不能支持日语的翻译功能。
  事实上,除了“即时词典”功能支持日语单词翻译之外。其他的日语句子和日语文件的翻译功能都不可用。
  虽然日本人可恶之极,但是软件本身没有错。三大功能缺少一项总是不够完美。所以本人就动手看看能否解决这个问题。

【详细过程】  
  先来看看运行日语翻译功能会发生什么?让我们来找找线索。
  就以“全文翻译”这个功能为例。
  写入一个句子“我是中国人”,然后 按“简日”
  弹出对话框“Are you register?”,看来这就是我们的线索和切入点了
  打开OD,通过附加选单可以看到这个程序的文件地址。
  我的电脑里面是这样的信息:
  
  未命名的窗口, 条目 31
   进程=0000082C
   名称=tranedit
   窗口=全文翻译 - [原文∏File1   译文∏]
   路径=D:\PROGRAM FILES\INVENTEC\DREYE\DREYEMT\tranedit.exe
  
  我们看到,“全文翻译”的启动程序是DREYEMT文件夹里面的tranedit.exe文件。
  下面,我们先找到这个文件,然后就开始对这个文件下手了。
  
  1、察壳
  先用PEid查壳,有壳的话最好先脱壳。我们发现这个程序没有壳,Microsoft Visual C++ 6.0编写。
  
  2、OD加载
  先查找一下文本子串参考,看看是否有“Are you register?”字串。
  很可惜!我们没有发现这个字串。
  那么下面该怎么办呢?
  根据前面的分析,在我看来,我们可以有两种方法设断点。
  一、设按钮的消息断点。在程序弹出错误对话框上的“确定”按键设置WM_LBUTTONUP消息断点。
  二、设置内存断点。在内存中查找“Are you register?”字串,找到的话就可以设置内存访问断点。
  我使用了内存断点。消息断点也很简单,篇幅所限,本文暂且不提。
  下面的问题就是如何设内存断点呢?
  
  3、内存断点
  先F9运行,输入"我是中国人"。按“简日”
  程序弹出错误对话框“Are you register?”
  先不要关闭这个对话框。Alt+M察看内存。搜索ASCII字串 “Are you Register”
  我们会发现两处。
  
  第一处:
  023D0204  41 72 65 20 79 6F 75 20 52 65 67 69 73 74 65 72  Are you Register
  023D0214  3F 00 00 00 55 73 65 72 44 69 63 74 43 45 2E 69  ?...UserDictCE.i
  023D0224  64 74 00 00 55 73 65 72 44 69 63 74 45 43 2E 69  dt..UserDictEC.i
  
  第二处:
  0258C32C  41 72 65 20 79 6F 75 20 52 65 67 69 73 74 65 72  Are you Register
  0258C33C  3F 00 00 00 A1 A2 00 00 D7 DC 00 00 B8 B1 00 00  ?...、..总..副..
  0258C34C  D5 FD 00 00 C5 AE 00 00 C4 D0 00 00 2D 2C 3A 2E  正..女..男..-,:.
  
  我们应该在第二处下内存断点。
  
  4、跟踪破解
  再次输入“我是中国人”,按“简日”
  程序被断下来了。位置是USER32.dll的领空
  77D2204F                                 8A08                              mov cl,byte ptr ds:[eax] <-我们断在这个位置。
  77D22051                                 40                                inc eax
  77D22052                                 84C9                              test cl,cl
  77D22054                               ^ 75 F9                             jnz short USER32.77D2204F
  77D22056                                 2BC2                              sub eax,edx
  寄存器里会看到
  EAX和EDX都是 ASCII "Are you Register?"
  
  我们F8一步步运行,我们很快就会来到这里
  77D66052                                 FF75 F8                           push dword ptr ss:[ebp-8]
  77D66055                                 FF75 FC                           push dword ptr ss:[ebp-4]
  77D66058                                 FF75 08                           push dword ptr ss:[ebp+8]
  77D6605B                                 E8 E1FEFFFF                       call USER32.MessageBoxTimeoutW <-运行这句指令就是MessagBox了。
  77D66060                                 FF75 FC                           push dword ptr ss:[ebp-4]
  
  上面那句MessageBoxTimeoutW不能执行。执行了就是消息框了。
  我们暂时采取一些“非常措施”,跳过这句指令。
  让我们直接到这句指令的下面一句,即77D66060处。
  我的方法是把这句nop掉。
  我们来到这里
  77D66060                                 FF75 FC                           push dword ptr ss:[ebp-4]
  注意,这时我们仍然在USER32.dll的领空,我们需要回到程序领空,或者至少要回到和程序有关的模块的领空。
  继续F8,很快就会跳出USER32.dll领空,进入MFC42.dll领空。
  继续F8,很快就会到达一个崭新的领空 TransC_1程序来到这里
  
  02351E9D                                 85C0                              test eax,eax
  02351E9F                                 74 42                             je short TransC_1.02351EE3
  02351EA1                                 53                                push ebx
  02351EA2                                 53                                push ebx
  02351EA3                                 68 2CC33802                       push TransC_1.0238C32C                             ; ASCII "Are you Register?"
  02351EA8                                 891D E41A3A02                     mov dword ptr ds:[23A1AE4],ebx
  02351EAE                                 E8 CF750300                       call <jmp.&MFC42.#1200_AfxMessageBox>
  02351EB3                                 8D4C24 04                         lea ecx,dword ptr ss:[esp+4]  <-停在这个位置
  02351EB7                                 885C24 14                         mov byte ptr ss:[esp+14],bl
  
  向上看一下,我们看到上面就是调用错误对话框的代码了。
  我们注意到,程序在运行到 02351E9D 处会做比较。如果eax=0就会跳过错误对话框调用。
  我们直接把je short TransC_1.02351EE3 改为 jmp short TransC_1.02351EE3
  然后重新运行看看效果。
  太好了,日语翻译的限制解除了。 
  我们得到了翻译结果 “私は中国人だ ”
  
  5、修改文件
  下面要做什么呢?当然是把修改的地方保存起来了。
  直接用OD把修改的地方保存可以吗?
  答案是不可以。
  因为直接保存的后果就是死机。
  
  那该怎么办呢?当然是手动修改了。
  先记住一段代码
  02351E9D                                 85C0                              test eax,eax
  02351E9F                                 74 42                             je short TransC_1.02351EE3
  02351EA1                                 53                                push ebx
  02351EA2                                 53                                push ebx
  
  16进制编码为 85C074425353 记下来。这段代码要选的尽量长一些,以减少重复的可能性。
  然后下一步就是修改文件内容了。
  下面,问题来了。要改哪个文件呢?
  当然是TransC_1了。那么TransC_1又是什么文件?
  
  Alt+E察看可执行模块。列表中查找模块名称TransC_1,我们找到模块信息如下:
  
  Executable modules, 条目 7
   基址=02350000
   大小=00337000 (3371008.)
   入口=023898C9 TransC_1.<模块入口点>
   名称=TransC_1
   文件版本=1, 0, 0, 1
   路径=D:\Program Files\Inventec\Dreye\DreyeMT\sdk\bin\TransCOM.dll
  
  看到了吗?这个模块的相对路径是DreyeMT\sdk\bin\TransCOM.dll
  也就是说我们需要修改的地方并不在我们调试的启动文件tranedit.exe中,而是在TransCOM.dll模块里。
  
  
  下面的步骤简单了,Ultraedit打开文件TransCOM.dll模块,搜索85C074425353,然后把74改称EB,即把je指令改为jmp指令。
  保存文件,测试运行,一切正常。^_^
  
  再测试一下其他关于日语翻译的功能,全部运行正常。
  看来这个TransCOM.dll模块是关键中的关键。所有的日语支持功能全都需要调用这个模块。
  好了,就到这里了。
  
  破解完毕,收工休息。^_^
  希望我讲解的足够清晰、详实,也希望大家能够喜欢。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年01月10日 15:36:20