陷阱技术探秘----动态汉化Windows技术的分析(2) PTR 0460imp GDI.91( GETTEXTEXTENT) PTR 05e6imp GDI.92( GETTEXTFACE) PTR 046fimp GDI.350 ( GETCHARWIDTH ) PTR 0442imp GDI.351 ( EXTTEXTOUT ) PTR 0604imp USER.471( LSTRCMPI ) PTR 04f6imp USER.472( ANSINEXT ) PTR 0505imp USER.473( ANSIPREV ) PTR 0424imp USER.108( GETMESSAGE ) PTR 0433imp USER.109( PEEKMESSAGE) 35 relocations *******扩号内为作者加上的对应WindowsAPI函数 第一,在数据段中,发现了重定位信息。 第二,这些重定位信息提示的函数,全都与文字显示 输出和键盘,字符串有关。也就是说汉化Windows,必须修改这些函数。 在这非常特殊的地方,隐藏着什么呢?无庸致疑,这与众不同的两点,对打开“陷阱”技术之门而言,不是金钥匙,也是敲门砖。 二、Windows的模块调用机制与重定位概念 为了深入探究“陷阱”技术,我们先来介绍Windows的模块调用机制。Windows的运行分实模式(RealMode),标准模式(StandMode)和增强模式(386EnhancedMode)三种,虽然这几种模式各不相同,但其核心模块的调用关系却是完全一致的。 主要的三个模块,有如下的关系: KERNEL是Windows系统内核,它不依赖其它模块。 GDI是Windows图形设备接口模块,它依赖于KERNEL模块。 USER是Windows用户接口服务模块,它依赖于KERNEL,GDI模块及设备驱动程序等所有模块。 这三个模块,实际上就是Windows的三个动态连接库,在系统的存在形式如下,KERNEL有三种不同形式,Kernel.exe(实模式),Krnl286.exe(标准模式),Krnl386. exe(386增强模式);GDI模块是Gdi.exe;USER模块是User.exe,虽然文件名都以EXE为扩展名,但它们实际都是动态连接库。 同时,几乎所有的API函数都隐藏在这三个模块中。用EXEHDR对这三个模块分析,就可列出一大堆你所熟悉的WindowsAPI函数。 以GDI模块为例, C:\WINDOWS\SYSTEM>exehdr gdi.exe EXPorts: ord seg offset name ............ 351 1923eEXTTEXTOUT exported, shared data 56 319e1CREATEFONT exported, shared data ............ 至此,你已能从Windows纷繁复杂的系统中,理出一些头续来。下面,再引入一个重要概念——重定位。 一个Windows执行程序对调用API函数,或对其它动态库的调用,在程序装入内存前,都是一些不能定位的动态连接,当程序调入内存时,这些远调用都需要重新定位,重新定位的依据就是重定位表。在Windows执行程序(包括动态库)的每个段后面,通常都跟有这样一个重定位表。重定位包含调用函数所在模块,函数序列号,以及定位在模块中的位置。 例如,用EXEHDR/v分析CHINESE.DLL得到 6 type offset target .......... PTR 0442imp GDI.351 .......... 就表明,在本段的0442H偏移处,调用了GDI的第351号函数。如果在0442H处是0000:FFFF,则表示,本段内仅此一处调用了GDI.351函数,否则,表明了本段内还有一处调用此函数,调用的位置就是0442H处所指向的内容,实际上重定位表只含有引用位置的链表的链头。那么,GDI.351是一个什么函数呢?还是用EXEHDR对GDI.EXE作一分析,就可得出,在GDI的出口(Export)函数中,第351号是ExtTextOut。