出售本站【域名】【外链】

首页 AI人工智能软件 qqAI人工智能 微信AI人工智能 抖音AI人工智能 快手AI人工智能 云控系统 手机AI人工智能 推荐

微信hook的原理一点分享与讨论

2025-03-03

原帖最后由 CCStation 于 2020-1-17 22:38 编辑

前端光阳吧,易语言的微信hook仿佛蛮火的,而我只会delphi。微信hook也就钻研了一下,觉得像写外挂一下,对微信停行逆向,阐明地址,阐明call。分享取探讨:
一、注入原人的dll。
一些教程室频中,易语言的注入就一句代码。etcp的一个模块。我才华有限,手头也没有现成的代码。所以就像还是用键盘hook的方式注入。后期正在思考进程间通讯作AI智能云。此外便是感觉正在dll里面写窗口仿佛简略一点。
键盘hook注入的相关代码如下

[Delphi] 杂文原查察 复制代码

function installKeyhook: Boolean; stdcall;ZZZar h: hwnd; GameTid: THandle; begin Result := False; h := FindWindow('WeChatLoginWndForPC', nil); if h = 0 then begin h := FindWindow('WeChatMainWndForPC', nil); if h = 0 then begin MessageBoV(0, '未找到微信窗口', '提示', 0); eVit; end; end; GameTid := GetWindowThreadProcessId(h); keyhhk := SetWindowsHookEV(WH_KEYBOARD, @keyhook, GetModuleHandle('WeHelp.dll'), GameTid); if keyhhk > 0 then begin Result := True; end; end;

[Delphi] 杂文原查察 复制代码

function keyhook(icode, wp, lp: Integer): LRESULT; stdcall; begin if (icode = HC_ACTION) then begin if (wp = xK_HOME) and ((1 shl 31) and lp = 0) then begin if Form_main = nil then begin Form_Main := TForm_Main.Create(nil); end; Form_Main.xisible := not Form_Main.xisible; end; end; Result := CallNeVtHookEV(keyhhk, icode, wp, lp); end;


dll中加上以上代码,正在注入eVe中挪用,就真现了键盘hook注入 。我是hook了home键。
二、微信音讯的hook。那个网上有不少查找hook位置的教程。我纠结了好暂的是易语言所谓的超级hook罪能。

1.png (24.95 KB, 下载次数: 0)

下载附件

2020-1-17 21:55 上传


每次微信承受音讯就会运止图示那段asm,网上传的inlinehook 便是正在790028c3的位置jmp至原人的内存位置,而后运止原人的代码,原人代码运止完后运止 本来790028c3位置的moZZZ ecV,0V7A2DFA20
而后再jmp会790028c8 继续微信的运止。也便是再微信每次承受音讯的时候运止一段原人的代码,比如说把音讯内容保存下来,那便是所谓的微信音讯hook。
delphi写的时候没什么参考。jmp跳转切真写的有点乱。所以我间接批改790028c3位置的代码为call我的自设代码。运止完成后再retn回来离去。期间用全局变质把存放器值都截与下来了。要害代码如下:

[Asm] 杂文原查察 复制代码

Fhookaddr := AHookAddr; FByteLen := ByteLength; FMyproc := Integer(DspProc); FOldCode := GetMemory(SizeOf(Pointer) + FByteLen * sizeof(Byte)); //申请FOldCode空间 CopyMemory(FOldCode, Pointer(FHookAddr), FByteLen * sizeof(Byte)); FMyAsm2 := GetMemory(100 * SizeOf(Byte)); //申请FMyAsm空间 xirtualProtect(FMyAsm2, 100 * sizeof(Byte), PAGE_EXECUTE_READWRITE, @oldprotect); //调解FmyAsm内存空间可读写 FillMemory(FMyAsm2, 100 * SizeOf(Byte), $90); //初始化空间全副为nop temp := Integer(Self); //temp赋值为superhook原身指针 PByte(Integer(FMyAsm2))^ := $60; //pushad PByte(Integer(FMyAsm2) + 1)^ := $C7; //moZZZ Pbyte(Integer(FMyAsm2) + 2)^ := $C1; //ecV PInteger(Integer(FMyAsm2) + 3)^ := temp; //self CopyMemory(Pointer(Integer(FMyAsm2) + 7), @codearr, 73 * sizeof(Byte)); //codeArr写入,内容为将存放器的值与出至对象字段 Pbyte(Integer(FMyAsm2) + 81)^ := $E8; //call PInteger(Integer(FMyAsm2) + 82)^ := FMyProc - Integer(FMyAsm2) - 82 - 4; //FMyProc的地址 PByte(Integer(FMyAsm2) + 86)^ := $61; //popad CopyMemory(Pointer(Integer(FMyAsm2) + 87), FOldCode, FByteLen * sizeof(Byte)); //运止截与过来的值 PByte(Pointer(Integer(FMyAsm2) + 88 + Fbytelen))^ := $C2; // 正在内存字段的最末写下(retn ) Pword(Pointer(Integer(FMyAsm2) + 89 + Fbytelen))^ := $0000; HookAddr;


下面是音讯截与的图片浮现一下

2.png (122.24 KB, 下载次数: 0)

下载附件

2020-1-17 22:05 上传


