DLL

时间:2016-02-25 10:22:20

标签: windows winapi

我想在kernel32.dll中调用一个函数(它与哪个函数无关)。它非常好用。

现在我遇到以下问题:

另一个程序注入了挂钩kernel32.dll中的函数并更改其返回值的代码。我怎样才能调用原点功能?

在我首先打开我的程序之前,它工作正常。但是在Windows 10中,它调用了注入的函数。

我希望我能清楚地解释清楚。

以下是一个例子:

我使用的功能ReadProcessMemory()非常好用。有一个程序可以改变这个功能。如果启动此程序,我只从ReadProcessMemory()收到0xFF。

例如,在Windows 7中,我必须在另一个程序更改函数之前启动我的程序。

但在Windows 10中,它不再起作用了。当另一个程序启动时,我只收到0xFF。

所以我导入函数:

[DllImport(@"C:\WINDOWS\system32\kernel32.dll", EntryPoint = "ReadProcessMemory")]
private static extern bool ReadProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [Out] byte[] lpBuffer, UIntPtr nSize, IntPtr lpNumberOfBytesRead);

我的阅读功能:

public static bool ReadMemory(Int64 Address, ref byte[] buffer)
{
    return ReadProcessMemory(ProcessHandle, (UIntPtr)Address, buffer, (UIntPtr)buffer.Length, IntPtr.Zero);
}

1 个答案:

答案 0 :(得分:2)

如果仅更改kernel32.dll,您可以致电ntdll.dll!NtReadVirtualMemoryReadProcessMemory本身调用此功能)。

如果第三方流程似乎也更改了ntdll.dll,您可以将ntdll.dll复制到另一个临时文件(ntdll_copy.dll),然后使用它:

[DllImport("ntdll_copy.dll", EntryPoint = "NtReadVirtualMemory")]
private static extern bool NtReadVirtualMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [Out] byte[] lpBuffer, UIntPtr nSize, IntPtr lpNumberOfBytesRead);