吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 18006|回复: 61
收起左侧

[原创] PCXX逆向:使用HOOK获取好友列表和群列表

  [复制链接]
鬼手56 发表于 2019-7-14 15:23
本帖最后由 鬼手56 于 2019-7-27 10:32 编辑

获取好友列表目前有三种方法,第一种就是二叉树遍历,通过一层一层的往下读取来拿到所有的好友列表。第二种是通过在内存里面找好友的地址列表。第三种就是通过查找微信数据库来获取列表

获取好友列表的切入点

要想获取微信的好友列表,就必须找到微信读取好友列表的地方。突破口在于微信在点击个人名片时,会获取当前联系人的详细信息,然后显示在右侧。

那么我们可以大胆猜测 微信在登陆的时候,需要先调用这个call,循环拿到所有好友的详细信息,然后再显示到右侧

1561183879250.png

第一步:我们首先要找到微信获取好友详细信息的函数。这个函数在读取好友列表时必然会被调用,第二步,再通过这个函数找到获取好友列表的地方。

另外还有一种方法就是通过好友的数量,先搜索当前好友的数量,然后删除一个,再次搜索。直到找到保存好友数量的地址。

定位查询好友信息的函数

那么如何找到查询好友信息的函数呢?突破口在于当前窗口的微信号,只要找到微信号的地址,然后对微信号下内存写入断点,栈回溯分析就能找到我们需要的函数。

定位微信号的地址

1561184540896.png

首先搜索当前的微信号,勾选Unicode

1561184673768.png

接着切换联系人,再次扫描

1561184758916.png

最终会剩下五个结果,我们需要逐个排查每一个结果

一次错误的尝试

1561185026387.png

随便找一个地址,下内存写入断点。然后切换当前联系人窗口,断点断下。删除内存断点。

我们需要找到一个地址,地址里面包含联系人的所有信息

1561186112286.png

在堆栈的地址中我们发现了一个返回地址,返回地址下面有微信的个人数据。那么这个有可能就是我们需要的call

切换当前窗口联系人,等待断点断下

1561186264984.png

此时,堆栈和eax寄存器中保存了当前联系人的所有数据

1561186352403.png

继续往下拉会发现eax中保存有签名和国家等信息。也就是说这个call里面保存了当前聊天窗口的好友的所有信息。

接着我们删除好友,让好友列表刷新,看看这个地方会不会断下来。如果会断下来,那么这个地方就有可能保存了所有好友的信息。

1561186837830.png

删除之后,断点并未断下,那么这个call就不是我们想要的

再次查找目标函数

继续找另外一个地址,下内存写入断点

1561186862582.png

此时再次搜索返回地址,你会发现在压入返回地址前的一个参数中有一个完整的好友信息

1561187152168.png

这个call将一个完整的好友信息压入堆栈,那么说明这个call之前好友信息已经被查询出来了。我们需要继续往上找, 反汇编窗口跟随这个call

1561187301982.png

在函数头部的位置下断点

1561187322546.png

等程序断下时在堆栈中找到返回地址

1561187421778.png

然后在找到的上一层函数下断点,断下之后按F8单步步过,看看这个函数的作用是什么

1561187537291.png

在这个call执行完毕之后,edi里面保存的就是好友的所有信息。那么说明这个call的作用就是查询当前好友的详细信息!

成功定位获取好友信息的函数

接着我们F7进入这个函数,看看好友的详细信息具体是从哪里个函数中查询出来的

1561188001418.png

单步到这里我们发现在进入临界区之后有一个函数,这个函数将微信ID的指针压入栈,我们F8步过函数查看一下返回值
1561188079745.png

此时eax里保存了当前好友的所有详细信息。通过参数和返回值也就可以猜到这个call的作用是通过微信ID获取详细信息。那么我们第一步就算是大功告成了。

定位获取好友列表的函数

我们重新载入微信,然后在找到的获取好友详细信息的函数下断点

1561189900811.png

登录微信,此时断点断下,接着按F8步过

1561190243456.png

此时eax寄存器中保存有联系人的数据,这个函数会调用多次,每调用一次查询一个好友信息。

事实上获取好友列表的call不止这一个地方,但是这个地方拿到的数据是最多的。可以拿到所有的好友列表和群列表以及公众号

函数已经找到了,那么我们只要写一个dll,注入到微信的进程空间中,利用Inline HOOK就能获取到所有的好友列表了

示例代码

部分示例代码如下:

开始HOOK:

]VOID StartHook(DWORD hookAdd, LPVOID jmpAdd)
{
        BYTE JmpCode[HOOK_LEN] = { 0 };

        JmpCode[0] = 0xE9;

        *(DWORD *)&JmpCode[1] = (DWORD)jmpAdd - hookAdd - HOOK_LEN;

        HANDLE hWHND = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());

        //备份数据
        if (ReadProcessMemory(hWHND, (LPVOID)hookAdd, backCode, HOOK_LEN, NULL) == 0) {
                MessageBox(NULL, "hook地址的数据读取失败", "读取失败", MB_OK);
                return;
        }

        if (WriteProcessMemory(hWHND, (LPVOID)hookAdd, JmpCode, HOOK_LEN, NULL) == 0) {
                MessageBox(NULL, "hook写入失败,函数替换失败", "错误", MB_OK);
                return;
        }

}

显示好友列表

