好好学习,天天向上,一流范文网欢迎您!
当前位置: >> 最新范文 内容页

吾爱破解-LCG-LSG|安卓破解|病毒剖析|www.52pojie.cn

陌陌版本

找寻陌陌二维码基址PNG文件格式

陌陌二维码在显存中储存方式是png格式的二补码数据,所以我们须要眼熟一下png的文件格式,如图

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

其中NG和IHDR是每位PNG文件就会有的标示,眼熟一下就好。陌陌的二维码图片就是通过这些格式在显存中储存

使用CE过滤基址

首先在陌陌未登入状态下附加陌陌,此时二维码还未加载

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

出现三百万个结果

此时我们再度点击切换帐号,出现二维码,让保存二维码的地址被形参

之后选择变动的数值再度扫描

二维码解码器_二维码解码器在线解码_二维码解码器工具

此时还剩下七万个结果

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

接着随便联通陌陌框,点击未变动的数值,还剩一万多个结果。返回二维码登陆重复以上操作,直至地址栏还剩下两个红色的基址,这两个红色的基址就是我们要的。

由于随机基址的存在,这个地址在诸位的笔记本上是不一样的。并且低四位是一致的二维码解码器,这两个地址应当是xxxx9194和xxxx919919C。

使用OD确定二维码基址

之后重启一次陌陌,再用CE附加二维码解码器,回到这个状态

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

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

二维码解码器工具_二维码解码器在线解码_二维码解码器

由于二维码是储存在陌陌的核心模块WeChatWin中的,所以我们在堆栈中找到所有的WeChatWin中的函数

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

由于我早已找过一遍了,所以直接告诉大家是这一个。特点是有一个ecx传参。

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

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

此时观察ecx表针的内容,显著是一个结构体,结构体的第一个是地址,第二个似乎是大小。之后在这个地址上数据窗口追随

上面是PNG文件的二补码数据,这个就是我们要找的陌陌二维码的基址

验证二维码基址

打开PCHunter,选择陌陌进程,查看->查看进程显存,输入地址和大小,之后将显存dump出来

二维码解码器工具_二维码解码器在线解码_二维码解码器

打开图片

如今早已确定就是我们须要的二维码。之后我们将这个call的地址除以模块基址,记录下偏斜。待会须要HOOK这个call

找寻陌陌二维码内容的基址陌陌二维码的储存内容

二维码虽然是一种开放性的信息储存器,它将固定的信息储存在自己的黑白方块之间。大部份的二维码都有一个特征,就是上面储存的虽然是一段文本。我们可以借助这个文本来找寻突破口

将陌陌的二维码截图保存,之后用在线的二维码解码器解析陌陌的二维码

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

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

假如直接搜索这段网址是找不到任何结果的,缘由是由于陌陌在保存这段位置的时侯,实际上是将它分为了两部份储存

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

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

另外,陌陌的二维码会定时刷新,刷新的时侯会改变第二部份的内容。假如你搜不到的话可能是由于之前的文本早已失效了。从解析文本到搜索文本最好在一分钟之内完成

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

二维码解码器在线解码_二维码解码器_二维码解码器工具

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

之后用OD附加陌陌,在找到的地址上下显存写入断点

等待二维码手动刷新,二维码刷新时会往原先储存二维码的地址写入新的二维码数据,程序都会断下

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

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

验证基址

重新打开陌陌,用CE载入

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

二维码解码器工具_二维码解码器_二维码解码器在线解码

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

订制陌陌登陆二维码的可能性

这么我们领到这个二维码的内容有哪些作用呢?我们可以将这个获取到的二维码内容调用二维码生成器的API插口进行再度编码,之后生成一个愈发漂亮好看专属二维码,疗效如图:

使用hook截取二维码

接着我们编撰一个dll,将这个dll注入到陌陌进程中,借助IATHook截取陌陌的二维码。部份关键代码如下:

开启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);
}

最终疗效

最终疗效如图:

最后附上工程和成品DLL