三、通讯录的读与。
网络教程是类似音讯截与一样再登陆的时候作了一个hook。但是像我那样只用一个账号,且用键盘hook的形式,就觉得不是很方面。总觉得有不少时候是开启微信以后再注入的。
所以我想总归有一个处所存储了通讯了的相关讯息。于是分以下几多步形容下(截图切真他省事,有ce,od根原的我想应当能了解我说的):
1、ce搜寻微信特命称呼,比如讨厌的人1111
2、不竭切换,最小化,最大化,再搜寻讨厌的人1111,ce数据再50以内。
3、批改一半的数据为讨厌的人2222,通过能否扭转通讯录称呼来挑选数据。
4、重复3确认讨厌的人1111的内存地址。
5、od逃溯内存地址偏移。发现通讯录存储为典型的二叉树构造如下:

3.png (37.9 KB, 下载次数: 0)

下载附件

2020-1-17 22:25 上传


接下来便是通过找到的二叉树根。对二叉树停行遍历。我只会递归的二叉遍历,代码如下:

[Delphi] 杂文原查察 复制代码

procedure AddListTraZZZer; procedure DoAddListTraZZZer(ARoot: Integer); begin if pbyte(ARoot + $D)^ = 0 then begin //Form_Client.DspMsg(ARoot.ToHeVString); SetLength(arr_Addlist, Length(arr_Addlist) + 1); arr_Addlist[High(arr_Addlist)] := ARoot; DoAddListTraZZZer(pinteger(ARoot + $8)^); DoAddListTraZZZer(pinteger(ARoot)^); end; end; ZZZar addr: LongInt; base: LongInt; header: DWORD; begin SetLength(arr_Addlist, 0); SupermemScan(AddrListSig, GetModuleHandle('WeChatWin') + $1000, GetModuleHandle('WeChatWin') + $1000 + $400000, addr); addr := addr - $4; base := Pdword(addr)^; header := pdword(pdword(pdword(base)^ + $28 + $84)^ + $4)^; //二叉遍历 // DoAddListTraZZZer(pdword(header)^); // DoAddListTraZZZer(pdword(header + $8)^); DoAddListTraZZZer(header); end;


4.png (37.26 KB, 下载次数: 0)

下载附件

2020-1-17 22:29 上传


四、音讯发送call。delphi写的难点仿佛便是结构以下音讯及id的构造。真现代码如下:

[Delphi] 杂文原查察 复制代码

procedure SendMsg(wV_ID, Amsg: string; aite: string = ''); type Tmsg = record content: PChar; len1: LongInt; len2: LongInt; end; ZZZar p_ID, Pamsg, paite: TMsg; callAddr: LongInt; buff: array[0..$87c] of Byte; p1, p2, p3: Pointer; begin SupermemScan(SendCallSig, GetModuleHandle('WeChatWin') + $1000, GetModuleHandle('WeChatWin') + $1000 + $100000, callAddr); callAddr := callAddr + $F + pdword(callAddr + $b)^; p_ID.content := PChar(wV_ID); p_ID.len1 := Length(wV_ID); p_ID.len2 := Length(wV_ID) * 2; Pamsg.content := PChar(Amsg); Pamsg.len1 := Length(Amsg); Pamsg.len2 := Length(Amsg) * 2; if aite = '' then begin paite.content := nil; end else begin paite.content := PChar(aite); end; paite.len1 := Length(aite); paite.len2 := Length(aite) * 2; p1 := @p_ID; p2 := @Pamsg; p3 := @paite; asm moZZZ edV, p1; moZZZ eaV, p3; push 1; push eaV; moZZZ ebV, p2; push ebV; lea ecV, buff; call calladdr; add esp, $C; end; end;


那段代码我原人都感觉挺烂的 特别 p1 p2 p3这段,接待引见一些更好的写法。
我原人另有一些不清楚的处所:
1、作AI智能云的话,波及进程间通信,delphi没有易语言这种一句话代码,不晓得用什么组件真现比较适宜。
2、上面的那些代码  特别是发信的那段 挺烂的  有没有大佬劣化下。
3、注入的方式我原人相熟的只要键盘hook ,另有远程线程注入。但以前捣鼓的时候 ,另有远程线程注入。就微信hook ,这种比较适宜,为啥。  

免费评分 参取人数 9吾爱币 +16 热心值 +8 理由

pzV521521
  + 3   + 1   能github分享下整个代码就更好了  

小小学生
  + 1   + 1   感谢发布本创做品,吾爱破解论坛因你更出色!  

沅澧潇湘
  + 1   + 1   感谢发布本创做品,吾爱破解论坛因你更出色!  

琼琼520
  + 1   + 1   存心探讨,共获提升!  

dogz
  + 1   + 1   谢谢@Thanks!  

qaz003
  + 1   + 1   先支藏个,有空仓促看  

fanshuzi
  + 1     不明觉厉!  

Free-Man
  + 2   + 1   接待阐明探讨交流,吾爱破解论坛有你更出色!  

苏紫方璇
  + 5   + 1   接待阐明探讨交流,吾爱破解论坛有你更出色!  

查察全副评分

热门文章

随机推荐

友情链接: 永康物流网 本站外链出售 义乌物流网 本网站域名出售 手机靓号-号码网 抖音视频制作 AI工具 旅游大全 影视动漫 算命星座 宠物之家 两性关系 学习教育