阅读:2163回复:19
驱动层如何得到dll的地址呢/
在驱动层如何得到如ntdll.dll,kernel32.dll等动态库地址呢?
Note: 不使用ZwOpenFile,ZwCreateSection,ZwMapViewOfSection等方法. |
|
最新喜欢:angles
|
沙发#
发布于:2005-05-22 11:36
在驱动层如何得到如ntdll.dll,kernel32.dll等动态库地址呢? 难道用硬编码吗? ;) 开个玩笑 下面是正题 不过我觉得还不如ZwOpenFile,ZwCreateSection,ZwMapViewOfSection这个方法呢 可以查找引用ntdll.dll,kernel32.dll的进程的模块列表,然后到用户空间去按PE头定位,操作用户区的地址需要注意安全哟 ;) |
|
|
板凳#
发布于:2005-05-23 13:17
想知道有没有其他办法还能达到相同的目的.
|
|
|
地板#
发布于:2005-05-23 15:35
看不懂。ZwOpenFile和dll有什么关系?
|
|
|
地下室#
发布于:2005-05-25 18:37
偶也被这个问题难住了,大虾们能详细说说吗:)?
|
|
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位下都没问题 |
|
6楼#
发布于:2005-05-26 11:55
楼上的方法能够得到模块的地址。
|
|
|
7楼#
发布于:2005-05-26 12:02
谢谢楼上2位老大,Mod 是指模块名称吗?
比如\"kernel32.dll\"? |
|
8楼#
发布于:2005-05-26 12:18
mod就是需要查找模块加载地址的模块名,这种方法只能得到被SYSTEM进程加载的模块加载地址
如果想得到任意进程加载模块信息,可以在PEB里找,或者试试LdrQueryProcessModuleInformation(OUT PSYSTEM_MODULE_INFORMATION SystemModuleInformationBuffer, IN ULONG BufferSize, OUT PULONG RequiredSize) 这个函数不保险 |
|
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 |
|
10楼#
发布于:2005-05-26 13:09
偶用DDK编译出错:( 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 } |
|
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\' |
|
12楼#
发布于:2005-05-26 14:49
用SICE调试,调用以上代码,有ntdll.dll(大部分是SYS文件),但是kernel32.dll不在其中。我的OS是XP SP2。
|
|
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\' 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 |
|
14楼#
发布于:2005-05-26 17:05
编译没问题了,谢谢:)
但是mAddr=GetModuleBase( \"kernel32.dll\" ); mAddr=0,失败。 用SICE可以查看KERNEL32.dll 中的函数。 |
|
15楼#
发布于:2005-05-26 17:54
编译没问题了,谢谢:) 用ICE跟一下吧,看看问题到底出在哪儿,我最开始也是有问题,后来发现\"kernel32.dll\"最后有个空格,你看看两次ZwQuerySystemInformation调用是否都能成功,如果能成功,第二次返回的p里面的值是否有效,应该是没问题的,我在2k,xp,2k3下面都试过的 |
|
16楼#
发布于:2005-05-26 20:47
ZwQuerySystemInformation调用失败,返回 0xC0000004。
我的系统是XP SP2,完全是复制了楼上朋友的代码。 |
|
17楼#
发布于:2005-05-27 10:21
编译没问题了,谢谢:) 昨天想错了,用这个方法得不到kernel32.dll的加载地址,这种方法只能得到SYSTEM进程加载的模块地址,system不加载kernel32.dll 我刚在XPSP2下试了一下,没有问题,错误0xC0000004是STATUS_INFO_LENGTH_MISMATCH,可能是调用ZwQuerySystemInformation( SystemModuleInformation, &i, 0, &i );出问题,试着把这句注释掉,下面先分配一块大BUFFER,(0x20000就够了)然后调用ZwQuerySystemInformation试试,我这边肯定是没问题 如果要获取kernel32.dll的加载地址,只有用别的方法了 |
|
18楼#
发布于:2005-05-27 15:57
是的,获取KERNEL32。DLL 不到。
谢谢楼上朋友。 |
|
19楼#
发布于:2005-05-27 16:44
是的,获取KERNEL32。DLL 不到。 试试LdrQueryProcessModuleInformation吧 LdrQueryProcessModuleInformation( OUT PSYSTEM_MODULE_INFORMATION SystemModuleInformationBuffer, IN ULONG BufferSize, OUT PULONG RequiredSize ); ntdll.dll导出的 |
|