如何獲取微信的版本號詳解【附完整原始碼】

三水君發表於2024-01-26

前兩天群裡有人問到這個問題,我想著在網上找個教程發給他,沒想到這玩意還挺新鮮?網上基本上找不到實質性的回答...

關於這個問題,其實挺簡單的,微信的版本號其實就寫在登錄檔中,讀取它就完事了~

開啟註冊列表

找到【計算機\HKEY_CURRENT_USER\Software\Tencent\WeChat】,就看的到版本號了

他這裡的value,是一個DWORD型別:0x63090217(1661534743)
我現在的微信版本是3.9.2.23

看到這裡大家應該看出點端倪了
把最十六進位制的高位替換成0,也就是【0x03090217】
這樣就更明顯了,把中間的0替換為【.】這不就是3.9.2了嘛

但是最後的17跟23還是對應不上,那它會是什麼呢?
開啟計算器看看:十六進位制的17 不就是 十進位制的23嘛
那麼按照這種方法,前面加上個【.】就是版本號了

畫個圖比較好理解

讀到這裡,你要是想著透過切割字串的方式來提取版本號的話,那也太LOW了吧...
敲黑板!!!看下面!!!

版本號的十六進位制:0x63090217
去掉最高位:0x03090217
二進位制是:【0000 0011 0000 1001 0000 0010 0001 0111】

它的型別是DWORD,也就是4位元組,每個位元組有8位,所以每8位進行一次計算
從最高位開始:右移到低8位
看下面的分析【注意標紅的字型】

十六進位制:0x03090217
右移24位後:0000 0000 0000 0000 0000 0000 0000 0011
取低8位的十進位制:3

十六進位制:0x03090217
右移16位後:0000 0000 0000 0000 0000 0011 0000 1001
取低8位的十進位制:9

十六進位制:0x03090217
右移8位後:0000 0000 0000 0011 0000 1001 0000 0010
取低8位的十進位制:2

十六進位制:0x03090217
右移0位後:0000 0011 0000 1001 0000 0010 0001 0111
取低8位的十進位制:23

到此就完成了版本號的獲取,完整Python程式碼如下(直接複製貼上執行就完事了):

import winreg


def get_wx_version():
    """獲取微信版本號"""

    try:
        # 開啟登錄檔上下文
        with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Tencent\WeChat", 0, winreg.KEY_READ) as key:
            # 讀取版本號:10進位制
            int_version = winreg.QueryValueEx(key, "Version")[0]

            # 轉16進位制字串
            hex_version = hex(int_version)

            # 去掉0x
            hex_str = hex_version[2:]

            # 把第一個字元(最高位)替換為 0
            new_hex_str = "0" + hex_str[1:]

            # 轉回10進位制
            new_hex_num = int(new_hex_str, 16)

            # 按位還原版本號
            major = (new_hex_num >> 24) & 0xFF
            minor = (new_hex_num >> 16) & 0xFF
            patch = (new_hex_num >> 8) & 0xFF
            build = (new_hex_num >> 0) & 0xFF

            # 拼接版本號
            wx_version = "{}.{}.{}.{}".format(major, minor, patch, build)
            print(wx_version)
    except Exception as e:
        print("開啟登錄檔失敗:{}".format(e))
        return None


if __name__ == '__main__':
    get_wx_version()

補充:
有小夥伴私我:為什麼要加個【& 0xFF】,是什麼意思...
因為我要取低8位啊,與運算同真才真 0xFF=1111 1111

更多相關文章:
PC微信逆向分析之《獲取登入二維碼》
PC微信逆向分析之《重新整理登入二維碼》
PC微信逆向分析之《收發訊息》

文章轉載自:https://blog.csdn.net/weixin_44678558/article/details/135853762

相關文章