首页
社区
课程
招聘
[己解决]请教分析一下某dll在98系统下加载失败的大致原因
发表于: 2009-11-6 23:20 4483

[己解决]请教分析一下某dll在98系统下加载失败的大致原因

2009-11-6 23:20
4483
某一仅3k的dll,无源码,xp下LoadLibrary返回正确的HMODULE,在98下返回NULL。
此dll导入表如下:
KERNEL32.dll
     lstrlenA
     MultiByteToWideChar
USER32.dll
     wsprintfA
ole32.dll
     CoInitialize
     CoCreateInstance
用OD的loaddll加载,停在dll模块入口,入口代码如下
xor eax, eax
inc eax
ret
单步跟踪下去,先是很诡异地ret到了ole32.dll的空间,然后一直到ret到kernel32.dll的空间就跟踪不下去了(98下面kernel32.dll在大于0x80000000的内存部分)

初步判断应该不是因为导入了98不支持的API函数的缘故,那几个导入函数所引用的dll在其导出函数表都有。另外也应该不是DllMain里面执行了什么非法语句,因为dll模块入口就一个return 1。那么到底可能是因为什么原因导致这个dll加载失败呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
在dll的EP处单步跟踪到ret,结果返回到ole32.dll的原因找到了。其实它原本也是要返回到kernel32的空间的,这可以通过堆栈观察出来,但是由于98系统kernel32在ring0空间,OD下不了断点,结果跑飞了,恰好在ole32处因未知原因停了下来,所以就误以为是“诡异的ret到ole32里面去了”。
不过为什么98系统不能加载这个dll的原因还是没找到。
2009-11-7 12:16
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
GetLastError() 看看值
2009-11-7 16:10
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
LastError=1114,A dynamic link library (DLL) initialization routine failed.
不过OD跟踪发现DllMain里面也就一个return 1,怎么会初始化例程失败?
2009-11-7 20:31
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
联系了一下作者,找到原因了。作者自己指定了入口,不过入口函数忘加__stdcall修饰,导致函数返回时堆栈不平衡,在98下面就加载失败了。那三句汇编最后一句本该是ret 0C的,可惜我经验不足,完全没往堆栈平衡上面想。
2009-11-9 15:35
0
游客
登录 | 注册 方可回帖
返回
//