1. 首先确定微信放多开是如何确定的, 大多数程序的防多开都是使用互斥体来完成, 所以就从创建互斥体的 API 开始下手 (CreateMutexA/CreateMutexW)
可以看到创建互斥体的名称
一般程序在防多开 zhong 都是判断判断互斥体的名称是否相同, 所以我们做个实验来验证我们猜想的是否正确
(使用 x32dbg 直接修改内存效果一样)
修改值直接运行, 并接着在打开一个微信, 结果如下
, 双开成果, 说明我们的猜测是正确的, 所以直接用 apiHook,Hook CreateMutexW 函数, 修改 chau 纳入的第三个参数, 就可以过掉微信防多开, dll 代码如下
- void HookApi()
- {
- // 获取 CreateMutexW 函数地址
- Addr = GetProcAddress(LoadLibraryA("Kernel32.dll"), "CreateMutexW");
- // 保存原始的指令
- memcpy(OldOpcode, Addr, 5);
- // 计算跳转偏移
- DWORD Offset = (DWORD)HookCreateMutexA - (DWORD)Addr - 5;
- // 组合新的 Opcode
- *(DWORD*)&JmpOpcode[1] = Offset;
- }
- HANDLE WINAPI HookCreateMutexA(
- LPSECURITY_ATTRIBUTES lpMutexAttributes,
- BOOL bInitialOwner,
- LPCSTR lpName
- )
- {
- HANDLE Handle = 0;
- // 调用 CreateMutexW 创建不同名称的互斥体
- Handle = CreateMutexW(lpMutexAttributes, bInitialOwner, L"bbbbbbbb23333333");
- return Handle;
- }
- void EnableHook(BOOL Enable = TRUE)
- {
- DWORD OldProtect = 0;
- // 修改内存页属性, 可读写
- VirtualProtect(Addr, 5, PAGE_EXECUTE_READWRITE, &OldProtect);
- // 填充新的 Opcode
- memcpy(Addr,Enable ? JmpOpcode:OldOpcode, 5);
- // 还原目标地址所在分页的属性
- VirtualProtect(Addr, 5, OldProtect, &OldProtect);
- }
来源: http://www.bubuko.com/infodetail-3295584.html