1000分的题,就怕没人能拿。Win16 相关(300分)

  • 主题发起人 主题发起人 Crane
  • 开始时间 开始时间
C

Crane

Unregistered / Unconfirmed
GUEST, unregistred user!
把win16的程序的EXE文件用ULTRAEDIT打开,与PE格式完全不同,但是如果
我用反汇编工具,能看到每个调用的API的名字例如:
0001.006F 8D46EC lea ax, [bp-14]
:0001.0072 8CD2 mov dx, ss
:0001.0074 52 push dx
:0001.0075 50 push ax
:0001.0076 9AFFFF0000 call USER.TRANSLATEMESSAGE
:0001.007B 8D46EC lea ax, [bp-14]
:0001.007E 8CD2 mov dx, ss
:0001.0080 52 push dx
:0001.0081 50 push ax
:0001.0082 9AFFFF0000 call USER.DISPATCHMESSAGE
:0001.0087 E9CBFF jmp 0055

但是几乎所有的API都用9AFFFF0000来载入,请问原因是什么?我如何从WIN16的EXE中
把这些函数名解释出来?
 
9AFFFF0000不是地址,而是机器码.
两个完全一样的指令的机器码所对应的机器码当然是一样的.
 
没研究。
 
LeeChange;
9A是call,后面是地址
:0001.0076 9AFFFF0000 call USER.TRANSLATEMESSAGE
:0001.0082 9AFFFF0000 call USER.DISPATCHMESSAGE
这两个指令一样么??好久没来大富翁了,用这个tip测测现在的水平,乱灌水可没分呕。
现在坛子里最强的是谁啊,打听一下。关键在于“我如何从WIN16的EXE中
把这些函数名解释出来?”
 
参考<window未公开核心技术>(书名记不太清楚了)
网上有下载
这方面的技术,已经很久没看了。
希望有人能帮你解决.
 
你是看到的是静态数据,当系统加载时会对它进行修改9A xxxx xxxx,而修改的依据
就在NE文件头中描述中,给你一个简单的文件格式说明,参考一下吧
// EXE 文件头
struct HeadEXE
{
WORD wType; // 00H 'MZ'
WORD wLastSecSize; // 02H 最后扇区被使用的大小
WORD wFileSize; // 04H 文件大小
WORD wRelocNum; // 06H 重定位项数
WORD wHeadSize; // 08H 文件头大小
WORD wReqMin; // 0AH 最小所需内存
WORD wReqMax; // 0CH 最大所需内存
WORD wInitSS; // 0EH SS 初值
WORD wInitSP; // 10H SP 初值
WORD wChkSum; // 12H 校验和
WORD wInitIP; // 14H IP 初值
WORD wInitCS; // 16H CS 初值
WORD wFirstReloc; // 18H 第一个重定位项位置
WORD wOverlap; // 1AH 覆盖
WORD wReserved[0x20];//1CH
WORD wNEOffset; // 3CH NE 头位置
};


// NE 文件头
struct HeadNE
{
WORD wType; // 'NE'
BYTE wLinkerVerMajor;
BYTE wLinkerVerMinor;
WORD wEntryOffset;
WORD wEntrySize;
DWORD dReserved;
// wModelFlag : b15 - -EXE/DLL, 其它位指定 286/386 指令等
WORD wModelFlag;
WORD wDGROUPseg;
WORD wInitLocalHeapSize;
WORD wInitStackSize;
WORD wInitIP;
WORD wInitCS;
WORD wInitSP;
WORD wInitSS;
WORD wSegTableEntrys;
// wModelRefEntrys : 1eh ModelRef 通常为 DLL 文件
WORD wModelRefEntrys;
WORD wNoResdNameTableSize;
WORD wSegTableOffset;
WORD wResourceOffset;
WORD wResdNameTableOffset;
// 28h 指向一个表的指针,表项为从表末开始的以 WORD 为单位的偏移量
// 表项内容为 PASCAL 字符串,但不含文件名后缀。
// Windows查找DLL 文件的顺序为: Windows 目录, System目录, 指定的
// 目录, Path, 网络映射.
WORD wModelRefOffset;
WORD wInputNameTableOffset;
DWORD wNoResdNameTableOffset;
WORD wMovableEntrys;
WORD wSegStartOffset;
WORD wResTableEntrys;
// 0 - 未知, 1 - OS/2 1.x, 2 - Windows 3.x, 4 - DOS 4 欧洲版
BYTE bOperatingSystem;
BYTE bExtFlag;
WORD wFLAOffsetBySector; // 快速装入区,Windows 专用
WORD wFLASectors; // Windows 专用
WORD wReserved;
WORD wReqWindowsVer; // Windows 专用
};
 
tseug:让你贴那么多实在不好意思,不过关于NE,DOS的文件头我有更详细的文档,
问题就在于怎么根据头文件找到这个程序所使用的API。
另外你对028h的描述不正确,还有一些描述错位了。
请从http://www.rosprombank.ru/~ig/ne.html下载
正确文档。
28h Specifies a relative offset from the beginning of the
Windows header to the beginning of the
module-reference table.
共同进步,谢谢。
 
多谢指点,我手头的资料很全,只不过我的小猫太慢,连336都达不到...只好找了个简单的发上来..
 
那麻烦你帮我查一下,从一个win16的exe文件中如何能够找到它所调用过的API吗?
 
Imported Names Table

Each entry in the imported names table is a counted string that names an
imported function or a module that contains imported functions. Imported
functions are dynamically linked at load time.

The offset of the beginning of each module name is given by the
corresponding word in the module reference table. The offsets of function
names are found within relocation records.

Module Reference Table

The module reference table consists of a series of word-size (16-bit)
entries. Each entry is the offset of a module name in the imported names
table. The number of entries in the module reference table that is, the
total number of modules from which functions are imported is found at
offset 1EH in the new EXE header.
 
tseng,我已经基本知道方法了,哎,大富翁!
不过我还是想看看谁能答出来,下个星期封题。
不行的话,老猫,cakk,你们谁有空就把这300分拿走吧。
 
第二天了,没人能答。
 
第4天了,没人能答
 
斑竹过来拿分。
 
因为是调用同一个user.dll
 
早就解决了,结账
 

Similar threads

后退
顶部