我想在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);
}
答案 0 :(得分:2)
如果仅更改kernel32.dll
,您可以致电ntdll.dll!NtReadVirtualMemory
(ReadProcessMemory
本身调用此功能)。
如果第三方流程似乎也更改了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);