- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
美好的一天,我正在尝试以某种方式防止“dll 注入(inject)”到我的程序中。这是我到目前为止所拥有的,但由于某种原因它使我的 .exe 崩溃了。我正在加载这段代码,我的程序附加了一个 .dll。
声明:
LPBYTE _LdrLoadDll = (LPBYTE)GetProcAddress(GetModuleHandle("ntdll.dll"), "LdrLoadDll");
功能:
void HookNoAccess(LPVOID Offset, int size)
{
HMODULE hand = GetModuleHandle("MYPROGRAM.exe");
DWORD OldProtect;
VirtualProtect(Offset, size, PAGE_NOACCESS, &OldProtect);
VirtualProtect((LPVOID)((DWORD)hand + (DWORD)0x12d1), 6, PAGE_NOACCESS, &OldProtect);
}
调用它:
HookNoAccess(_LdrLoadDll, 2); // tried any size...
它应该停止访问当前的进程,但为什么它会崩溃......
有人可以帮帮我吗?
最佳答案
鉴于 LdrLoadDll
是一个未记录的函数,我不确定它的作用、工作原理或内部使用位置,但我怀疑如果您能够完全阻止它,因为它可能是 Windows 本身用来将 DLL 加载到您的进程中的工具……
除此之外,VirtualProtect
影响所有 包含指定范围的一个或多个字节的页面。换句话说,它提供的保护粒度是页面的粒度。如果您不小心避免其他内存块位于同一页上,您将在尝试访问它们时崩溃。
最后,对 VirtualProtect
的第二次调用是极度可疑的。您硬编码为地址偏移量的值是多少?和上面提到的同样的问题:VirtualProtect
提供的保护粒度是页面的粒度。页面为 4k 字节(一般来说),因此即使您只指定 6 字节的大小,您也是在为至少包含应用程序可执行代码的一部分的整个 4k 页面设置 PAGE_NOACCESS
。
实际上,您应该只在使用 VirtualAlloc
或 VirtualAllocEx
分配给自己的内存块上使用 VirtualProtect
。任何其他的,改变你无法控制的内存块的保护级别,都是在自找麻烦。
关于C++ VirtualProtect PAGE_NOACCESS 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684408/
我正在使用 CreateFileMapping 和 MapViewOfFile 函数将文件映射到内存中。在某一点之后,我调用 VirtualProtect 将其保护从只读更改为读写。此调用失败,Get
VirtualProtect 的第三个参数可以使用如下标志: PAGE_EXECUTE PAGE_NOACCESS PAGE_READWRITE PAGE_READONLY ... 一开始我觉得Vir
我需要使用 VirtualProtect,我的问题是关于传递给函数的区域地址。它说(在 MSDN 上)“描述起始页的地址”,它必须是页面开头的地址还是可以是该页面中的任何地址?也就是说,是不是应该先用
我有一个 DWORD 值,我想监视更改,所以我决定使用保护页。 问题是 STATUS_GUARD_PAGE_VIOLATION 异常是在使用 VirtualProtect 将内存标记为 PAGE_GU
美好的一天,我正在尝试以某种方式防止“dll 注入(inject)”到我的程序中。这是我到目前为止所拥有的,但由于某种原因它使我的 .exe 崩溃了。我正在加载这段代码,我的程序附加了一个 .dll。
我在使用 Windows 的 Virtualprotect() api 时遇到问题。我从学校得到了一个作业,我的老师告诉我们,在过去内存力稀缺且成本高昂的时候。程序员必须创建可以动态修改自身以节省内存
我正在 D2010 中进行简单的本地化工作。我正在处理表单上的所有字符串,因为 ETM 似乎超出了我的需求,其他第 3 方工具也是如此......(尽管我目前不太确定!) 下面用于更改 Const.p
这是一些标准的代码片段,我们在其中安装了钩子(Hook),在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一 block 重写的内存?我们不能只保留 PAGE_EXECUTE
我正在分析进程加载的各种模块。不幸的是,我无法创建 kernel32.dll 内存快照,尽管该函数可以与其他模块(例如 ntddl.dll)一起正常工作。问题在于以下代码: /* Copy code
这按预期工作。引发了 STATUS_GUARD_PAGE_VIOLATION。 int main() { DWORD oldp; DWORD *pdp = new DWORD;
我正在尝试使用 PAGE_GUARD Hook 函数,但在调用页面/地址时它不会引发任何异常。 void HookMe(){ printf("Not hooked\n"); } void Go
我使用 VirtualAlloc(Ex) 来分配和提交大范围的页面。 稍后在执行过程中,我希望“ fork ”该内存,启动一个可以在当前状态下读取它的新进程,而父进程将其视为写时复制内存。 这可以用
我知道 VirtualProtect 函数会毫无疑问地更改内存中页面的权限。当任何正在运行的进程能够使用它时,这肯定不会立即产生效果吗? 例如,有人可以轻松编写一段使用 VirtualProtectE
我有 Delphi 6 DLL,它在内部使用第三方库来进行自动资源字符串翻译。 在库源代码中,2 个 RTL 函数(ShortCutToText 和 LoadResString)被替换为对应的多语言函
我正在尝试转换来自 CHook 的代码论坛发布了这段代码,它执行 EAT Hook : #include #include #include #if PSAPI_VERSION == 1 #pr
我是一名优秀的程序员,十分优秀!