前兩天群裡有人問到這個問題,我想著在網上找個教程發給他,沒想到這玩意還挺新鮮?網上基本上找不到實質性的回答...
關於這個問題,其實挺簡單的,微信的版本號其實就寫在登錄檔中,讀取它就完事了~
開啟註冊列表
找到【計算機\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