huangchao209 发表于 2014-12-20 21:22:43

一个 重新加载 ntdll.dll 问题

我想加另外加载 一份 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;
    FILETIME ftCreateTime;
    FILETIME ftUserTime;
    FILETIME ftKernelTime;
    UNICODE_STRING ProcessName;
    DWORD BasePriority;
    DWORD ProcessId;
    DWORD InheritedFromProcessId;
    DWORD HandleCount;
    DWORD Reserved2;
    DWORD VmCounters;
    DWORD dCommitCharge;
    PVOID ThreadInfos;
}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方法正确不

Tesla.Angela 发表于 2014-12-21 12:56:06

没看懂你说的一大坨啥意思。。。我还是先说说R3-RELOAD-DLL的步骤吧:
1.CopyFile("c:\\windows\\syswow64\ntdll.dll","c:\\ntdll32.dll");
2.hMod=LoadLibraryA("c:\\ntdll32.dll");
3.pFun=GetProcAddress(hMod,"XXXX");
如果出错的话估计是你代码的问题吧,试试用VC写。

huangchao209 发表于 2014-12-22 00:33:11

Tesla.Angela 发表于 2014-12-21 12:56
没看懂你说的一大坨啥意思。。。我还是先说说R3-RELOAD-DLL的步骤吧:
1.CopyFile("c:\\windows\\syswow64\ ...

是的,我的参数问题,看汇编访问到一个不能访问的地址,出错了
页: [1]
查看完整版本: 一个 重新加载 ntdll.dll 问题