这个协议其实跟网上分享的小程序调用查微信号接口不一样,我这种是另类的,但是能实现同样的效果代码我整合好了,就纯代码,UI界面下面我也会分享出来,主要是协议代码需要大家好好学习研究一下,我自己也研究了很久才HOOK出来的,需要服务器和客户端连接奥,我这边只分享服务端的代码,也就是核心的数据转换代码。
UI界面:
核心代码:【转换实现解密】仅供学习!
========================================================
.版本 2
.支持库 spec
.程序集 窗口程序集_启动窗口, , , 本源码来自易语言资源网(www.eyuyan.la)
.子程序 _按钮1_被单击, , , 易语言学习资源、源码下载站:www.eyuyan.la
.局部变量 好友信息, 好友信息
查询好友信息 (“weixin”, 好友信息)
调试输出 (好友信息.昵称)
' 调用了模块,我用的是精易模块6.9和超级模块9.2
.子程序 查询好友信息, , , $SEH 3.7.6.29 通过微信id查询好友信息
.参数 微信ID, 文本型
.参数 好友信息, 好友信息, 参考
.局部变量 进程句柄, 整数型
.局部变量 组装代码, 字节集
.局部变量 线程句柄, 整数型
.局部变量 参数地址, 整数型
.局部变量 字节集数据, 字节集
.局部变量 信息缓冲区, 整数型
.局部变量 call_1, 整数型
.局部变量 call_2, 整数型
.局部变量 call_3, 整数型
.局部变量 call_4, 整数型
.局部变量 内存地址, 整数型
.局部变量 Addr, 整数型
.局部变量 变量, 整数型
.局部变量 call_5, 整数型
.局部变量 call_6, 整数型
.局部变量 call_7, 整数型
.局部变量 内存地址2, 整数型
.局部变量 EBX, 整数型
.局部变量 进程PID, 整数型
.局部变量 WeChatWin_DLL, 整数型
' 3.7.6.29
' 63D20000 基址
' 6413E9B2 8D45 08 lea eax,dword ptr ss:[ebp+0x8] ; wxid结构体
' 6413E9B5 B9 ACC62666 mov ecx,WeChatWi.6626C6AC ;WeChatWin_DLL+254C6AC
' 6413E9BA 50 push eax
' 6413E9BB E8 E05A3F00 call WeChatWi.645344A0 ; call 5
' 6413E9C0 84C0 test al,al ; 忽略
' 6413E9C2 0F85 73020000 jnz WeChatWi.6413EC3B ; 忽略
' 6413E9C8 E8 F34DD1FF call WeChatWi.63E537C0 ; call 6
' 6413E9CD 8D4D 08 lea ecx,dword ptr ss:[ebp+0x8] ; wxid结构体
' 6413E9D0 51 push ecx
' 6413E9D1 8BC8 mov ecx,eax
' 6413E9D3 E8 D8E10D00 call WeChatWi.6421CBB0 ; call 7 查询call在这里面
' 查询call
' 6421CC13 8D85 04FCFFFF lea eax,dword ptr ss:[ebp-0x3FC] ; 好友信息缓冲区
' 6421CC19 C745 FC 0000000>mov dword ptr ss:[ebp-0x4],0x0 ; 忽略
' 6421CC20 50 push eax ; push 缓冲区地址
' 6421CC21 56 push esi ; push 微信id结构体
' 6421CC22 8BCF mov ecx,edi
' 6421CC24 E8 D7CFFFFF call WeChatWi.64219C00 ; 查询call,
进程PID = 进程_名取ID (“WeChat.exe”)
WeChatWin_DLL = Get_modH (进程PID, “WeChatWin.dll”)
进程句柄 = OpenProcess (2035711, 0, 进程PID)
call_4 = WeChatWin_DLL + 十六到十 (“4F9C00”)
call_5 = WeChatWin_DLL + 十六到十 (“8144A0”)
call_6 = WeChatWin_DLL + 十六到十 (“1337C0”)
内存地址 = VirtualAllocEx (进程句柄, 0, 2048, 4096, 64)
信息缓冲区 = VirtualAllocEx (进程句柄, 0, 4096, 4096, 64)
写内存整数型 (进程PID, 内存地址 + 1024, WeChatWin_DLL + 十六到十 (“630E30”))
写内存整数型 (进程PID, 内存地址 + 1028, 内存地址 + 1024)
EBX = 内存地址 + 1028
置汇编代码 ({ })
Pushad ()
Mov_EAX (内存地址 + 100) ' 微信id结构体
Mov_ECX (WeChatWin_DLL + 十六到十 (“254C6AC”)) ' 常量
Push_EAX ()
Call_Ptr (内存地址 + 1004) ' call 5
Call_Ptr (内存地址 + 1008) ' call 6
Mov_ECX (内存地址 + 100) ' 微信id结构体
' 寄存器的值也要传过去,不然微信崩溃
Mov_ECX_EAX ()
Mov_EDI_ECX ()
Mov_EAX (信息缓冲区)
Push_EAX ()
Mov_ESI (内存地址 + 100)
Push_ESI ()
Mov_ECX_EDI ()
Call_Ptr (内存地址 + 1000) ' call 4
Mov_EBX (EBX)
Popad ()
ret ()
组装代码 = 取汇编代码 ()
写内存整数型 (进程PID, 内存地址 + 1000, call_4)
写内存整数型 (进程PID, 内存地址 + 1004, call_5)
写内存整数型 (进程PID, 内存地址 + 1008, call_6)
WriteProcessMemory_字节集 (进程句柄, 内存地址 + 200, 编码_Ansi到Unicode (微信ID), 取字节集长度 (编码_Ansi到Unicode (微信ID)), 变量)
写内存整数型 (进程PID, 内存地址 + 100, 内存地址 + 200)
写内存整数型 (进程PID, 内存地址 + 104, 取字节集长度 (编码_Ansi到Unicode (微信ID)))
写内存整数型 (进程PID, 内存地址 + 108, 取字节集长度 (编码_Ansi到Unicode (微信ID)))
写内存整数型 (进程PID, 内存地址 + 112, 0)
写内存整数型 (进程PID, 内存地址 + 116, 0)
写内存字节集 (进程PID, 内存地址, 组装代码, 取字节集长度 (组装代码)) ' 这里是将组装好的机器码写入申请的那块内存。
线程句柄 = CreateRemoteThread (进程句柄, 0, 0, 内存地址, 参数地址, 0, 0) ' 写进去之后执行。
WaitForSingleObject (线程句柄, 2000) ' 等待执行完毕。
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“10”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“14”)) × 2)
好友信息.微信ID = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“24”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“28”)) × 2)
好友信息.微信号 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“38”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“4C”)) × 2)
好友信息.V3 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“58”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“5C”)) × 2)
好友信息.备注 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“6c”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“70”)) × 2)
好友信息.昵称 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“AC”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“B0”)) × 2)
好友信息.英文简称 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“C0”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“C4”)) × 2)
好友信息.英文全称 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“D4”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“D8”)) × 2)
好友信息.备注英文简称 = 编码_Unicode到Ansi (字节集数据)
Addr = 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“E8”))
字节集数据 = 读内存字节集 (进程PID, Addr, 读内存整数型 (进程PID, 信息缓冲区 + 十六到十 (“EC”)) × 2)
好友信息.备注英文全称 = 编码_Unicode到Ansi (字节集数据)
' VirtualFreeEx (进程句柄, 内存地址, 0, 32768)
CloseHandle (线程句柄) ' 关闭
CloseHandle (进程句柄) ' 关闭
.子程序 Get_modH, 整数型, , www.eyuyan.la
.参数 PROC_PID, 整数型
.参数 MOD_NAME, 文本型
.局部变量 模块, 精易_模块信息, , "0"
.局部变量 Inc, 整数型
.局部变量 i, 整数型
.局部变量 句柄, 整数型
Inc = 进程_ID取模块 (PROC_PID, 模块)
.计次循环首 (Inc, i)
.如果 (到文本 (模块 [i].模块文件名) = MOD_NAME)
句柄 = 模块 [i].模块句柄
跳出循环 ()
.否则
.如果结束
.计次循环尾 ()
返回 (句柄)
=========================================================