首页
社区
课程
招聘
[求助]懂驱动的帮忙看下啊,谢谢了。3天3夜了 就错这里了
发表于: 2010-12-3 16:48 9840

[求助]懂驱动的帮忙看下啊,谢谢了。3天3夜了 就错这里了

2010-12-3 16:48
9840
以下是编译信息

OACR monitor running already

C:\WinDDK\7600.16385.1>cd c:\3\

C:\3>build
BUILD: Compile and Link for x86
BUILD: Loading c:\winddk\7600.16385.1\build.dat...
BUILD: Computing Include file dependencies:
BUILD: Start time: Fri Dec 03 16:43:29 2010
BUILD: Examining c:\3 directory for files to compile.
    c:\3 Invalidating OACR warning log for 'root:x86chk'
BUILD: Saving c:\winddk\7600.16385.1\build.dat...
BUILD: Compiling and Linking c:\3 directory
Configuring OACR for 'root:x86chk' - <OACR on>
_NT_TARGET_VERSION SET TO WINXP
Compiling - procguard.c
Linking Executable - objchk_wxp_x86\i386\processesguard.sys
1>errors in directory c:\3
1>c:\3\procguard.obj : error LNK2019: unresolved external symbol __imp__ZwWriteV
irtualMemory@20 referenced in function _DriverEntry@8
1>c:\3\objchk_wxp_x86\i386\processesguard.sys : error LNK1120: 1 unresolved exte
rnals
BUILD: Finish time: Fri Dec 03 16:43:32 2010
BUILD: Done

    3 files compiled - 13 Warnings
    1 executable built - 2 Errors

C:\3>

  这个是我的函数定义
我不知道错在哪里
帮忙看下 谢谢了

