我正在用C编写程序,我使用内联asm。在内联汇编程序代码中有一些地址,我想在运行时修补它们。
快速的代码示例如下:
void __declspec(naked) inline(void)
{
mov eax, 0xAABBCCDD
call 0xAABBCCDD
}
说我想修改主C程序的0xAABBCCDD值。 我试图做的是调用VirtualProtect一个函数的指针,使其成为可写函数,然后调用memcpy为代码添加适当的值。
DWORD old;
VirtualProtect(inline, len, PAGE_EXECUTE_READWRITE, &old);
然而,VirtualProtect失败,GetLastError()返回487,这意味着访问无效地址。任何人都有关于这个问题的线索? 感谢
答案 0 :(得分:1)
这不起作用吗?
int X = 0xAABBCCDD;
void __declspec(naked) inline(void)
{
mov eax, [X]
call [X]
}
答案 1 :(得分:1)
如何在运行时将其添加到另一个进程
您可以像这样获得基本地址
DWORD dwGetModuleBaseAddress(DWORD dwProcessID)
{
TCHAR zFileName[MAX_PATH];
ZeroMemory(zFileName, MAX_PATH);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, dwProcessID);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
DWORD dwModuleBaseAddress = 0;
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if (wcscmp(ModuleEntry32.szModule, L"example.exe") == 0)
{
dwModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
CloseHandle(hProcess);
}
return dwModuleBaseAddress;
}
假设您有一个本地变量和您的基地址
mov dword ptr ss : [ebp - 0x14] , eax;
mov eax, dword ptr BaseAddress;
add eax, PA;
call eax;
mov eax, dword ptr ss : [ebp - 0x14] ;
您必须在调用返回后恢复Register的值,因为此值可能在代码执行过程中的某处使用,假设您尝试在调用后修补可能依赖eax寄存器的现有应用程序。尽管这种方法有其缺点,但至少它会让任何人知道该怎么做。