阅读:5796回复:33
(100分)各位大虾:我调用NtCreateProcess为什么提示“找不到过程地址”呢?
我在内核态想启动一个Win32进程,然后吊用了NtCreateSection,和NtCreateProcess。
当加载驱动时候,提示“找不到过程地址”。 我把NtCreateProcess注释了,就能加载了。 NtCreateSection 和 NtCreateProcess 都是 UnDoc的函数啊。 为什么NtCreateSection 能行,而NtCreateProcess 就找不到呢。 注:我连接了ntdll.lib,也声明了函数原型了。 代码如下: NTSYSAPI NTSTATUS NTAPI NtCreateSection( OUT PHANDLE SectionHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG PageAttributess, IN ULONG SectionAttributes, IN HANDLE FileHandle OPTIONAL ); NTSYSAPI NTSTATUS NTAPI NtCreateProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL ); int TestCreateProcess() { NTSTATUS rc; HANDLE hProcessCreated, hProcessOpened, hFile, hSection; OBJECT_ATTRIBUTES ObjectAttr; UNICODE_STRING ProcessName; UNICODE_STRING SectionName; UNICODE_STRING FileName; LARGE_INTEGER MaxSize; ULONG SectionSize=8192; IO_STATUS_BLOCK ioStatusBlock; LARGE_INTEGER allocsize ; DbgPrint(("Yanky starting TestLaunchProcess\n")); RtlInitUnicodeString(&FileName, L"\\??\\d:\\winnt\\system32\\calc.exe"); InitializeObjectAttributes( &ObjectAttr, &FileName, OBJ_CASE_INSENSITIVE, NULL, NULL); rc = ZwCreateFile( &hFile, GENERIC_READ | GENERIC_EXECUTE, &ObjectAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0); if (!NT_SUCCESS(rc)) { DbgPrint(("Yanky -->Unable to open file, rc=%x\n", rc)); return 0; } /* then use NtCreateSection to map file */ MaxSize.HighPart=0; MaxSize.LowPart=SectionSize; rc=NtCreateSection( &hSection, SECTION_ALL_ACCESS, NULL, &MaxSize, PAGE_READWRITE, SEC_IMAGE, hFile); if (rc!=STATUS_SUCCESS) { DbgPrint(("Unable to create section, rc=%x\n", rc)); return 0; } DbgPrint(("hSectionCreated=%x\n", hSection)); rc= NtCreateProcess ( &hProcessCreated, PROCESS_ALL_ACCESS, &ObjectAttr, 0xFFFFFFFF, TRUE, hSection, NULL, NULL); if (rc!=STATUS_SUCCESS) { DbgPrint(("Unable to create process, rc=%x\n", rc)); return 0; } DbgPrint(("hProcessCreated=%x\n", hProcessCreated)); NtClose(hProcessCreated); return 1; } 各位大虾帮帮忙! |
|
最新喜欢:![]() |
沙发#
发布于:2005-02-07 09:39
[quote]这个函数地址需要动态获取,你反编译一下NtOsKrnl.exe就明白了。 等于没说,你反哪个函数可以获得他的地址?? HOOK只能通过SERVICEID来做,硬编码或着我看到有老外把NTDLL影射到驱动空间,然后再获得SERVICEID的. [/quote] 我看到有老外把NTDLL影射到驱动空间,然后再获得SERVICEID的???? 未输出,NTDLL影射到驱动空间,又如何得到入口地址,更别说SERVICEID |
|
|
板凳#
发布于:2005-02-07 09:35
驱动里边连接ntdll?NtCreateProcess/ZwCreateProcess都没有在ntdll.dll中被export!不要白费力气了。如果需要的话,你可以自己加载ntdll到内存中,然后再查找地址。 函数没有输出,就是自己加载到内存中,也找不到地址,其实ntdll.dll本身就在内存中,只不过在应用层。把它加载到核心空间,它也只能是死的,所有地址需要重定位才能活,至于搞那么复杂吗? |
|
|
地板#
发布于:2005-02-06 13:55
驱动里边连接ntdll?NtCreateProcess/ZwCreateProcess都没有在ntdll.dll中被export!不要白费力气了。如果需要的话,你可以自己加载ntdll到内存中,然后再查找地址。
|
|
地下室#
发布于:2005-02-05 11:02
还有,据我跟踪发现,在XP中系统很少调用ntcreateprocess,改为调用 修正,参数个数据后来看,是对的,8个,主要是未引出的问题,不行就硬编码吧,在我的XP sp2系统上,它是系统服务分发表中排行0x2F,只不过要注意使EDX指向你的参数表。 |
|
|
5楼#
发布于:2005-02-05 10:54
还有,据我跟踪发现,在XP中系统很少调用ntcreateprocess,改为调用
ntcreateprocessEx,如果在XP下将0xffffffff改为0x00000000(NULL),将不出现第4个参数出错的情况,但出现1>Linking Executable - objchk_wxp_x86\i386\test.sys for i386 1>runwin32proc.obj : error LNK2019: unresolved external symbol __imp__NtCreateP ocess@32 referenced in function _TestCreateProcess@0 1>objchk_wxp_x86\i386\test.sys : error LNK1120: 1 unresolved externals 这说明你找到的函数说明是ntdll.dll中的,与__imp__NtCreatePocess@32不符,即函数名称没问题相同,参数个数不同 |
|
|
6楼#
发布于:2005-02-05 10:40
首先,我必须澄清的一点是,你的LIB绝对不能是ntdll.lib,而必须是ntoskrnl.lib。ntdll.lib中引出了ntcreateprocess(暂时不管大小写了),ntoskrnl.lib引出了ntcreateprocess,ntcreatesession.ntdll.lib提供Win32下用的,地址在用户区,这就是你出现地址找不到的原因。至于第4个参数错误的原因,大家由于环境不相同,我这里只在XP下试了一下,就是这个错误。其实是因为我以前说过的,在Win2k下ProcessId会有问题,0xffffffff也被认为是一个合法的进程ID,而在XP下ProcessId没问题,0xffffffff便被认为是一个非法的进程ID了。
|
|
|
7楼#
发布于:2005-02-04 14:07
这个函数地址需要动态获取,你反编译一下NtOsKrnl.exe就明白了。 等于没说,你反哪个函数可以获得他的地址?? HOOK只能通过SERVICEID来做,硬编码或着我看到有老外把NTDLL影射到驱动空间,然后再获得SERVICEID的. |
|
|
8楼#
发布于:2005-02-04 14:02
这个函数地址需要动态获取,你反编译一下NtOsKrnl.exe就明白了。
|
|
|
9楼#
发布于:2004-12-29 10:12
驱动中好像不能引用ntdll.dll中的函数,没看到有sys引用了ntdll.dll 因为NtCreateSection在ntoskrnl.exe中,而NtCreateProcess在 ntoskrnl.exe中没有导出所以不行。 关于怎么使用NtCreateProcess或ZwCreateProcess《NtCreateProcess和ZwCreateProcess,原来的贴太挤,开新帖 》 有讲的 |
|
10楼#
发布于:2004-12-27 17:42
顶!
顶! 顶! |
|
11楼#
发布于:2004-12-27 14:36
[quote][quote]发现问题了 大虾啊,我的定义和你的一样的,参数没错,没有问题啊。 还有就是我直接利用这个函数的地址也有问题,提示第七个参数错误。 [/quote] 上面函数定义的是引用你的定义, 你的代码编译后,出现NtCreateProcess' : pointer mismatch for actual parameter 4警告错误(环境2k+xp4+ddk 2k) 我想问题可能就在这里 [/quote] NtCreateProcess这个函数原型我是在UnDoc文档中找到的。 请问该如何改呢? 我的环境也是:advance Server + Sp4 + 2kddk 你的可以? 那个参数该是什么呢? |
|
12楼#
发布于:2004-12-27 12:53
[quote]发现问题了 大虾啊,我的定义和你的一样的,参数没错,没有问题啊。 还有就是我直接利用这个函数的地址也有问题,提示第七个参数错误。 [/quote] 上面函数定义的是引用你的定义, 你的代码编译后,出现NtCreateProcess' : pointer mismatch for actual parameter 4警告错误(环境2k+xp4+ddk 2k) 我想问题可能就在这里 |
|
|
13楼#
发布于:2004-12-27 12:29
发现问题了 大虾啊,我的定义和你的一样的,参数没错,没有问题啊。 还有就是我直接利用这个函数的地址也有问题,提示第七个参数错误。 |
|
14楼#
发布于:2004-12-24 13:01
发现问题了
NtCreateProcess' : pointer mismatch for actual parameter 4 第4个参数类型不对,改一改吧 你在哪里找到的NtCreateProcess的定义 NtCreateProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL ); |
|
|
15楼#
发布于:2004-12-24 12:55
使用monitor加载时出现error =127
|
|
|
16楼#
发布于:2004-12-24 12:50
我的advance Server + Sp4
在Ntdll.dll里面都导出了 NtCreateProcess ZwCreateProcess 可能你的系统版本不过高 |
|
|
17楼#
发布于:2004-12-22 21:04
我试了一下,还是不行。 那个只是连接,不管Load 你可以测试看直接使用这个函数的地址看是否可以 |
|
|
18楼#
发布于:2004-12-22 17:02
系统根本没导出这个函数,你如何能调用??? NtCreateProcess这个函数导出了,在Ntdll.dll里面有。 ZwCreateProcess没有导出。 大虾帮忙! |
|
19楼#
发布于:2004-12-22 16:59
不好意思,前几天怎么都上不来论坛,不知道怎么回事。
|
|
上一页
下一页