吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23144|回复: 75
收起左侧

[原创] PCXX逆向:使用HOOK拦截二维码

  [复制链接]
鬼手56 发表于 2019-6-18 19:35
本帖最后由 鬼手56 于 2020-5-22 10:31 编辑

微信版本

1560677009285.png

寻找微信二维码基址

PNG文件格式

微信二维码在内存中存放形式是png格式的二进制数据,所以我们需要眼熟一下png的文件格式,如图

1560669161291.png

前32个字节是固定的,分别是btPngSignature和struct PNG_CHUNK chunk结构,其中保存有png图片的标识。

其中NG和IHDR是每个PNG文件都会有的标识,眼熟一下就好。微信的二维码图片就是通过这种格式在内存中存放

使用CE过滤基址

首先在微信未登录状态下附加微信,此时二维码还未加载

1560682781941.png

然后选择未知的数值,点击首次扫描

1560682899051.png

出现三百万个结果

1560682929290.png

此时我们再次点击切换账号,出现二维码,让保存二维码的地址被赋值

1560682947716.png

然后选择变动的数值 再次扫描

1560683022853.png

此时还剩下七万个结果

1560683091901.png

然后用手机扫描二维码 不要点击登录,再次扫描变动的数值,此时还剩三万多个结果

1560683144937.png

接着随意移动微信框,点击未变动的数值,还剩一万多个结果。返回二维码登录重复以上操作,直到地址栏还剩下两个绿色的基址,这两个绿色的基址就是我们要的。

1560683864454.png

因为随机基址的存在,这个地址在各位的电脑上是不一样的。但是低四位是一致的,这两个地址应该是xxxx9194和xxxx919C。

使用OD确定二维码基址

然后重启一次微信,再用CE附加,回到这个状态

1560683957722.png

1560684279776.png

用OD附加微信,在找到的第一个地址xxxx9194下内存写入断点

1560684363936.png

点击切换账号,在二维码未加载时程序会断下。注意,这个地方会断下来两次,第二次才是我们要的结果。

因为二维码是存放在微信的核心模块WeChatWin中的,所以我们在堆栈中找到所有的WeChatWin中的函数
1560684480806.png

像这种API的调用就可以直接排除掉,然后在每一个疑似函数上下断点。找的时候堆栈尽量往下拉,这个函数会比较靠后。

因为我已经找过一遍了,所以直接告诉你们是这一个。特征是有一个ecx传参。
1560684611473.png

接着在这个函数上下断点,删除内存访问断点,F9运行

1560684746032.png

然后扫一下二维码,点击返回二维码登录,程序断下

1560684799889.png

此时观察ecx指针的内容,明显是一个结构体,结构体的第一个是地址,第二个好像是大小。然后在这个地址上数据窗口跟随

1560684893057.png

里面是PNG文件的二进制数据,这个就是我们要找的微信二维码的基址

验证二维码基址

打开PCHunter,选择微信进程,查看->查看进程内存,输入地址和大小,然后将内存dump下来

1560686382953.png

打开图片
1560686450607.png

现在已经确定就是我们需要的二维码。然后我们将这个call的地址减去模块基址,记录下偏移。待会需要HOOK这个call

寻找微信二维码内容的基址

微信二维码的存储内容

二维码其实是一种开放性的信息存储器,它将固定的信息存储在自己的黑白小方块之间。大部分的二维码都有一个特点,就是里面存放的其实是一段文本。我们可以利用这个文本来寻找突破口

将微信的二维码截图保存,然后用在线的二维码解码器解析微信的二维码
1560673413913.png

可以看到解码之后的结果是一段网址

使用CE寻找二维码内容的基址

1560674037222.png

如果直接搜索这段网址是找不到任何结果的,原因是因为微信在保存这段位置的时候,实际上是将它分为了两部分存储

第一部分:http://weixin.qq.com/x
第二部分:/I-yOUnFpRaZOwZyVPC0H

第一部分的固定不变的,第二部分被当作一个参数传入,客户端从服务器获取的只是第二部分的内容。所以我们去搜索第二部分。

另外,微信的二维码会定时刷新,刷新的时候会改变第二部分的内容。如果你搜不到的话可能是因为之前的文本已经失效了。从解析文本到搜索文本最好在一分钟之内完成

此时 我们直接搜索第二部分的文本

1560674983933.png