typedef struct _DEVICE_EXTENSION
{
        PDEVICE_OBJECT        pDevObj;
        UNICODE_STRING        uniSymLink;
        PMDL                        pMdl;
        PULONG                        pulSSDTMapped;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

typedef NTSTATUS (*ZWOPENPROCESS)(
                       OUT PHANDLE ProcessHandle,
                       IN ACCESS_MASK DesiredAccess,
                       IN POBJECT_ATTRIBUTES ObjectAttributes,
                       IN PCLIENT_ID PCLIENT_ID OPTIONAL
);

typedef NTSTATUS  (__stdcall *ZWOPENTHREAD) (
                          OUT PHANDLE ProcessHandle,
                          IN ACCESS_MASK DesiredAccess,
                          IN POBJECT_ATTRIBUTES ObjectAttributes,
                          IN PCLIENT_ID PCLIENT_ID OPTIONAL

);
NTSYSAPI
NTSTATUS
NTAPI
ZwOpenThread( OUT PHANDLE ProcessHandle,
              IN ACCESS_MASK AccessMask,                                          
              IN POBJECT_ATTRIBUTES ObjectAttributes,
              IN PCLIENT_ID ClientId);

typedef NTSTATUS  (__stdcall *ZWWRITEVIRTUALMEMORY) (
                        IN HANDLE ProcessHandle,
                        IN PVOID BaseAddress,
                        IN PVOID Buffer,
                        IN ULONG NumberOfBytesToWrite,
                        OUT PULONG NumberOfBytesWritten OPTIONAL
);

NTSYSAPI
NTSTATUS
NTAPI
ZwWriteVirtualMemory( IN HANDLE ProcessHandle,
                      IN PVOID BaseAddress,
                      IN PVOID Buffer,
                      IN ULONG NumberOfBytesToWrite,
                      OUT PULONG NumberOfBytesWritten OPTIONAL);
    这个是我的函数定义
我不知道错在哪里
帮忙看下 谢谢了

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
连接错误,保存为.c文件。
2010-12-3 16:52
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
谢谢了 不过我原先的文件就是.c格式的
2010-12-3 17:02
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
那个函数是导出的吗?导出的话有声明吗?
2010-12-3 17:51
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
找了下资料

虽然 NtWriteVirtualMemory  在SSDT 中出现,但 ntoskrnl.exe 并没导出(ZwWriteVirtualMemory  或 NtWriteVirtualMemory  ).
所以编译的时候 ZwQuerySystemInformation 可以用,而ZwWriteVirtualMemory  却不行.

但这函数在NTDLL中却有导出,DDK 编译时默认不包含 ntdll.lib 文件.
所以你只要在 SOURCES 文件中加入 TARGETLIBS = $(DDK_LIB_PATH)\ntdll.lib
就可以正常编译这程序.

因为 ntdll.dll 和 ntoskrnl.exe 中 Zw***** 函数的第一条指令一样,都是
MOV  EAX, 索引号

http://bbs.driverdevelop.com/read.php?tid-102377.html

不知道怎么修改。。。。。。。。。
2010-12-3 18:24
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6
在头文件中,声明一下就行了吧
NTSYSAPI
NTSTATUS
NTAPI
NtReadVirtualMemory(
    IN HANDLE ProcessHandle,
    IN PVOID BaseAddress,
    OUT PVOID Buffer,
    IN ULONG BufferSize,
    OUT PULONG NumberOfBytesRead OPTIONAL
    );

把用ZW*声明的都改成NT*的,不要用ZW声明了,及时HOOK了ZW函数也没用啊
NTSYSAPI
NTSTATUS
NTAPI
NtWriteVirtualMemory(
    IN HANDLE ProcessHandle,
    OUT PVOID BaseAddress,
    IN PVOID Buffer,
    IN ULONG BufferSize,
    OUT PULONG NumberOfBytesWritten OPTIONAL
    );
2010-12-3 18:42
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
两个是导出的 一个没有导出
导出的都声明了。
还有一个没导出的不知道怎么处理
2010-12-3 18:47
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
8
你去看下看雪精华十 里面有一个ssdthook就是那样写的

标 题:打造自己的HOOK引擎 之一 --- SSDT HOOK引擎
作 者:easystone
时 间:2008-12-22 21:50

链 接:http://bbs.pediy.com/showthread.php?t=79247

关键是有一个函数NtWriteVirtualMemory  在SSDT 中出现,但 ntoskrnl.exe 并没导出

但这函数在NTDLL中却有导出,DDK 编译时默认不包含 ntdll.lib 文件.
所以你只要在 SOURCES 文件中加入 TARGETLIBS = $(DDK_LIB_PATH)\ntdll.lib
就可以正常编译这程序.

正常编译之后 驱动无法实现 加载服务失败
2010-12-3 18:51
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
NtWriteVirtualMemory没有导出,要自己从SSDT里面获取地址
2010-12-3 18:52
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
哇哇,你说的真麻烦

头文件:

#include "ntddk.h"      

#define PAGECODE code_seg("PAGE")
#define INITPAGE code_seg("INIT")

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义NtOpenProcess/NtOpenThread/NtReadVirtualMemory/NtWriteVirtualMemory三个函数原型
NTSYSAPI
NTSTATUS
NTAPI
NtOpenProcess (
                           OUT PHANDLE ProcessHandle,
                           IN ACCESS_MASK DesiredAccess,
                           IN POBJECT_ATTRIBUTES ObjectAttributes,
                           IN PCLIENT_ID ClientId OPTIONAL
                           );
NTSYSAPI
NTSTATUS
NTAPI
NtOpenThread (
                          OUT PHANDLE ThreadHandle,
                          IN ACCESS_MASK DesiredAccess,
                          IN POBJECT_ATTRIBUTES ObjectAttributes,
                          IN PCLIENT_ID ClientId OPTIONAL
                          );
NTSYSAPI
NTSTATUS
NTAPI
NtReadVirtualMemory(
                                        IN HANDLE ProcessHandle,
                                        IN PVOID BaseAddress,
                                        OUT PVOID Buffer,
                                        IN ULONG BufferSize,
                                        OUT PULONG NumberOfBytesRead OPTIONAL
                                        );

NTSYSAPI
NTSTATUS
NTAPI
NtWriteVirtualMemory(
                                         IN HANDLE ProcessHandle,
                                         OUT PVOID BaseAddress,
                                         IN PVOID Buffer,
                                         IN ULONG BufferSize,
                                         OUT PULONG NumberOfBytesWritten OPTIONAL
                                         );
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//SSDT结构体声明
typedef struct _SERVICE_DESCRIPTOR_TABLE      
{      
        PVOID    ServiceTableBase;      
        PULONG   ServiceCounterTableBase;      
        ULONG    NumberOfService;      
        ULONG    ParamTableBase;      
}*PSERVICE_DESCRIPTOR_TABLE;
//链接导出SSDT指针
extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;      

VOID Hook();      
VOID Unhook();

//保存原来地址

ULONG OldThread,JmpThread,OldProcess,JmpProcess,OldRead,JmpRead,OldWrite,JmpWrite;

源文件中:
NTSTATUS MyNtReadVirtualMemory(
                                                          IN HANDLE ProcessHandle,
                                                          IN PVOID BaseAddress,
                                                          OUT PVOID Buffer,
                                                          IN ULONG BufferSize,
                                                          OUT PULONG NumberOfBytesRead OPTIONAL
                                                          )
{
        __asm
        {
                        push 0x1c
                        jmp JmpRead
        }
}

我是这样写,可以SSDT了
2010-12-3 18:56
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
11
不是麻烦 主要是考虑系统兼容性
不考虑兼容的我写了一个
但是没用
因为win7下蓝屏
还有一个就是我去掉了硬件编码的部分之后
在win7下无法加载

如果不是考虑 系统兼容我也不需要
mdl这个办法了
也不会这么麻烦的去定位函数

你用win7测试下 会有收获的
2010-12-3 19:05
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
ZwWriteVirtualMemory 也是没导出的吧
隔壁那个不是有人回答你了么,在PEB里找ntdll然后找到ZwWriteVirtualMemory的序号。
其实可以直接在Ring3找到然后DeviceIoControl给驱动的。
2010-12-3 20:07
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
13
不知道代码怎么写。。
2010-12-3 20:24
0
雪    币: 138
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
没导出的话需要自己找函数的入口地址,去遍历ntdll。。。找函数索引~

然后用~
#define HOOK_SYSCALLBYID(_ServiceId, _Hook, _Orig )  _Orig = (PVOID) InterlockedExchange( (PLONG) \&MappedSystemCallTable[_ServiceId], (LONG) _Hook)
替换即可。

ULONG NtWriteVirtualMemoryServiceID = 0x115;//我是直接查的冰刃。。。
2010-12-7 09:23
0
游客
登录 | 注册 方可回帖
返回
//