如下源码也是从论坛里高手处找到的,感谢原提供者。但找到的群成员信息不完整,特别是群成员较多时,只能显示前面一部分群成员信息,加大内存长度无效。
有请高手指点
.版本 2
.支持库 spec
.子程序 取指定群成员的昵称, 文本型, , 3.6.0.18 版VX
.参数 群ID, 文本型
.参数 成员ID, 文本型
.局部变量 Call_Addr, 整数型
.局部变量 进程句柄, 整数型
.局部变量 群ID结构体, 整数型
.局部变量 返回内容结构体, 整数型
.局部变量 群ID内容_Unicode, 整数型
.局部变量 群ID内容_Ascii, 整数型
.局部变量 Addr, 整数型
.局部变量 群成员信息, 群成员信息
.局部变量 字节集数据, 字节集
.局部变量 组装代码, 字节集
.局部变量 执行代码区, 整数型
.局部变量 线程句柄, 整数型
.局部变量 参数地址, 整数型
.局部变量 数据库句柄地址, 整数型
.局部变量 Call_Addr_Frist, 整数型
.局部变量 Call_Addr_Then, 整数型
.局部变量 T_SZ, 文本型, , "0"
.局部变量 N_SZ, 文本型, , "0"
.局部变量 T_NUM, 整数型
.局部变量 N_NUM, 整数型
.局部变量 i, 整数型
进程PID = 进程_名取ID (“WeChat.exe”)
WeChatWin_DLL = 取模块句柄 (进程PID, “WeChatWin.dll”)
Call_Addr = WeChatWin_DLL + 十六到十 (“3E46D0”)
Call_Addr_Frist = WeChatWin_DLL + 十六到十 (“64BBB0”)
Call_Addr_Then = WeChatWin_DLL + 十六到十 (“BF550”)
进程句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 0, 进程PID) ' 再取得进程句柄
群ID内容_Unicode = VirtualAllocEx (进程句柄, 0, 2048, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
群ID内容_Ascii = VirtualAllocEx (进程句柄, 0, 2048, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
群ID结构体 = VirtualAllocEx (进程句柄, 0, 2048, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
返回内容结构体 = VirtualAllocEx (进程句柄, 0, 4096, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
写内存字节集 (进程PID, 群ID内容_Unicode, 编码_Ansi到Unicode (群ID), 取字节集长度 (编码_Ansi到Unicode (群ID)))
写内存字节集 (进程PID, 群ID内容_Ascii, 到字节集 (群ID), 取文本长度 (群ID))
写内存整数型 (进程PID, 群ID结构体, 群ID内容_Unicode)
写内存整数型 (进程PID, 群ID结构体 + 4, 取文本长度 (群ID) + 2)
写内存整数型 (进程PID, 群ID结构体 + 8, 取文本长度 (群ID) + 2)
写内存整数型 (进程PID, 群ID结构体 + 12, 群ID内容_Ascii)
写内存整数型 (进程PID, 群ID结构体 + 16, 取文本长度 (群ID))
写内存整数型 (进程PID, 群ID结构体 + 20, 0)
写内存整数型 (进程PID, 群ID结构体 + 2000, Call_Addr)
写内存整数型 (进程PID, 群ID结构体 + 2004, Call_Addr_Frist)
写内存整数型 (进程PID, 群ID结构体 + 2008, Call_Addr_Then)
置汇编代码 ({ })
Pushad ()
Mov_ECX (返回内容结构体)
Call_Ptr (群ID结构体 + 2004)
Call_Ptr (群ID结构体 + 2008)
Mov_EAX (返回内容结构体)
Push_EAX ()
Mov_EDI (群ID结构体)
Push_EDI ()
Call_Ptr (群ID结构体 + 2000)
Popad ()
ret ()
组装代码 = 取汇编代码 ()
执行代码区 = VirtualAllocEx (进程句柄, 0, 1024, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
写内存字节集 (进程PID, 执行代码区, 组装代码, 取字节集长度 (组装代码)) ' 这里是将组装好的机器码写入申请的那块内存。
' 信息框 (“call线程地址” + #换行符 + 十到十六 (执行代码区, 真), 0, , )
线程句柄 = CreateRemoteThread (进程句柄, 0, 0, 执行代码区, 参数地址, 0, 0) ' 写进去之后执行。
WaitForSingleObject (线程句柄, 2000) ' 等待执行完毕。
加大了内存长度也不行,请高人指点下,这段源码也是群里找来的,感谢原提供者
Addr = 读内存整数型 (进程PID, 返回内容结构体 + 十六到十 (“8”))
字节集数据 = 读内存字节集 (进程PID, Addr, 100)
群成员信息.群ID = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 返回内容结构体 + 十六到十 (“1C”))
字节集数据 = 读内存字节集 (进程PID, Addr, 4800)
群成员信息.群成员数组 = 到文本 (字节集数据)
Addr = 读内存整数型 (进程PID, 返回内容结构体 + 十六到十 (“34”))
字节集数据 = 读内存字节集 (进程PID, Addr, 2400)
群成员信息.群成员昵称数组 = 编码_Unicode到Ansi (字节集数据)
.判断开始 (取文本左边 (群成员信息.群成员昵称数组, 2) = “^G”)
群成员信息.群成员昵称数组 = 取文本右边 (群成员信息.群成员昵称数组, 取文本长度 (群成员信息.群成员昵称数组) - 2)
.默认
.判断结束
调试输出 (群成员信息.群ID)
调试输出 (“======================================”)
调试输出 (群成员信息.群成员数组)
调试输出 (“======================================”)
调试输出 (群成员信息.群成员昵称数组)
' VirtualFreeEx (进程句柄, 内存地址, 0, #MEM_RELEASE) ' 释放我们申请的内存,不然游戏会越来越慢。
CloseHandle (线程句柄) ' 关闭
CloseHandle (进程句柄) ' 关闭
T_SZ = 分割文本 (群成员信息.群成员数组, “^G”, )
N_SZ = 分割文本 (群成员信息.群成员昵称数组, “^G”, )
T_NUM = 取数组成员数 (T_SZ) ' id个数
N_NUM = 取数组成员数 (N_SZ)
调试输出 (到文本 (T_NUM) + “ ” + 到文本 (N_NUM))
.计次循环首 (T_NUM, i)
.如果真 (T_SZ [i] = 成员ID)
返回 (N_SZ [i])
.如果真结束
.计次循环尾 ()
返回 (“”)
|