VOID insertUserLists(DWORD userData)
{
        DWORD wxidAdd = userData + 0x10;
        DWORD wxuserIDAdd = userData + 0x44;
        DWORD wxidV1Add = userData + 0x58;
        DWORD wxNickAdd = userData + 0x8C;
        DWORD headPicAdd = userData + 0x11C;
        //DWORD wxNickAdd = userData + 0x8C;

        wchar_t wxid[0x100] = {0};
        if ((LPVOID *)wxidAdd) {
                swprintf_s(wxid, L"%s", *((LPVOID *)wxidAdd));
        }

        wchar_t nick[0x100] = { 0 };
        if ((LPVOID *)wxNickAdd) {
                swprintf_s(nick, L"%s", *((LPVOID *)wxNickAdd));
        }

        wchar_t wxuserID[0x100] = { 0 };
        if ((LPVOID *)wxuserIDAdd) {
                swprintf_s(wxuserID, L"%s", *((LPVOID *)wxuserIDAdd));
        }

        if (oldWxid[0] == 0 && newWxid[0] == 0) {
                swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
        }

        if (oldWxid[0] == 0 && newWxid[0] != 0) {
                swprintf_s(oldWxid, L"%s", newWxid);
                swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
        }

        if (oldWxid[0] != 0 && newWxid[0] != 0) {
                swprintf_s(oldWxid, L"%s", newWxid);
                swprintf_s(newWxid, L"%s", *((LPVOID *)wxidAdd));
        }

        if (wcscmp(oldWxid,newWxid) != 0) {

                LVITEM item = { 0 };
                item.mask = LVIF_TEXT;

                item.iSubItem = 0;
                item.pszText = UnicodeToANSI(wxid);
                ListView_InsertItem(gHwndList, &item);
                ////wxuserID
                item.iSubItem = 1;
                item.pszText = UnicodeToANSI(wxuserID);
                ListView_SetItem(gHwndList, &item);

                item.iSubItem = 2;
                item.pszText = UnicodeToANSI(nick);
                ListView_SetItem(gHwndList, &item);
        }
}

实际效果

1563088393983.png

预告

最后,预告下一期,我的微信助手成品即将完成,现已完成大部分功能,再添加几个功能就全部完成了,届时将开放成品和所有源代码

WeChatHelper.png
目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star
https://github.com/TonyChen56/WeChatRobot




自动收款.gif

免费评分

参与人数 47威望 +1 吾爱币 +56 热心值 +44 收起 理由
tryotry + 1 + 1 谢谢@Thanks!
萌萌哒胖次 + 1 + 1 谢谢@Thanks!
zgl263885 + 1 + 1 感谢!
guapi010203 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
horder + 1 + 1 用心讨论,共获提升!
柢年丶 + 1 + 1 用心讨论,共获提升!
woaixuan123 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Hsueh.L + 1 + 1 谢谢@Thanks!
1475481801 + 1 谢谢@Thanks!
wyf313034926 + 1 + 1 我很赞同!
langjty + 1 热心回复!
CrazyNut + 3 + 1 膜拜大佬
tianshishen + 1 + 1 谢谢@Thanks!
无名低调me + 1 + 1 谢谢@Thanks!
chuntian22 + 1 + 1 谢谢@Thanks!
Joniak + 1 + 1 我很赞同!
imwangxm + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yiwai2012 + 1 + 1 这个应该射个精华
ufo0033 + 1 + 1 我很赞同!
mlj0381 + 1 + 1 期待成品
名字我得想想 + 1 + 1 加油
VIP88888888 + 1 + 1 感谢分享!!期待成品!!!
天云草丶少主 + 1 + 1 老铁,群相关那里可以找出别人@人被@的那个人的标识的
董... + 1 + 1 谢谢@Thanks!
wwr2128 + 1 + 1 可以读取的话是不是也可以挂进去实现批量备注编辑?
苏裹咿丶 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Stillthekid + 1 + 1 我很赞同!
qaz003 + 1 + 1 码贴不易呀...见一次赞一次..
beiqi2009 + 1 我很赞同!
美丽兔兔 + 1 + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
gunxsword + 1 + 1 谢谢@Thanks!
zzy0711 + 1 + 1 谢谢@Thanks!
newbie2019 + 1 + 1 谢谢@Thanks!
po1718 + 2 + 1 谢谢@Thanks!
十三月的风 + 3 + 1 期待你的作品!
c0okie5 + 1 热心回复!
十一大魔王i + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dongwuai + 1 + 1 我很赞同!
z13678 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
肚子会饿 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qweasd88866 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
1354381312 + 1 + 1 谢谢@Thanks!
ljwz + 1 + 1 我很赞同!
coolcalf + 1 + 1 鼓励转贴优秀软件安全工具和文档!
已经好晕了 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Avenshy 发表于 2019-7-14 15:37
卧槽 这么好的帖子竟然没人回复
用ce也是个非常棒的方法 受教了
吴小贱 发表于 2019-7-14 15:53
期待成品                                                                             
neal420 发表于 2019-7-14 15:45
1426868 发表于 2019-7-14 15:54
非常好的帖子学习了感谢
小强66 发表于 2019-7-14 16:05
好,好,真心不错
ryosama 发表于 2019-7-14 16:05
谢谢楼主分享
ahtclgb 发表于 2019-7-14 16:25
谢谢分享了,虽然我看不懂。
kfccfk 发表于 2019-7-14 16:29
期待        顶
黑色切线 发表于 2019-7-14 16:38
6666等待下一期
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 01:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表