- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用以下代码为“NtCreateSection”函数制作了一个 WOW64 系统调用 Hook :
#include "Funcs.h"
#include <cstdio>
#include <Windows.h>
const int PAGE_SIZE = 0x1000;
const int SYSCALL_INTERCEPT = 0x4A;
const int NUM_WOW64_BYTES = 0x9;
using pNtCreateSection =
NTSTATUS (NTAPI*)(PHANDLE SectionHandle, ULONG DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes,
PLARGE_INTEGER MaximumSize, ULONG PageAttributess, ULONG SectionAttributes, HANDLE FileHandle);
pNtCreateSection NtCreateSection = nullptr;
DWORD_PTR dwWow64Address = 0;
LPVOID lpJmpRealloc = nullptr;
ULONG SectionAttributes;
void __declspec(naked) NtCreateSectionHook()
{
__asm
{
pushad
}
fprintf(stderr, "NtCreateSectionHook called !\n");
__asm
{
popad
jmp lpJmpRealloc
}
}
DWORD_PTR __declspec(naked) GetWow64Address()
{
__asm
{
mov eax, dword ptr fs:[0xC0]
ret
}
}
void __declspec(naked) Wow64Trampoline()
{
__asm
{
cmp eax, SYSCALL_INTERCEPT
jz NtCreateSectionHook
jmp lpJmpRealloc
}
}
LPVOID CreateNewJump(const DWORD_PTR dwWow64Address)
{
lpJmpRealloc = VirtualAlloc(nullptr, PAGE_SIZE, MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
(void)memcpy(lpJmpRealloc, (const void *)dwWow64Address, NUM_WOW64_BYTES);
return lpJmpRealloc;
}
void EnableWow64Redirect(const DWORD_PTR dwWow64Address, const LPVOID lpNewJumpLocation)
{
unsigned char trampolineBytes[] =
{
0x68, 0xDD, 0xCC, 0xBB, 0xAA, /*push 0xAABBCCDD*/
0xC3, /*ret*/
0xCC, 0xCC, 0xCC /*padding*/
};
memcpy(&trampolineBytes[1], &lpNewJumpLocation, sizeof(DWORD_PTR));
WriteJump(dwWow64Address, trampolineBytes, sizeof trampolineBytes);
}
void WriteJump(const DWORD_PTR dwWow64Address, const void *pBuffer, size_t ulSize)
{
DWORD dwOldProtect = 0;
(void)VirtualProtect(reinterpret_cast<LPVOID>(dwWow64Address), PAGE_SIZE, PAGE_EXECUTE_READWRITE, &dwOldProtect);
(void)memcpy(reinterpret_cast<void *>(dwWow64Address), pBuffer, ulSize);
(void)VirtualProtect(reinterpret_cast<LPVOID>(dwWow64Address), PAGE_SIZE, dwOldProtect, &dwOldProtect);
}
int main(int argc, char *argv[])
{
const auto hModule = GetModuleHandle(L"ntdll.dll");
NtCreateSection = reinterpret_cast<pNtCreateSection>(GetProcAddress(hModule, "NtCreateSection"));
dwWow64Address = GetWow64Address();
const auto lpNewJumpLocation = CreateNewJump(dwWow64Address);
EnableWow64Redirect(dwWow64Address, static_cast<LPVOID>(Wow64Trampoline));
//Test syscall
HANDLE hSection;
NtCreateSection(&hSection, SECTION_ALL_ACCESS, nullptr, nullptr, PAGE_EXECUTE_READWRITE, SEC_COMMIT | SEC_NOCHANGE, nullptr);
getchar();
return 0;
}
代码工作正常,直到我将钩子(Hook)函数更改为此
void __declspec(naked) NtCreateSectionHook()
{
__asm
{
pushad
mov eax, [esp + 28]
mov SectionAttributes, eax
}
fprintf(stderr, "NtCreateSectionHook called !\n");
if ((SectionAttributes & SEC_NOCHANGE) != 0)
{
fprintf(stderr, "SEC_NOCHANGE found !\n");
}
__asm
{
popad
jmp lpJmpRealloc
}
}
我的代码中的问题是 pushad
指令与 esp
混淆因此我无法再访问堆栈,如果我不使用 pushad/popap
应用程序崩溃了,因为我弄乱了堆栈然后跳转到了真正的函数地址。我想要访问和更改的参数是 NtCreateSection
的第 6 个参数 function .
最佳答案
pushad
不会阻止您访问堆栈。 pushad
将 32 个字节(8 个寄存器,每个 4 个字节)压入堆栈,因此,pushad
之后的任何偏移量都应通过添加 32 进行更正。
关于c++ - x86 asm 访问和编辑 __declspec(naked) 函数中的 stdcall 函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608312/
在与我的同事的谈话中,他提到他不小心在生产中部署了一个“裸体 where 子句”。 什么是“裸 where 条款”? 最佳答案 裸 WHERE 子句将指代始终返回 true 的内容 WHERE 1 =
在我的应用程序中,我需要设置回调,其唯一职责是更新与单独对象中已完成事件关联的状态,以便以后可以查询。但是,由于 API 的设计方式,我不能保证在事件完成时另一个对象仍将拥有,所以我需要存储一个指向该
我正在考虑将为 Windows 编写的脚本引擎移植到 Linux;它适用于 Winamp 的可视化平台 AVS。我不确定目前是否有可能。据我所知,代码正在获取 C 函数 nseel_asm_atan
__declspec(naked) void printfive() { int i = 5; printf("%i\n", i); } 出于某种原因这段代码有效,但我不明白 i 存储在哪
参见 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-condi
当您搜索词 Apex Domains在 Google 搜索中,您获得的首页是 https://help.github.com/en/articles/about-supported-custom-do
我试图在给定一个嵌套列表的情况下获取每个元素的长度;我也想摆脱重复的长度。 例如,嵌套列表 [[1],[1,2],[4..5]] 应该给我 [1,2]。 我可以在交互中通过 nub ( map 长度
如何从 PowerShell 写入标准错误,或捕获以下错误: 错误消息显示为错误(真正写入标准错误,以便 TeamCity 和 Octopus 将其视为错误) 没有堆栈跟踪垃圾扰乱我美丽、简洁的错误消
不确定如何表达这个,但我的意思是有类似 My name isRadu 的东西而不是 My name isRadu .显然不是 h1 的最佳用法元素,但我认为可以原谅。那么,所有 HTML 都应该用适当
问题很简单。 我的代码是: __attribute__ ((naked)) void function(int arg1, int arg2, int arg3) { _asm("push {r
最近我在泛型的上下文中读到一个术语“裸类型约束”。它是做什么的意思?我们在哪里使用它? 最佳答案 顺便说一句,令我感到奇怪的是,这个有点淫秽的术语竟然出现在了 MSDN 文档中。我们当然不会在 C#
我正在尝试获取 __declspec(naked) 函数的原始字节,但是 memcpy 正在返回我不期望的字节。 我使用了调试器来检查字节/地址。一切看起来都很好,但 memcpy 的结果产生了不同的
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
乍一看,Naked Objects看起来非常有前途,因为它们允许快速创建具有基本 UI 的完整系统,然后进行完善。 有没有人有使用任何 .net Naked Objects 框架的实际经验? 我应该如
我有一个 Entity由 lib 和 Registry 定义的类这是管理使用 map 注册到它的实体的类。 我正在尝试做的事情: //Registry Signature void Registry:
我有 Naked 通知 FindBugs 警告。下面是我的代码。 synchronized (this) { this.notify(); } “this”是“public c
尝试一个简单的递归函数,它接受一个数字,以某种方式拆分它,并且只有在拆分后的数字彼此相等时才应该返回它。 package main import "fmt" func split(sum int) (
gcc/g++ 中 __declspec( naked ) 的等价物是什么? __declspec( naked ) 实际上是用来声明一个没有尾声和序言的函数。 最佳答案 在某些体系结构上,gcc 支
$ clang --version clang version 5.0.0 (tags/RELEASE_500/final) . CC ../../py/nlrthumb.c ../../py/nl
我正在 Microsoft Azure 上运行 Django 应用程序,需要将所有流量 301 重定向到单个安全 www 域,即 来自: http://example.com https://exam
我是一名优秀的程序员,十分优秀!