From:www.unpack.cn/thread-74240-1-1.html
在分析Borland Delphi或Borland C++程序时,一项非常重要的工作就是查找Forms中的事件处理过程,从而快速定位到目标代码。Forms通常是将DFM文件编码后以类型为"RC Data"的资源保存在可执行文档中,所以除了专用的分析软件,一些资源编辑器也可用来完成这项工作。
中文或者说双字节编码的文字在Form中是以Unicode表示的。这些分析、资源编辑/查看软件在处理Form中的Unicode时基本上采用了相同的标准流程或库:对小于0x20、等于0x27(字符"'")和大于0x7F的字符,一律通过类似SysUtils.IntToStr的调用,将Unicode值转换为十进制的字符串,前面再加一个井字符来表示,即#ddddd。
例如,以下Form片段:object f_reg: Tf_reg
...
object Label1: TLabel
...
Caption = #26426#22120#30721#65306
...
end
object Label2: TLabel
...
Caption = #36755#20837#27880#20876#30721#65306
...
end
...
end
这些字符串犹如天书,看着头大。将这些Unicode转换为ANSI,实际上就是:object f_reg: Tf_reg
...
object Label1: TLabel
...
Caption = '机器码:'
...
end
object Label2: TLabel
...
Caption = '输入注册码:'
...
end
...
end
总不至于还要准备一个编码转换软件,不断地复制粘贴、复制粘贴…,这可是体力活。或者会编程呐,就把这些个Forms保存为.dfm文件,再写个脚本来批量翻译。当然,最方便的是Patch这些软件,在中文环境中直接显示汉字。
早期DeDe的原版也不支持直接显示中文,要patch过的版本才行。以下为eXeScope(作者为日本人)中的一个Form片段,DeDe显示为:object FConf: TFConf
...
Font.Name = MS Pゴシック
...
object NextCB: TCheckBox
...
Caption =
&Don't display this message from next time;次回からはこのメッセージを表示しない(&D)
...
end
...
end
比较简单的处理,仅仅用于显示。不能编辑,也不能写回去。能保存修改的正确格式为:object FConf: TFConf
...
Font.Name = 'MS Pゴシック'
...
object NextCB: TCheckBox
...
Caption =
'&Don'#39't display this message from next time;次回からはこのメッセージを表示しない(&D' +
')'
...
end
...
end
比较简单的处理,仅仅用于显示。不能编辑,也不能写回去。能保存修改的正确格式为:object FConf: TFConf
...
Font.Name = 'MS Pゴシック'
...
object NextCB: TCheckBox
...
Caption =
'&Don'#39't display this message from next time;次回からはこのメッセージを表示しない(&D' +
')'
...
end
...
end
未经“汉化”的正确格式为:object FConf: TFConf
...
Font.Name = #65325#65331' '#65328#12468#12471#12483#12463
...
object NextCB: TCheckBox
...
Caption =
'&Don'#39't display this message from next time;'#27425#22238#12363#12425#12399#12371#12398#12513#12483#12475#12540#12472#12434#34920#31034#12375#12394#12356'(&D' +
')'
...
end
...
end
事实上,DeDe并未完善,很多功能都"Not implemented yet!",DaFixer也不再继续开发。对含有Unicode的Form的编辑根本就没有实现——点"DFM Editor"按钮试试看,会提示:
它不知道怎么处理FConf中Font.Name数据类型为0x12的内容。数据类型0x12是指Unicode字符串,UTF-8字符串的数据类型为0x14,在DFM的编码、解码标准流程中调用相同的例程。Font.Name是长度为8的Unicode字符串:004EF790: .46 6F 6E 74.2E 4E 61 6D Font.Nam
004EF7A0: 65 12 08 00.00 00 2D FF.33 FF 20 00.30 FF B4 30 e.....-.3. .0..0
004EF7B0: B7 30 C3 30.AF 30 .0.0.0
不管怎么说,那些年DeDe确是分析Delphi最好的工具。
这里将用过的、经patch的三个软件分享出来:eXeScope、XNResourceEditor和IDR(Interactive Delphi Reconstructor),前两个支持Form直接中文编辑保存,第三个软件本身仅支持查看。
1. eXeScope
版本6.50,2004/5/23发布,用Borland Delphi 7编写。有汉化版,但不支持中文显示和编辑。想来汉化的Rule No.1就是忠实于原著。
官方下载:http://hp.vector.co.jp/authors/VA003525/eXeSc650.zip
共享软件,需要注册。可参考“Exescope v6.50 注册算法分析”。
eXeScope.exe Size MD5
原版 1,018,368 BE6C523369E811E94F417F5F378F5600
补丁版 1,018,368 9B5ACE719F7640F0A075541F56188B36
2. XN Resource Editor
版本:3.0.0.1,2005/12/17发布,开源软件。用Borland Delphi 2006编写。
官方下载:http://www.btinternet.com/~wilsoncpw/xn_resourceeditor_setup.exe
之前一直用Resource Hacker,但它到版本3.6.0.92后作者停止了更新,对RCData处理不好。
个人认为这个软件好于eXeScope。
<font face="新宋体">XNResourceEditor.exe Size MD5
原版 1,945,600 A0E4B835ABA9809EE6C067C2B1A89CD0
补丁版 1,946,112 A4E7B3B03A252DDE72F9F80F7942114B</font>
3. IDR(Interactive Delphi Reconstructor)
版本:2.5.3 beta,2011/10/17发布,免费软件。用Borland C++ 2002编写。
官方网址:http://kpnc.org/idr32/en/
DeDe的继任者,强大的Delphi分析工具。能生成很好的map和注释文件,可通过插件mapimp载入OllyDbg中。
虽然仅支持Form的显示,但是“Forms(F5)”标签下提供文本和图形两种显示模式。图形模式很直观地显示窗体,且本身就能够显示中文;本Patch用于文本模式下显示中文,同时“Save Delphi Project”命令保存的.dfm文件也是中文的。
<font face="新宋体">Idr.exe Size MD5
原版 2,738,688 530140E345884616E0047C7ECDBB2F59
补丁版 2,739,200 A65EAF1C13EF7603E48F5F27F414A288</font>
Form编辑说明:
a) 无论是中文还是西文字符串,前后各用一个单引号“'”括符。
b) ASCII码小于0x20的字符,使用#dd的形式表示。
c) 如果字符串中含有字符“'”,使用#39表示。
d) 字符“+”用作续行。
中西文混合及含字符“'”的情况,参见上面例子。
Patch说明:未加壳、加密,方便交流。
a) eXeScope.exe,增加0xD1字节的patch代码在区段CODE的末尾部分,文件大小保持不变。
b) XNResourceEditor.exe,由于区段.text和.itext没有足够的空间,将文件头部增加0x200字节后,0xD1字节的patch代码放在00400400处。
c) Idr.exe,区段.text增加0x200字节后,0xE4字节的patch代码放在尾部。
下载:用附件中的文件覆盖对应软件的同名文件。 |