cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:2163回复:19

驱动层如何得到dll的地址呢/

楼主#
更多 发布于:2005-05-19 14:08
在驱动层如何得到如ntdll.dll,kernel32.dll等动态库地址呢?

Note: 不使用ZwOpenFile,ZwCreateSection,ZwMapViewOfSection等方法.

最新喜欢:

anglesangles
走走看看开源好 Solaris vs Linux
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-22 11:36
在驱动层如何得到如ntdll.dll,kernel32.dll等动态库地址呢?

Note: 不使用ZwOpenFile,ZwCreateSection,ZwMapViewOfSection等方法.

难道用硬编码吗? ;)
开个玩笑
下面是正题
不过我觉得还不如ZwOpenFile,ZwCreateSection,ZwMapViewOfSection这个方法呢
可以查找引用ntdll.dll,kernel32.dll的进程的模块列表,然后到用户空间去按PE头定位,操作用户区的地址需要注意安全哟 ;)
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2005-05-23 13:17
想知道有没有其他办法还能达到相同的目的.

走走看看开源好 Solaris vs Linux
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-23 15:35
看不懂。ZwOpenFile和dll有什么关系?
[b]万水千山总是情,回个帖子行不行?[/b]
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-25 18:37
偶也被这个问题难住了,大虾们能详细说说吗:)?
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-26 09:38
ULONG GetModuleBase(const char *Mod)
{
ULONG  i;
PSYSTEM_MODULE_INFORMATION pModInfo;
PULONG p;
ULONG Base = 0;

ZwQuerySystemInformation( SystemModuleInformation, &i, 0, &i ); // system module info
p = (PULONG)ExAllocatePool(NonPagedPool, sizeof(ULONG)*i);
if (!p) return 0;

ZwQuerySystemInformation( SystemModuleInformation, p, i * sizeof(*p), 0);
pModInfo = (PSYSTEM_MODULE_INFORMATION)p;

for (i=0; i<*p; i++)
{
if (!_stricmp((char*)pModInfo->aSM.abName + pModInfo->aSM.NameOffset, Mod))
{
Base = (ULONG)pModInfo->aSM.ImageBaseAddress;
break;
}
}

ExFreePool(p);
return Base;
}


从iceext里面扒出来的代码,在2K,XP32位,2k3 32位下都没问题
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2005-05-26 11:55
楼上的方法能够得到模块的地址。
走走看看开源好 Solaris vs Linux
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-26 12:02
谢谢楼上2位老大,Mod 是指模块名称吗?
比如\"kernel32.dll\"?
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-26 12:18
mod就是需要查找模块加载地址的模块名,这种方法只能得到被SYSTEM进程加载的模块加载地址
如果想得到任意进程加载模块信息,可以在PEB里找,或者试试LdrQueryProcessModuleInformation(OUT PSYSTEM_MODULE_INFORMATION SystemModuleInformationBuffer,
 IN ULONG        BufferSize,
 OUT PULONG      RequiredSize)

这个函数不保险
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-26 12:37
偶用DDK编译出错:(
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2624) : error C4013: \'ZwQuerySystemInformation\' undefined; assuming extern returning int
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-26 13:09
偶用DDK编译出错:(
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2624) : error C4013: \'ZwQuerySystemInformation\' undefined; assuming extern returning int
 


NTSYSAPI  
NTSTATUS
NTAPI ZwQuerySystemInformation (
SYSTEMINFOCLASS sic,
PVOID           pData,
ULONG           dSize,
PULONG          pdSize);


