本人也只是兴趣爱好,初学者,一个菜鸟而已,主要分享下自己的学习思路和方法,也方便日后复习
这里非常感谢看雪鬼手的教程
进入正题
这是我当前使用的PC微信版本

我们先分析怎么获取二维码图片
我按照鬼手的教程 用CE通过未知初始值过滤,然后通过来回切换刷新二维码 感觉一直搜不出来 过滤到最后 剩余结果还是很多
所以我们这里换一种方法

我们从他的二维码图片格式入手,这里先说一下,微信二维码图片是png格式的,这个在鬼手教程里也有说到这点,
所以我们通过png文件格式来作为突破口,也就是分析png格式的特征
我们百度一下,做个简单的了解,我简单截取了一篇文章的部分
使用UltraEdit32打开该文件,如下:
00000000~00000007:
可以看到,选中的头8个字节即为PNG文件的标识。这是固定的
接下来的地方就是IHDR数据块了:
00000008~00000020:
- 00 00 00 0D 说明IHDR头块长为13
- 49 48 44 52 IHDR标识 固定的
- 00 00 00 08 图像的宽,8像素
- 00 00 00 08 图像的高,8像素
- 04 色深,2^4=16,即这是一个16色的图像(也有可能颜色数不超过16,当然,如果颜色数不超过8,用03表示更合适)
- 03 颜色类型,索引图像
- 00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
- 00 同上
- 00 非隔行扫描
- 36 21 A3 B8 CRC校验
我们就提取一些固定的特征 来作为突破口
比如说
他的前8个字节:89 50 4E 47 0D 0A 1A 0A
IHDR标识: 49 48 44 52 都可以
我们这里就通过字符串IHDR标识来做一个搜索 或者直接搜字节也可以 大家怎么舒服怎么来
CE搜索IHDR

有5个正确的结果 其他的好像又变了 我们可以忽略掉 大家搜的时候 可以把快速扫描去掉 不然有时候可能会出现搜不到的情况
我们先看第一个结果059D94FC
我们搜一下谁保存的这张图片的地址 我们搜的时候要把059D94FC-C 这里要-C,我们看上面结构,因为IHDR是第13个字节 我们要回到首地址 -C完就是 059D94F0 因为其他地方如果保存的话 存放的肯定是首地址, 如果大家对内存有些许了解 应该很好懂

好像搜不到东西,我们就暂时先pass掉这个 来看第二个
第二个 05BA8714 同理 我们-c 得到5BA8708

我们把这个结果放到下面 保存起来
第三个 10a49984 -c 得到10A49978

保存起来
第四个 10a4b70c -c得到 10a4b700

好像没结果 不管 pass

只剩两个结果了
我们就来验证一下 哪个是 我们用手机扫描下二维码 实现二维码的切换 他的地址就会变

我们不登录 再点击返回二维码界面 这样就实现了二维码的切换

再回来

发现第二个变了 第一个没变 可能是其他的什么图片 我们不管
反正第二个就是二维码图片 就对了
我们可以再次验证 把他从内存中 dump下来

我们来看看这个二维码的内存存放

我们在来了解一下Png格式的结尾标记 IEND数据块
00 00 00 00 49 45 4E 44 AE 42 60 82 这可以理解为结束标记 也就是说 我们拷到这里即可 多复制点也无所谓 解析的时候 会自动忽略在这之后的内容
然后我们复制16进制数据 我们把它还原成字节集 也就是 字节数组 转换图片

然后我们扫码 发现扫了之后 微信客户端 出现了确认登陆 表示我们成功啦
现在如果我们要用代码 读内存 来读取二维码图片 我们怎么知道他的大小呢? 有些同学可能会想到刚刚提到的结尾标识
但是我们再回到保存这个二维码地址的那个 地址 058C6268 这个地址存着二维码图片的地址
其实这里应该是个结构

也就是说058C6268 +4 偏移4存放图片大小
因此 058C626C 存放图片大小
网友评论