本人也只是興趣愛好,初學者,一個菜鳥而已,主要分享下自己的學習思路和方法,也方便日后復習
這里非常感謝看雪鬼手的教程
進入正題
這是我當前使用的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 存放圖片大小