type
status
date
slug
summary
tags
category
icon
password
一、注入原理
- 在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以将DLL文件加载到自身进程中。
- 用 CreateRemoteThread() 函数创建一个远程线程,让目标进程调用LoadLibrary() 来加载我们自己写的DLL 。CreateRemoteThread() 有这几个参数比较关键:A:想要注入的进程的句柄,这里可以通过OpenProcess()得到; B:想要运行的函数,本例中当然是 LoadLibrary() 啦; C: 所运行函数的参数,本例中是自己写的DLL的存放路径。
- 这就需要在内存中开辟一块空间,把路径写入进去。这要先用 VirtualAllocEx()开辟一块空间,然后用WriteProcessMemory() 函数把DLL路径写进去。
总结:先在目标进程的内存空间里开辟一块新地方,往新地方里面写入DLL的路径,再创建远程线程找到LoadLibrary() 函数,并在刚才开辟的新地方中读取DLL路径,进而加载我们自己写的DLL。
二、构成
1、注入器
- 遍历系统中的进程,找到微信进程(CreateToolhelp32Snapshot、Process32Next)
- 打开微信进程,获得HANDLE(OpenProcess)
- 在微信进程中为DLL文件路径字符串申请内存空间(VirtualAllocEx)
- 把DLL文件路径字符串写入到申请的内存中(WriteProcessMemory)
- 从Kernel32.dll中获取LoadLibraryA的函数地址(GetModuleHandle、GetProcAddress)
2、Dll文件
- 获取WeChatWin.dll的基址
- hook指定地址改变函数
- 保存当前寄存器状况方便恢复现场
- 跳转至自己的逻辑
- 恢复现场
三、wx多开
在Windows系统里面要实现单实例运行,基本都是用互斥体来实现的。互斥体,只能同时被一个线程持有, 只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
微信的Mutex名字是:_WeChat_App_Instance_Identity_Mutex_Name
1、修改WeChatWin.dll
修改字节,改变Mutex名字。
2、Hook内存
- 作者:404False
- 链接:https://blog.404nofoundx.top//article/ff688b5f-a8ae-4533-a133-c61eff57af2f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。