|
我想加另外加载 一份 NTDLL 在系统 SysWOW64 目录下重新拷贝了一份 NTDLL 改名
然后分别用 LoadLibrary加载 自己拷贝的 MyNtdll
用GetProAddress 获取 MyNtdll 中 'LdrLoadDll' 地址
得到的ntdll 地址 和 LdrLoadDll 的地址分别为
77E80000
77E8C4DD
然后用函数 吧 LdrLoadDll 中的地址赋值给函数 指针
再HOOK 原始 NTDLL 中 LdrloadDll 地址 到我自己的函数
在跳回 MyNtdll 中 LdrloadDll 的地址 发现失败了
用ce查看 77E8C4DD 处 发现该地址全部是问号
我想问老大 重载用 重载DLL HOOK 原来的函数 跳转到新的NTDLL 的 LdrloadDll的函数
这中方法行不行
由于我是DELPHI 写的代码就不发出来了,代码主要参考了看雪中一个人的 代码
#include <windows.h>
#include <ntsecapi.h>
#include <stdio.h>
typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION)(DWORD, PVOID, DWORD, PDWORD);
typedef struct _SYSTEM_PROCESS_INFORMATION
{
DWORD NextEntryDelta;
DWORD ThreadCount;
DWORD Reserved1[6];
FILETIME ftCreateTime;
FILETIME ftUserTime;
FILETIME ftKernelTime;
UNICODE_STRING ProcessName;
DWORD BasePriority;
DWORD ProcessId;
DWORD InheritedFromProcessId;
DWORD HandleCount;
DWORD Reserved2[2];
DWORD VmCounters;
DWORD dCommitCharge;
PVOID ThreadInfos[1];
}SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
#define SystemProcessesAndThreadsInformation 5
void main()
{
HMODULE hNtDll = LoadLibraryA("myntdll.dll");
if(!hNtDll)
return;
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll,"ZwQuerySystemInformation");
ULONG cbBuffer = 0x10000;
LPVOID pBuffer = NULL;
pBuffer = malloc(cbBuffer);
if(pBuffer == NULL)
return;
ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pBuffer,cbBuffer,NULL);
PSYSTEM_PROCESS_INFORMATION pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
for(;;)
{
wprintf(L"PID: %d (%ls) ",pInfo->ProcessId,pInfo->ProcessName.Buffer);
if(pInfo->NextEntryDelta == 0)
break;
pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) + pInfo->NextEntryDelta);
}
free(pBuffer);
getchar();
}
我得到的 新 NTDLL LdrLoadDll 函数地址感觉好像是错误,我找不到什么原因,
不知道我的这样HOOK方法正确不
|
|