typedef enum _SYSTEMINFOCLASS
{
    SystemBasicInformation,             // 0x002C
SystemProcessorInformation,         // 0x000C
SystemPerformanceInformation,       // 0x0138
SystemTimeInformation,              // 0x0020
SystemPathInformation,              // not implemented
SystemProcessInformation,           // 0x00C8+ per process
SystemCallInformation,              // 0x0018 + (n * 0x0004)
SystemConfigurationInformation,     // 0x0018
SystemProcessorCounters,            // 0x0030 per cpu
SystemGlobalFlag,                   // 0x0004
SystemInfo10,                       // not implemented
SystemModuleInformation,            // 0x0004 + (n * 0x011C)
SystemLockInformation,              // 0x0004 + (n * 0x0024)
SystemInfo13,                       // not implemented
SystemPagedPoolInformation,         // checked build only
SystemNonPagedPoolInformation,      // checked build only
SystemHandleInformation,            // 0x0004  + (n * 0x0010)
SystemObjectInformation,            // 0x0038+ + (n * 0x0030+)
SystemPageFileInformation,          // 0x0018+ per page file
SystemInstemulInformation,          // 0x0088
SystemInfo20,                       // invalid info class
SystemCacheInformation,             // 0x0024
SystemPoolTagInformation,           // 0x0004 + (n * 0x001C)
SystemInfo23,                       // 0x0000, or 0x0018 per cpu
SystemDpcInformation,               // 0x0014
SystemInfo25,                       // checked build only
SystemLoadDriver,                   // 0x0018, set mode only
SystemUnloadDriver,                 // 0x0004, set mode only
SystemTimeAdjustmentInformation,    // 0x000C, 0x0008 writeable
SystemInfo29,                       // checked build only
SystemInfo30,                       // checked build only
SystemInfo31,                       // checked build only
SystemCrashDumpInformation,         // 0x0004
SystemInfo33,                       // 0x0010
SystemCrashDumpStateInformation,    // 0x0004
SystemDebuggerInformation,          // 0x0002
SystemThreadSwitchInformation,      // 0x0030
SystemRegistryQuotaInformation,     // 0x000C
SystemAddDriver,                    // 0x0008, set mode only
SystemPrioritySeparationInformation,// 0x0004, set mode only
SystemInfo40,                       // not implemented
SystemInfo41,                       // not implemented
SystemInfo42,                       // invalid info class
SystemInfo43,                       // invalid info class
SystemTimeZoneInformation,          // 0x00AC
SystemLookasideInformation,         // n * 0x0020
MaxSystemInfoClass
}
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-26 13:33
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2198: \'_stricmp\' : too few actual parameters
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2631) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-26 14:49
用SICE调试,调用以上代码,有ntdll.dll(大部分是SYS文件),但是kernel32.dll不在其中。我的OS是XP SP2。
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-26 14:52
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2198: \'_stricmp\' : too few actual parameters
e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2631) : error C2039: \'aSM\' : is not a member of \'tagSYSTEM_MODULE_INFORMATION\'
        e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(106) : see declaration of \'tagSYSTEM_MODULE_INFORMATION\'
 


typedef struct _SYSTEM_MODULE
{
    ULONG Reserved1;
    ULONG Reserved2;
    PVOID ImageBaseAddress;
    ULONG ImageSize;                // bytes
    ULONG Flags;
    USHORT  wId;                  // zero based
    USHORT  wRank;                // 0 if not assigned
    USHORT  w18;
    USHORT  NameOffset;
    UCHAR  abName [MAXIMUM_FILENAME_LENGTH];
}
SYSTEM_MODULE,
* PSYSTEM_MODULE,
**PPSYSTEM_MODULE;

typedef struct _SYSTEM_MODULE_INFORMATION
{
    ULONG         dCount;
    SYSTEM_MODULE aSM [1];
}
SYSTEM_MODULE_INFORMATION,
* PSYSTEM_MODULE_INFORMATION,
**PPSYSTEM_MODULE_INFORMATION;

e:\\WINDDK\\2600.1106\\src\\REGSRC\\DD\\REGSYS.C(2629) : error C2198: \'_stricmp\' : too few actual parameters
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-26 17:05
编译没问题了,谢谢:)
但是mAddr=GetModuleBase( \"kernel32.dll\" );
mAddr=0,失败。
用SICE可以查看KERNEL32.dll 中的函数。
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-05-26 17:54
编译没问题了,谢谢:)
但是mAddr=GetModuleBase( \"kernel32.dll\" );
mAddr=0,失败。
用SICE可以查看KERNEL32.dll 中的函数。


用ICE跟一下吧,看看问题到底出在哪儿,我最开始也是有问题,后来发现\"kernel32.dll\"最后有个空格,你看看两次ZwQuerySystemInformation调用是否都能成功,如果能成功,第二次返回的p里面的值是否有效,应该是没问题的,我在2k,xp,2k3下面都试过的
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-05-26 20:47
ZwQuerySystemInformation调用失败,返回 0xC0000004。
我的系统是XP SP2,完全是复制了楼上朋友的代码。
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-05-27 10:21
编译没问题了,谢谢:)
但是mAddr=GetModuleBase( \"kernel32.dll\" );
mAddr=0,失败。
用SICE可以查看KERNEL32.dll 中的函数。


昨天想错了,用这个方法得不到kernel32.dll的加载地址,这种方法只能得到SYSTEM进程加载的模块地址,system不加载kernel32.dll

我刚在XPSP2下试了一下,没有问题,错误0xC0000004是STATUS_INFO_LENGTH_MISMATCH,可能是调用ZwQuerySystemInformation( SystemModuleInformation, &i, 0, &i );出问题,试着把这句注释掉,下面先分配一块大BUFFER,(0x20000就够了)然后调用ZwQuerySystemInformation试试,我这边肯定是没问题

如果要获取kernel32.dll的加载地址,只有用别的方法了
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-05-27 15:57
是的,获取KERNEL32。DLL 不到。
谢谢楼上朋友。
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-05-27 16:44
是的,获取KERNEL32。DLL 不到。
谢谢楼上朋友。


试试LdrQueryProcessModuleInformation吧
LdrQueryProcessModuleInformation(
 OUT PSYSTEM_MODULE_INFORMATION SystemModuleInformationBuffer,
 IN ULONG        BufferSize,
 OUT PULONG      RequiredSize
 );

ntdll.dll导出的
游客

返回顶部