搜索完成之后,等待二维码自动刷新,然后找到那个变化之后的地址,用截图上传的方式确保找到的是正确的地址

Snipaste_2019-06-16_16-51-39.png

然后用OD附加微信,在找到的地址上下内存写入断点

1560675260805.png

等待二维码自动刷新,二维码刷新时会往原来存放二维码的地址写入新的二维码数据,程序就会断下

1560675831436.png

此时eax指向二维码的文本内容,我们找到堆栈中的第一个地址,在数据窗口显示,此时就能找到存放微信二维码数据的基址了

1560675842669.png

然后我们在CE中添加WeChatWin.dll模块,找到模块基址,算出偏移(用0x104CF618-0xF250000=127F618)。然后将这个地址换成模块基址+偏移的方式添加到CE地址栏。

验证基址

重新打开微信,用CE载入

1560676618134.png

保留当前列表,然后将二维码内容指针的值添加到列表

1560676656260.png

点击确定。此时二维码的内容和解析出来的内容一致,说明基址有效

1560676712846.png

定制微信登录二维码的可能性

那么我们拿到这个二维码的内容有什么作用呢?我们可以将这个获取到的二维码内容调用二维码生成器的API接口进行再次编码,然后生成一个更加漂亮好看专属二维码,效果如图:

1560756111349.png

使用hook截取二维码

接着我们编写一个dll,将这个dll注入到微信进程中,利用IAT Hook截取微信的二维码。部分关键代码如下:

开启HOOK

void StartHook(DWORD dwHookOffset,LPVOID pFunAddr, HWND hWnd)
{
        hDlg = hWnd;
        //拿到模块基址
        DWORD dwWeChatWinAddr = GetWeChatWinAddr();
        //需要HOOK的地址
        DWORD dwHookAddr = dwWeChatWinAddr + dwHookOffset;        

        //填充数据
        jmpCode[0] = 0xE9;
        //计算偏移
        *(DWORD*)(&jmpCode[1]) = (DWORD)pFunAddr - dwHookAddr-5;

        // 保存以前的属性用于还原
        DWORD OldProtext = 0;

        // 因为要往代码段写入数据,又因为代码段是不可写的,所以需要修改属性
        VirtualProtect((LPVOID)dwHookAddr, 5, PAGE_EXECUTE_READWRITE, &OldProtext);

        //保存原有的指令
        memcpy(backCode, (void*)dwHookAddr, 5);

        //写入自己的代码
        memcpy((void*)dwHookAddr, jmpCode, 5);

        // 执行完了操作之后需要进行还原
        VirtualProtect((LPVOID)dwHookAddr, 5, OldProtext, &OldProtext);
}

卸载HOOK

void UnHook(DWORD dwHookOffset)
{
        DWORD dwWeChatWinAddr = GetWeChatWinAddr();
        DWORD dwHookAddr = dwWeChatWinAddr + dwHookOffset;

        // 保存以前的属性用于还原
        DWORD OldProtext = 0;

        // 因为要往代码段写入数据,又因为代码段是不可写的,所以需要修改属性
        VirtualProtect((LPVOID*)dwHookAddr, 5, PAGE_EXECUTE_READWRITE, &OldProtext);

        // Hook 就是向其中写入自己的代码
        memcpy((LPVOID*)dwHookAddr, backCode, 5);

        // 执行完了操作之后需要进行还原
        VirtualProtect((LPVOID*)dwHookAddr, 5, OldProtext, &OldProtext);
}

保存图片

