"陷阱"技术探秘──动态汉化Windows技术的分析 {Z{!tR?+
<gbm
1iEe
四通利方(RichWin)、中文之星(CStar)是大家广为熟知的汉化Windows产品,"陷阱"技术即动态修改Windows代码,一直是其对外宣称的过人技术。本文从Windows的模块调用机制与重定位概念着手,介绍了"陷阱"技术的实现,并给出了采用"陷阱"技术动态修改Windows代码的示例源程序。 :PF6xL&
hy{1 Ea/T
一、发现了什么? o[E|xw
笔者多年来一直从事Windows下的软件开发工作,经历了Windows 2.0 、 3.0 、3.1 ,直至Windows 95、NT的成长过程,也遍历了长青窗口、长城窗口、DBWin、CStar、RichWin等多个Windows汉化产品。从现在看来,影响最大也最为成功的,当推四通利方的RichWin;此外,中文之星CStar与RichWin师出一门,其核心技术自然也差不多。其对外宣传采用独特的"陷阱" 技术即动态修改Windows代码,一直是笔者感兴趣的地方。 NE2P
"mY
EXEHDR是Microsoft Visual C++开发工具中很有用的一个程序,它可以检查NE(New-Exe cutable)格式文件,用它来分析RichWin的WSENGINE.DLL或CStar的CHINESE.DLL,就会发现与众不同的两点(以CStar 1.20为例): ;-!j,V+$h
*B1%-
C:\CSTAR>exehdr chinese.dll /v q[MZSg
.................................. gj-MkeI)
Tg|/UUn
6 type offset target Yl0_?.1 z
BASE 060a seg 2 offset 0000 MY"8!
PTR 047e imp GDI.GETCHARABCWIDTHS Ht=h9}x"g
PTR 059b imp GDI.ENUMFONTFAMILIES >7I"_#x1:
PTR 0451 imp DISPLAY.14 ( EXTTEXTOUT ) G[M{TS3&Ds
PTR 0415 imp KEYBOARD.4 ( TOASCII ) 86<[!ZM
PTR 04ba imp KEYBOARD.5 ( ANSITOOEM ) LyWgaf#/d
PTR 04c9 imp KEYBOARD.6 ( OEMTOANSI ) BEnIyVU;L
PTR 04d8 imp KEYBOARD.134( ANSITOOEMBUFF ) @eU5b63jM
PTR 05f5 imp USER.430 ( LSTRCMP ) l.`f^K=8
PTR 04e7 imp KEYBOARD.135( OEMTOANSIBUFF ) ym.:I@b?6
PTR 0514 imp USER.431 ( ANSIUPPER ) XpU%09K
PTR 0523 imp USER.432 ( ANSILOWER ) ud,=O Xq
PTR 05aa imp GDI.56 ( CREATEFONT ) =UMqa;\K
PTR 056e imp USER.433 ( ISCHARALPHA ) u[G`_Y{=EM
PTR 05b9 imp GDI.57 ( CREATEFONTINDIRECT ) Nr#" 5<W
PTR 057d imp USER.434 ( ISCHARALPHANUMERIC )
Tq*K
=^
PTR 049c imp USER.179 ( GETSYSTEMMETRICS ) Qvl3=[S
PTR 0550 imp USER.435 ( ISCHARUPPER ) U+wfq%Fz
PTR 055f imp USER.436 ( ISCHARLOWER ) :#&Y
PTR 0532 imp USER.437 ( ANSIUPPERBUFF ) {Jn*{5tZ>
PTR 0541 imp USER.438 ( ANSILOWERBUFF ) ?'I pR
PTR 05c8 imp GDI.69 ( DELETEOBJECT ) ~|5B
PTR 058c imp GDI.70 ( ENUMFONTS ) O[O[E}8#
PTR 04ab imp KERNEL.ISDBCSLEADBYTE X[r\ Qa
PTR 05d7 imp GDI.82 ( GETOBJECT ) ?KMGk]_<
PTR 048d imp KERNEL.74 ( OPENFILE ) W5_aS2$
PTR 0460 imp GDI.91 ( GETTEXTEXTENT ) 5w$\x+no
PTR 05e6 imp GDI.92 ( GETTEXTFACE ) &h_do8R
PTR 046f imp GDI.350 ( GETCHARWIDTH ) 1}Mdo&:t
PTR 0442 imp GDI.351 ( EXTTEXTOUT ) O{w'i|
PTR 0604 imp USER.471 ( LSTRCMPI ) _,{R3k
PTR 04f6 imp USER.472 ( ANSINEXT ) t],5{UF
PTR 0505 imp USER.473 ( ANSIPREV ) (&^k''f
PTR 0424 imp USER.108 ( GETMESSAGE ) "ukiuCfVuW
PTR 0433 imp USER.109 ( PEEKMESSAGE ) KKJ)BG?qZ
C^8n;i9
35 relocations LL"c 9jb4z
q@0g KC&U
(括号内为笔者加上的对应Windows API函数。) uk=f /nT
第一,在数据段中,发现了重定位信息。 vnOl-`Z ~
第二,这些重定位信息提示的函数,全都与文字显示输出和键盘、字符串有关。也就是说汉化Windows,必须修改这些函数。 yirQ
在这非常特殊的地方,隐藏着什么呢?毋庸置疑,这与众不同的两点,对打开"陷阱"技术之门而言,不是金钥匙,也是敲门砖。 W&`{3L
DL]\dD
二、Windows的模块调用机制与重定位概念 bHf>EU
为了深入探究"陷阱"技术,我们先来介绍Windows的模块调用机制。 <yxy ;o
Windows的运行分实模式、标准模式和增强模式三种,虽然这几种模式各不相同,但其核心模块的调用关系却是完全一致的。 `<x((@#
主要的三个模块,有如下的关系: b^q8s4(
·KERNEL是Windows系统内核,它不依赖其它模块。 lZ>j:/R8^&
·GDI是Windows图形设备接口模块,它依赖于KERNEL模块。 PRQEk.C
·USER是Windows用户接口服务模块,它依赖于KERNEL、GDI模块及设备驱动程序等所有模块。 Wt
1]9{$
这三个模块,实际上就是Windows的三个动态链接库。KERNEL有三种系统存在形式:Kern el.exe(实模式)、Krnl286.exe(标准模式)、Krnl386.exe(386增强模式);GDI模块是Gdi.ex e;USER模块是User.exe。虽然文件名都以EXE为扩展名,但它们实际都是动态链接库。同时,几乎所有的API函数都隐藏在这三个模块中。用EXEHDR对这三个模块分析,就可列出一大堆大家所熟悉的Windows API函数。 v|
Yh]y
以GDI模块为例,运行结果如下: @r=v*hu
C:\WINDOWS\SYSTEM>exehdr gdi.exe H2
Gj(Nc-
FBGe s[,
Exports: Cyu= c1D ;
|rr<4>)X
rd seg offset name fjP(r+[
............ L=# nnj-
351 1 923e EXTTEXTOUT exported, shared data }{y(&Oy3Y
56 3 19e1 CREATEFONT exported, shared data &V7