首页
社区
课程
招聘
[求助]我想使用NT函数绕过钩子 可这NT函数R3使用有问题吧。。
发表于: 2015-10-7 21:40 8222

[求助]我想使用NT函数绕过钩子 可这NT函数R3使用有问题吧。。

2015-10-7 21:40
8222
typedef struct _PROCESS_BASIC_INFORMATION {
        PVOID Reserved1;
        PPEB PebBaseAddress;
        PVOID Reserved2[2];
        ULONG_PTR UniqueProcessId;
        PVOID Reserved3;
} PROCESS_BASIC_INFORMATION;
#endif;

typedef LONG NTSTATUS, *PNTSTATUS;
typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef LONG(__stdcall *pfnZwCreateSection)(
             PHANDLE            SectionHandle,
              ACCESS_MASK        DesiredAccess,
          POBJECT_ATTRIBUTES ObjectAttributes,
          PLARGE_INTEGER     MaximumSize,
              ULONG              SectionPageProtection,
              ULONG              AllocationAttributes,
          HANDLE             FileHandle
        );

typedef LONG(__stdcall *pfnZwMapViewOfSection) (
        HANDLE SectionHandle,
        HANDLE ProcessHandle,
        OUT PVOID *BaseAddress,
        ULONG_PTR ZeroBits,
        SIZE_T CommitSize,
        PLARGE_INTEGER SectionOffset,
        PSIZE_T ViewSize,
        DWORD InheritDisposition,
        ULONG AllocationType,
        ULONG Win32Protect
        );

typedef LONG(__stdcall *pfnZwUnmapViewOfSection)(
        HANDLE ProcessHandle,
        PVOID BaseAddress
        );

pfnZwMapViewOfSection ZwMapViewOfSection = (pfnZwMapViewOfSection)GetProcAddress(GetModuleHandleA("ntdll"), "ZwMapViewOfSection");
pfnZwUnmapViewOfSection ZwUnmapViewOfSection = (pfnZwUnmapViewOfSection)GetProcAddress(GetModuleHandleA("ntdll"), "ZwUnmapViewOfSection");
pfnZwCreateSection ZwCreateSection = (pfnZwCreateSection)GetProcAddress(GetModuleHandleA("ntdll"), "ZwCreateSection");

typedef struct ShareMenoryArray
{
        int Num;

}*LPShareMenoryArray;

LPShareMenoryArray pShareMenory;

typedef struct _IO_STATUS_BLOCK {
        union {
                NTSTATUS Status;
                PVOID    Pointer;
        };
        ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
typedef LONG(__stdcall *pfnZwOpenFile)(
        _Out_ PHANDLE            FileHandle,
        _In_  ACCESS_MASK        DesiredAccess,
        _In_  POBJECT_ATTRIBUTES ObjectAttributes,
        _Out_ PIO_STATUS_BLOCK   IoStatusBlock,
        _In_  ULONG              ShareAccess,
        _In_  ULONG              OpenOptions
        );
pfnZwOpenFile ZwOpenFile = (pfnZwOpenFile)GetProcAddress(GetModuleHandleA("ntdll"), "ZwOpenFile");

        typedef LONG(__stdcall *pfnZwCreateFile)(
        _Out_    PHANDLE            FileHandle,
        _In_     ACCESS_MASK        DesiredAccess,
        _In_     POBJECT_ATTRIBUTES ObjectAttributes,
        _Out_    PIO_STATUS_BLOCK   IoStatusBlock,
        _In_opt_ PLARGE_INTEGER     AllocationSize,
        _In_     ULONG              FileAttributes,
        _In_     ULONG              ShareAccess,
        _In_     ULONG              CreateDisposition,
        _In_     ULONG              CreateOptions,
        _In_opt_ PVOID              EaBuffer,
        _In_     ULONG              EaLength
        );
        pfnZwCreateFile ZwCreateFile = (pfnZwCreateFile)GetProcAddress(GetModuleHandleA("ntdll"), "ZwCreateFile");
#define OBJ_CASE_INSENSITIVE    0x00000040L
#define OBJ_KERNEL_HANDLE       0x00000200L
#define InitializeObjectAttributes( p, n, a, r, s ) { \
        (p)->Length = sizeof(OBJECT_ATTRIBUTES);          \
        (p)->RootDirectory = r;                             \
        (p)->Attributes = a;                                \
        (p)->ObjectName = n;                                \
        (p)->SecurityDescriptor = s;                        \
        (p)->SecurityQualityOfService = NULL;               \
}
#define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020