void SaveImg(DWORD qrcode)
{
        //获取图片长度
        DWORD dwPicLen = qrcode + 0x4;
        size_t cpyLen = (size_t)*((LPVOID*)dwPicLen);
        //拷贝图片的数据
        char PicData[0xFFF] = { 0 };
        memcpy(PicData, *((LPVOID*)qrcode), cpyLen);

        //将文件写到本地
        HANDLE hFile = CreateFileA("E:\\qrcode.png",GENERIC_ALL,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
        if (hFile==NULL)
        {
                MessageBox(NULL, "创建图片文件失败", "错误", 0);
                return;
        }

        DWORD dwRead = 0;
        if (WriteFile(hFile, PicData, cpyLen, &dwRead, NULL) == 0)
        {
                MessageBox(NULL, "写入图片文件失败", "错误", 0);
                return;
        }

        CloseHandle(hFile);
        //显示图片
        CImage img;
        CRect rect;
        //拿到控件的句柄
        HWND hPic = GetDlgItem(hDlg, IDC_QRPIC);
        GetClientRect(hPic, &rect);
        //载入图片
        img.Load("E:\\qrcode.png");
        img.Draw(GetDC(hPic), rect);

        //显示二维码内容
        ShowQrCodeContent(hDlg);

        //完成之后卸载HOOK
        UnHook(QrCodeOffset);
}

最终效果

最终效果如图:

1560846321708.png

最后附上工程和成品DLL


Projects.zip

41.02 KB, 下载次数: 162, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 46吾爱币 +46 热心值 +43 收起 理由
sam喵喵 + 1 + 1 热心回复!
zhuzhuxia111 + 1 + 1 我很赞同!
wumin198812 + 1 + 1 我很赞同!
fanmow + 1 + 1 谢谢@Thanks!
小生请留步 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
zj1d + 2 + 1 用心讨论,共获提升!
li6607 + 1 + 1 我很赞同!
THook + 1 用心讨论,共获提升!
听风雨 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
cpj1203 + 1 谢谢@Thanks!
天云草丶少主 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
andrew_a + 1 + 1 热心回复!
九重桂妖 + 1 谢谢@Thanks!
guyinqian + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
不要在意2233 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
secjia + 1 + 1 热心回复!
thenow + 1 谢谢@Thanks!
bigkat + 1 + 1 过程好多没看懂,但真心佩服这种研究精神
jakenlian + 1 + 1 热心回复!
white8963 + 1 用心讨论,共获提升!
jbgsn1998 + 1 + 1 用心讨论,共获提升!
小飞X + 1 + 1 用心讨论,共获提升!
lsrteam70 + 1 + 1 谢谢@Thanks!
bianqi + 1 + 1 用心讨论,共获提升!
Vladimir + 1 谢谢@Thanks!
黑龍 + 3 + 1 优秀都没有?
KSPprince + 1 + 1 用心讨论,共获提升!
坏人mgf + 1 + 1 用心讨论,共获提升!
罗大伊 + 1 DLL注入工具和某易的教程界面好像。
余生多指教 + 1 + 1 用心讨论,共获提升!
郭菲菲 + 1 + 1 热心回复!
zxw0557 + 1 + 1 用心讨论,共获提升!
9152pojie + 1 + 1 我很赞同!
t18670754321 + 1 + 1 谢谢@Thanks!
Monitor + 3 + 1 鼓励转贴优秀软件安全工具和文档!
周董JJ特大号 + 1 + 1 我很赞同!
daimiaopeng + 1 + 1 我很赞同!
qaz003 + 1 + 1 666..好喜欢码贴...
q597220017 + 1 + 1 厉害厉害
袁煜914 + 1 + 1 应该受到鼓励,很精彩,继续!相信一定能更上一层楼!
笙若 + 1 + 1 谢谢@Thanks!
repobor + 1 + 1 我很赞同!
GenW + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
凯咪 + 1 我很赞同!
加油 + 1 + 1 希望出更多教程
du4723711 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

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

qaz003 发表于 2019-6-19 02:23

++

%D0%BB%D0%BB%B7%D6%CF%ED%2C+%B8%C4%B0%E6%D6%AE%BA%F3%D3%D6%BF%B4%B5%BD%D5%E2%C3%B4%BA%C3%BF%B4%B5%C4%B7%D6%CE%F6%C1%CB..
血情 发表于 2019-6-18 20:41
xmtt2008 发表于 2019-6-18 20:45

++

%B8%D0%BE%F5%B4%F3%C9%F1%CA%B5%D4%DA%CC%AB%C0%F7%BA%A6%C1%CB%7B%3A1_921%3A%7D
iemaile 发表于 2019-6-18 20:21

++

干货  实在太厉害了
头像被屏蔽
加油 发表于 2019-6-18 20:23
很详细一学就会
ermao 发表于 2019-6-18 20:48
牛批牛批
K小密 发表于 2019-6-18 21:07
果然是大佬
寒号.鸟 发表于 2019-6-18 21:20

++

思路清晰,但不仅仅只是为了美化二维码吧?
夏雨微凉 发表于 2019-6-18 22:45
大神的骚操作是真多啊
ripley_l 发表于 2019-6-18 22:48

++

%B4%F3%C0%D0%A3%A1%C5%E5%B7%FE%C5%E5%B7%FE
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-22 16:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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