as614001 发表于 2021-8-5 16:34

C++ 为啥我的变量没有生效

本帖最后由 as614001 于 2021-8-5 16:50 编辑

在开头定义了

bool is_hook_enable_1 = false; //hook开启标志


DWORD hookEnable(BOOL is_hook_enable) {
    if (is_hook_enable) return NULL;
    MessageBox(NULL, L"3333", L"看看", 0);
    is_hook_enable = true;
    //hDlg = hModule;
    DWORD WeChatWinDLL = getWeChatWinDLL();
    //取得hook点
    DWORD hook_point = WeChatWinDLL + offset;
    BYTE jmpCode = { 0 };
    jmpCode = 0xE9;//jmp 的字节码
    //新跳转指令中的数据=跳转的地址-原地址(HOOK的地址)-跳转指令的长度
    *(DWORD*)&jmpCode = (DWORD)func - hook_point - HOOK_INS_LEN;//计算并填入跳转的目标地址

      //获取进程句柄
    HANDLE wx_handle = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());
    //备份hook点数据
    int rpm_result = ReadProcessMemory(wx_handle, (LPCVOID)hook_point, (LPVOID)bakcode, HOOK_INS_LEN, NULL);
    if (rpm_result == 0) {
      MessageBox(NULL, L"内存数据读取失败", L"错误", 0);
      return NULL;
    }
    //覆盖hook点数据
    int wpm_result = WriteProcessMemory(wx_handle, (LPVOID)hook_point, jmpCode, HOOK_INS_LEN, NULL);
    if (wpm_result == 0) {
      MessageBox(NULL, L"内存数据写入失败", L"错误", 0);
      return NULL;
    }
    return hook_point;

}

执行

hookEnable(is_hook_enable_1 );
hookEnable(is_hook_enable_1 );
hookEnable(is_hook_enable_1 );

会多次弹窗,看上去是没有赋值到is_hook_enable_1,是因为c++内部变量都是变量?如何可以修改可以生效呢?
百度了下

c++的形参 实参 传递,实参传递的copy值,详见百度 C++中函数变量的引用   。一脸懵逼的出来啦


加 &   



楼下的说得对

wslans 发表于 2021-8-5 16:41

啥意思?你函数里是判断is_hook_enable是本地变量,你每次都传is_hook_enable_1 是false,当然是弹窗了

wslans 发表于 2021-8-5 16:42

你又没改变is_hook_enable_1 的值

wslans 发表于 2021-8-5 16:45

或者你把
DWORD hookEnable(BOOL is_hook_enable)
改成
DWORD hookEnable(BOOL &is_hook_enable)

asdswd 发表于 2021-8-5 18:50

Jack2002 发表于 2021-8-5 19:35

is_hook_enable和 is_hook_enable_1 是两个不同的东西,你这基础不过关啊,好好啃基础吧!

as614001 发表于 2021-8-6 10:40

Jack2002 发表于 2021-8-5 19:35
is_hook_enable和 is_hook_enable_1 是两个不同的东西,你这基础不过关啊,好好啃基础吧!

我没有基础{:1_937:}呀
页: [1]
查看完整版本: C++ 为啥我的变量没有生效