C++memcpy返回true,没有任何更改
C++ memcpy returning true with no changes
我正在尝试编写一个简单的钩子类,它在目标地址安装一个钩子,并将流迂回到自定义函数中。
Main.cpp
#include "SingleHook.h"
#include <iostream>
using namespace std;
void originalFunction()
{
cout << "originalFunction()" << endl;
}
void fakeFunction()
{
cout << "fakeFunction()" << endl;
}
void main()
{
SingleHook sHook((DWORD)originalFunction, (DWORD)fakeFunction);
originalFunction(); //Should call the original function
sHook.InstallHook();
originalFunction(); //Should call the fake function
sHook.UninstallHook();
originalFunction(); //Should again call the original function
cin.get();
}
SingleHook.h
#pragma once
#define HLength 6
#include <windows.h>
class SingleHook {
private:
void* hookTarget;
byte originalBytes[HLength];
byte hookBytes[HLength];
public:
SingleHook(DWORD originalFunction, DWORD targetFunction)
{
//backing up original bytes
::memcpy(originalBytes, &originalFunction, HLength);
//generating hook bytes
hookBytes[0] = 0x68; //push
hookBytes[1] = ((byte*)targetFunction)[0];
hookBytes[2] = ((byte*)targetFunction)[1];
hookBytes[3] = ((byte*)targetFunction)[2];
hookBytes[4] = ((byte*)targetFunction)[3];
hookBytes[5] = 0xC3; //retn
//setting up hook target
hookTarget = &originalFunction;
}
void* InvokeOriginalFunction(...);
void InstallHook();
void UninstallHook();
};
SingleHook.cpp
#include "SingleHook.h"
void* SingleHook::InvokeOriginalFunction(...)
{
UninstallHook();
//TODO INVOKE ORIGINAL SOMEHOW
InstallHook();
return nullptr;
}
void SingleHook::InstallHook()
{
DWORD oldProt;
::VirtualProtect(hookTarget, HLength, PAGE_EXECUTE_READWRITE, &oldProt);
::memcpy(hookTarget, hookBytes, HLength);
::VirtualProtect(hookTarget, HLength, oldProt, nullptr);
}
void SingleHook::UninstallHook()
{
DWORD oldProt;
::VirtualProtect(hookTarget, HLength, PAGE_EXECUTE_READWRITE, &oldProt);
::memcpy(hookTarget, originalBytes, HLength);
::VirtualProtect(hookTarget, HLength, oldProt, nullptr);
}
现在的问题是,当我安装钩子并尝试调用originalFunction()
时,它仍然进入原始函数,并且没有调用fakeFunction()
。。。我已经仔细检查了代码,一切似乎都很好,但肯定有什么地方找到了。
看看这里:
SingleHook(DWORD originalFunction, DWORD targetFunction)
{
//backing up original bytes
::memcpy(originalBytes, &originalFunction, HLength);
值&originalFunction
是堆栈上变量originalFunction
的地址。请改用(void*)originalFunction
。
需要注意的是,C和C++标准与函数指针和对象指针之间的强制转换没有任何意义——如果目标变量足够大,可以容纳整个地址(不能保证,确实存在代码和数据大小不同的系统(,并且您强制转换回原始指针类型,则会返回原始值。任何其他用法都是未定义的行为。
自变异代码也是未定义的行为。
在运行时重定向函数调用的唯一支持机制是使用函数指针间接进行调用以更改函数指针。
由于该语言没有提供任何保证,您正在深入研究编译器生成的实际指令的细节。。。这意味着你最好看看这些指令,看看调用是否是你期望的地址(在各种条件下,&originalFunction
可能是蹦床的地址,但编译器仍然可能直接向真实的函数体发出调用,或者内联调用,等等(
您可能还必须使用特定于机器的指令来刷新指令缓存,因为对数据的更改通常被认为不会更改代码。在Windows上,有一个FlushInstructionCache
API调用,您需要在修补代码时使用它。阅读关于为什么需要的解释(讨论了非Windows系统,但仍然很好地表达了这个概念(
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 重载更少,则运算符返回相反的布尔值
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 为什么套接字中的 recv() 函数不返回任何内容?
- 哪种返回值的方法在C++中效果更快?
- C++如何使虚拟函数返回任何类型的指针
- 函数使用任何输入返回 0
- 通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
- C++中的函数是否有任何默认返回类型
- 任何更快地生成元素并检查它们是否为素数的方法
- 在C++中使用armadillo lib将条目分配到稀疏矩阵中的任何更快的方法
- 在c++中,任何更好的方法都可以做到这一点,计算谜题的解决方案(49!结果,49个循环)
- 计算分布流中字符串数的任何更快方法