void aa()
{

        HANDLE hMySharedMapFile;
        HANDLE  hFile = NULL;
        wchar_t temp[] = L"Hello World!";   //定义宽字符串
        UNICODE_STRING str;
        str.Buffer = temp;
        str.Length = wcslen(temp)*sizeof(WCHAR);
        str.MaximumLength = wcslen(temp)*sizeof(WCHAR);
        SIZE_T size = 0;
        OBJECT_ATTRIBUTES  oa = { 0 };
        LARGE_INTEGER a;
        a.HighPart = 0;
        a.LowPart = 0x8EF6;
        IO_STATUS_BLOCK io_status = { 0 };
        InitializeObjectAttributes(&oa, &str, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
        void* MapFileBaseAddress = NULL;
        LONG status = ZwCreateSection(&hMySharedMapFile, SECTION_MAP_READ, &oa, 0, PAGE_EXECUTE, SEC_IMAGE, INVALID_HANDLE_VALUE);     //这创建共享 老是失败 为什么啊
      
}

void bb()
{
    HANDLE hMySharedMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(ShareMenoryArray), _T("MyDataMenory"));

        pShareMenory = (LPShareMenoryArray)MapViewOfFile(hMySharedMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        LONG stat = ZwMapViewOfSection(hMySharedMapFile, INVALID_HANDLE_VALUE, &MapFileBaseAddress, NULL, NULL, NULL, &size, 1 /* ViewShare */, NULL, PAGE_READWRITE);
pShareMenory  = 0x02040000
MapFileBaseAddress = 0x02050000   ///这为啥相差10000   求大神帮忙

}

R3层使用NT函数 不要搞驱动了, 我目的是  想共享内存通讯  
但MapViewOfFile CreateFileMapping 有钩子保护 所以我想使用NT函数绕过钩子
CreateFileMapping->ZwCreateSection
MapViewOfFile->ZwMapViewOfSection

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 6
活跃值: (1151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知所云,绕钩子和nt函数你说的什么
2015-10-7 22:38
0
雪    币: 35
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
比如 CreateFileMapping 给下了钩子 但你要使用 CreateFileMapping 除了恢复钩子还有什么办法?

CreateFileMapping 最终会调用ntdll的ZwCreateSection来实现

那直接调用 ZwCreateSection 也可以实现CreateFileMapping 的功能 这不就跳过钩子检测了吗
2015-10-7 22:42
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
4
  自己重载 CreateFileMapping 所在模块 dll ,然后使用 重载后的 CreateFileMapping  内核都 可以实现重载,这 r3 的 dll 重载一下不会是问题的
2015-10-8 08:11
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
R3,想绕过就分分钟的事啊,直接int 2e,HOOK ntdll都没用
2015-10-8 09:59
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上加1啊  。。逆了某某游戏都是不走ntdll路线的..直接跑内核去了

call    dword ptr fs:[0xC0]
2015-10-8 10:53
0
雪    币: 35
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
重载要使用到的API 也给HOO了呢
2015-10-8 15:25
0
雪    币: 35
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
现在是使用NT函数失败问题。。
2015-10-8 15:26
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
要动下脑子啊,哥们,初步排查的解决方法:
1.看错误返回值
2.使用r3那套函数,成功的时候,断点在那个函数看下它里面的参数和你的有什么不同
2015-10-8 16:47
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
10
你要觉得有钩子,干脆你去干掉就是。
2015-10-9 05:31
0
雪    币: 6
活跃值: (1151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=友情zyj;1395654]楼上加1啊  。。逆了某某游戏都是不走ntdll路线的..直接跑内核去了

call    dword ptr fs:[0xC0][/QUOTE]

在64位系统上新的call fs:[0xC0](wow64cpu!X86SwitchTo64BitMode) 代替了标准call ntdll.KiFastSystemCall.
2015-10-10 10:49
0
雪    币: 421
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请教call dword ptr fs:[0xc0]这个调用做了撒,通过调试发现fs:[0xc0]指向的值为0,fs=0x53,跟进代码就直接进入到了wow64cpu!X86SwitchTo64BitMode这个函数,而且堆栈,寄存器都改变了,我想调试看下这一步执行了哪些内容,有什么方法没?
2015-11-11 09:46
0
游客
登录 | 注册 方可回帖
返回
//