TikTok IM協(xié)議逆向?qū)崙?zhàn):解密WSS通信與模擬商品卡片發(fā)送
1. 項(xiàng)目概述從一次“發(fā)送失敗”開(kāi)始的逆向之旅如果你也嘗試過(guò)在TikTok上通過(guò)私信發(fā)送一個(gè)商品鏈接卻發(fā)現(xiàn)對(duì)方收到的只是一個(gè)無(wú)法點(diǎn)擊的純文本或者你好奇那些帶貨主播是如何在聊天中瞬間彈出精美的商品卡片那么你大概能理解我最初的好奇心。這背后是TikTok IM即時(shí)通訊協(xié)議在起作用更具體地說(shuō)是WebSocket Secure連接上流動(dòng)的、經(jīng)過(guò)層層加密的消息。作為一個(gè)對(duì)網(wǎng)絡(luò)協(xié)議和客戶端逆向有濃厚興趣的開(kāi)發(fā)者我決定親手揭開(kāi)這層神秘的面紗目標(biāo)很明確逆向分析TikTok IM的WSS通信理解其消息加密機(jī)制并最終實(shí)現(xiàn)模擬發(fā)送一個(gè)完整的、可交互的商品卡片消息。這個(gè)過(guò)程不僅是對(duì)一個(gè)流行應(yīng)用協(xié)議的探索更是一次完整的網(wǎng)絡(luò)協(xié)議逆向、密碼學(xué)應(yīng)用和客戶端行為模擬的實(shí)戰(zhàn)演練。無(wú)論你是安全研究員、爬蟲(chóng)工程師還是單純對(duì)移動(dòng)應(yīng)用底層通信機(jī)制著迷的極客這篇手把手的記錄都能為你提供一條清晰的路徑和一堆實(shí)實(shí)在在的“坑位”提示。2. 核心思路與技術(shù)棧選型逆向一個(gè)像TikTok這樣擁有龐大工程師團(tuán)隊(duì)和成熟風(fēng)控體系的應(yīng)用協(xié)議不能靠蠻力。我的核心思路是“由外而內(nèi)動(dòng)靜結(jié)合”。首先我們需要一個(gè)能夠攔截和查看所有網(wǎng)絡(luò)請(qǐng)求的工具這是我們的“眼睛”。其次由于核心邏輯往往封裝在客戶端內(nèi)部我們需要能夠動(dòng)態(tài)調(diào)試或靜態(tài)分析客戶端代碼的能力這是我們的“手術(shù)刀”。基于這個(gè)思路我選擇了以下技術(shù)棧組合并解釋為什么這么選。2.1 抓包與協(xié)議分析工具Fiddler Everywhere 自簽名證書(shū)為什么是Fiddler Everywhere而不是Charles或Wireshark對(duì)于HTTPS/WSS流量解密三者原理類(lèi)似都需要在設(shè)備上安裝根證書(shū)。Fiddler Everywhere的界面更現(xiàn)代對(duì)WebSocket消息的展示和過(guò)濾非常直觀而且跨平臺(tái)支持好。Wireshark更底層能抓到所有網(wǎng)卡流量但對(duì)于需要解密HTTPS的移動(dòng)端場(chǎng)景配置略繁瑣。Charles是經(jīng)典選擇但Fiddler Everywhere的個(gè)人免費(fèi)版功能已經(jīng)足夠強(qiáng)大。注意在Android高版本特別是Android 7上系統(tǒng)不再信任用戶安裝的證書(shū)除非將證書(shū)安裝到系統(tǒng)證書(shū)目錄這通常需要Root權(quán)限。對(duì)于非Root設(shè)備一個(gè)可行的方案是使用VirtualXposed、太極等虛擬環(huán)境或者直接使用已經(jīng)Root的測(cè)試設(shè)備/模擬器。iOS設(shè)備同樣需要手動(dòng)信任已安裝的描述文件。這是逆向分析移動(dòng)端App的第一道也是勸退很多人的一道坎。2.2 動(dòng)態(tài)調(diào)試與代碼分析Jadx-GUI FridaJadx-GUI用于將TikTok的APK文件反編譯成可讀的Java/Kotlin代碼。它的優(yōu)勢(shì)在于圖形化界面搜索、跳轉(zhuǎn)、查看調(diào)用關(guān)系非常方便是靜態(tài)分析的起點(diǎn)。我們可以通過(guò)搜索關(guān)鍵詞如“WebSocket”、“wss”、“encrypt”、“商品”、“commerce”、“card”等來(lái)定位相關(guān)代碼模塊。Frida這是本次逆向的“神器”。它是一個(gè)動(dòng)態(tài)插樁框架可以在應(yīng)用程序運(yùn)行時(shí)注入JavaScript代碼來(lái)Hook鉤子任何函數(shù)監(jiān)控參數(shù)、返回值甚至修改邏輯。當(dāng)靜態(tài)分析遇到混淆TikTok肯定有重度混淆導(dǎo)致代碼難以閱讀時(shí)Frida可以讓我們?cè)谶\(yùn)行時(shí)觀察真實(shí)的數(shù)據(jù)流驗(yàn)證我們的猜測(cè)。例如我們可以Hook消息發(fā)送前的加密函數(shù)直接打印出加密前的明文和加密后的密文。2.3 協(xié)議模擬實(shí)現(xiàn)Python websockets庫(kù)一旦我們分析清楚了消息格式和加密算法就需要用代碼來(lái)模擬客戶端行為進(jìn)行驗(yàn)證和發(fā)送。Python因其豐富的庫(kù)和簡(jiǎn)潔的語(yǔ)法成為首選。websockets庫(kù)提供了異步的WebSocket客戶端實(shí)現(xiàn)非常適合用于和服務(wù)器進(jìn)行長(zhǎng)連接通信。此外我們可能還需要protobuf如果TikTok使用Protocol Buffers序列化、cryptography用于實(shí)現(xiàn)加密算法等庫(kù)。2.4 目標(biāo)設(shè)備與環(huán)境測(cè)試設(shè)備一臺(tái)已經(jīng)Root的Android手機(jī)或性能足夠的Android模擬器如雷電模擬器、夜神模擬器。Root是為了方便安裝系統(tǒng)級(jí)證書(shū)和進(jìn)行更深度的Hook。TikTok版本選擇一個(gè)相對(duì)較舊但功能穩(wěn)定的版本例如v28.x左右。新版本可能增加了更強(qiáng)的防護(hù)或修改了協(xié)議增加逆向難度??梢詮牡谌紸PK下載站獲取歷史版本。網(wǎng)絡(luò)環(huán)境確保測(cè)試設(shè)備可以正常訪問(wèn)TikTok服務(wù)。這需要自行解決網(wǎng)絡(luò)連通性問(wèn)題但請(qǐng)注意我們的所有操作僅限于協(xié)議研究和學(xué)習(xí)必須在法律和TikTok用戶協(xié)議允許的范圍內(nèi)進(jìn)行。3. 逆向分析實(shí)戰(zhàn)定位、抓包與解密理論準(zhǔn)備就緒現(xiàn)在讓我們戴上手套拿起手術(shù)刀開(kāi)始實(shí)操。3.1 第一步建立抓包環(huán)境配置Fiddler Everywhere啟動(dòng)Fiddler Everywhere在設(shè)置中開(kāi)啟HTTPS解密功能。它會(huì)生成一個(gè)根證書(shū)。安裝證書(shū)到測(cè)試設(shè)備確保手機(jī)和電腦在同一局域網(wǎng)。在手機(jī)Wi-Fi設(shè)置中配置代理為手動(dòng)主機(jī)填電腦的IP地址端口填Fiddler的監(jiān)聽(tīng)端口默認(rèn)8888。用手機(jī)瀏覽器訪問(wèn)http://電腦IP:8888下載并安裝Fiddler的根證書(shū)。對(duì)于Root設(shè)備使用adb shell和mount命令將系統(tǒng)分區(qū)掛載為可寫(xiě)然后將證書(shū)文件通常需要從PEM格式轉(zhuǎn)換為DER格式并重命名推送到/system/etc/security/cacerts/目錄并修改權(quán)限為644。重啟后證書(shū)即被系統(tǒng)信任。驗(yàn)證抓包在手機(jī)上打開(kāi)任意一個(gè)使用HTTPS的App如瀏覽器在Fiddler中應(yīng)該能看到解密的HTTPS流量。如果看到的是Tunnel to ... 443說(shuō)明證書(shū)未成功被系統(tǒng)信任。3.2 第二步捕獲TikTok IM的WSS連接在配置好代理并信任證書(shū)的手機(jī)上打開(kāi)TikTok。進(jìn)行會(huì)觸發(fā)IM通信的操作打開(kāi)私信對(duì)話框發(fā)送一條普通文本消息?;氐紽iddler Everywhere你應(yīng)該能看到大量的tiktokv.com或tiktokcdn.com等域名的請(qǐng)求。我們需要從中找到WebSocket連接。在Fiddler的會(huì)話列表里查找Protocol列為HTTP/1.1 101 Switching Protocols的請(qǐng)求。這通常就是WebSocket的升級(jí)請(qǐng)求。查看其完整URL可能會(huì)是類(lèi)似于wss://webcast3-ws-web-*.tiktokv.com/...這樣的格式。這就是IM的WSS連接。選中這個(gè)WebSocket會(huì)話在右側(cè)的Inspectors選項(xiàng)卡中選擇WebSocket視圖。在這里你可以實(shí)時(shí)看到客戶端和服務(wù)器之間來(lái)回發(fā)送的消息幀。不過(guò)此時(shí)你看到的Payload很可能是亂碼或二進(jìn)制數(shù)據(jù)——因?yàn)樗鼈儽患用芰恕?.3 第三步靜態(tài)分析定位加密邏輯現(xiàn)在我們知道WSS連接在哪但消息是加密的。下一步是找出加密發(fā)生在代碼的哪個(gè)位置。使用Jadx-GUI打開(kāi)TikTok APK。這個(gè)過(guò)程可能需要幾分鐘因?yàn)锳PK很大且混淆嚴(yán)重。關(guān)鍵詞搜索搜索連接相關(guān)WebSocket,wss://,okhttp3.WebSocketListenerTikTok很可能使用OkHttp作為網(wǎng)絡(luò)庫(kù)。搜索消息發(fā)送sendMessage,encode,encrypt??梢試L試搜索“消息”、“發(fā)送”的中文拼音或常見(jiàn)翻譯如xiaoxi,fasong,message,send。搜索商品相關(guān)commerce,product,goods,card,商品,卡片。這有助于我們定位到生成商品卡片消息體的具體代碼。分析調(diào)用鏈路通過(guò)搜索你可能會(huì)找到幾個(gè)候選的類(lèi)和方法。例如一個(gè)名為com.bytedance.ies.im.core.service.a類(lèi)名是混淆后的的類(lèi)其中有一個(gè)sendMessage方法。點(diǎn)進(jìn)去查看它的代碼邏輯。通常發(fā)送流程會(huì)是構(gòu)造消息體 - 序列化可能是JSON或Protobuf- 加密 - 通過(guò)WebSocket發(fā)送。尋找加密函數(shù)在sendMessage方法內(nèi)部或它調(diào)用的方法里尋找諸如Cipher.getInstance,AES/ECB/PKCS5Padding,encrypt,encode等調(diào)用。注意查看方法的參數(shù)和返回值。你可能會(huì)發(fā)現(xiàn)類(lèi)似byte[] encryptData(byte[] plainText, byte[] key)這樣的方法簽名。實(shí)操心得面對(duì)重度混淆類(lèi)名和方法名可能毫無(wú)意義如a.a.b.c()。此時(shí)不要糾結(jié)于名字而要關(guān)注代碼“結(jié)構(gòu)”和“常量”。例如查找硬編碼的字符串常量Jadx可以搜索字符串如算法名稱AES、模式ECB、填充PKCS5Padding或者查找特定的數(shù)字常量如密鑰長(zhǎng)度16、24、32對(duì)應(yīng)AES-128/192/256。這些是破解混淆的錨點(diǎn)。3.4 第四步動(dòng)態(tài)Hook驗(yàn)證與密鑰提取靜態(tài)分析給出了可疑的加密函數(shù)位置但密鑰從哪里來(lái)加密模式是否正確需要用Frida在運(yùn)行時(shí)驗(yàn)證。編寫(xiě)Frida腳本假設(shè)我們通過(guò)靜態(tài)分析懷疑com.bytedance.ies.im.core.utils.Encryptor.encryptAES是加密函數(shù)。// hook_im.js Java.perform(function() { var Encryptor Java.use(com.bytedance.ies.im.core.utils.Encryptor); // Hook encryptAES方法假設(shè)它接收兩個(gè)參數(shù)明文byte數(shù)組和密鑰byte數(shù)組 Encryptor.encryptAES.implementation function(plainData, key) { console.log(\n[] EncryptAES Called!); // 打印明文可能是Hex或Base64 console.log(Plaintext (hex): bytesToHex(plainData)); console.log(Plaintext (str): Java.use(java.lang.String).$new(plainData)); // 打印密鑰 console.log(Key (hex): bytesToHex(key)); // 調(diào)用原方法獲取加密結(jié)果 var result this.encryptAES(plainData, key); console.log(Ciphertext (hex): bytesToHex(result)); // 同時(shí)我們可以嘗試在Fiddler中抓取同一時(shí)刻發(fā)送的WSS幀對(duì)比這個(gè)Ciphertext是否一致 console.log(---); return result; }; // 輔助函數(shù)將byte數(shù)組轉(zhuǎn)為Hex字符串 function bytesToHex(bytes) { if (!bytes) return null; var hex []; for (var i 0; i bytes.length; i) { hex.push((bytes[i] 0xFF).toString(16).padStart(2, 0)); } return hex.join(); } });注入并觸發(fā)在電腦上啟動(dòng)Frida Server需推送到手機(jī)并運(yùn)行。使用命令frida -U -l hook_im.js -f com.zhiliaoapp.musically包名附加到TikTok進(jìn)程。在手機(jī)上再次發(fā)送一條消息。此時(shí)你的終端應(yīng)該會(huì)打印出Hook到的加密信息。關(guān)聯(lián)抓包數(shù)據(jù)在Frida腳本運(yùn)行的同時(shí)確保Fiddler正在抓包。當(dāng)腳本打印出一次加密調(diào)用時(shí)立刻去Fiddler的WebSocket視圖里找到最新的一條客戶端發(fā)送的消息幀。對(duì)比Frida打印出的Ciphertext (hex)和Fiddler中消息幀的Payload可能需要將Payload從Base64或原始字節(jié)轉(zhuǎn)換為Hex進(jìn)行比較。如果兩者匹配恭喜你你已經(jīng)精準(zhǔn)定位了加密函數(shù)和密鑰注意事項(xiàng)密鑰可能不是硬編碼的而是從服務(wù)器下發(fā)的或者在登錄時(shí)協(xié)商的。你的Hook腳本可能第一次捕獲到的密鑰就是正確的。但也可能需要Hook密鑰的生成或獲取函數(shù)。此外加密可能不止一層可能有先壓縮再加密或者對(duì)消息頭、消息體分別加密的情況。需要耐心地層層剝離。4. 消息結(jié)構(gòu)拆解與商品卡片模擬找到了加密方法我們就可以嘗試解密一條正常的消息看看它的結(jié)構(gòu)。4.1 解密與解析消息格式錄制一條樣本消息在Fiddler中找到一條你發(fā)送普通文本時(shí)對(duì)應(yīng)的客戶端WebSocket發(fā)送幀復(fù)制其Payload可能是Base64編碼的。編寫(xiě)解密腳本根據(jù)Hook到的算法例如AES-ECB-PKCS5Padding和密鑰用Python的cryptography庫(kù)編寫(xiě)解密函數(shù)。from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import base64 def decrypt_aes_ecb(ciphertext_b64, key_hex): key bytes.fromhex(key_hex) cipher Cipher(algorithms.AES(key), modes.ECB(), backenddefault_backend()) decryptor cipher.decryptor() ciphertext base64.b64decode(ciphertext_b64) # 注意ECB模式不需要IV plaintext_padded decryptor.update(ciphertext) decryptor.finalize() # 去除PKCS5/PKCS7填充 padding_len plaintext_padded[-1] plaintext plaintext_padded[:-padding_len] return plaintext # 使用Hook捕獲的密鑰和抓包的Payload key 你的16/24/32字節(jié)Hex密鑰 payload_b64 從Fiddler復(fù)制的Base64 decrypted decrypt_aes_ecb(payload_b64, key) print(decrypted.decode(utf-8, errorsignore))分析明文結(jié)構(gòu)解密后的數(shù)據(jù)很可能是一種序列化格式。常見(jiàn)的有JSON最易讀直接json.loads()即可。Protocol Buffers (Protobuf)二進(jìn)制格式需要.proto定義文件才能正確解析。如果沒(méi)有定義文件解析起來(lái)非常困難但可以通過(guò)分析代碼中com.google.protobuf相關(guān)的使用來(lái)尋找線索或者使用protobuf-inspector這類(lèi)工具進(jìn)行盲解析。Thrift或自定義二進(jìn)制格式可能性較小但存在。 如果是JSON你就能清晰地看到消息結(jié)構(gòu)例如包含message_type、content、sender、timestamp等字段。content字段里可能就包含了文本或卡片信息。4.2 構(gòu)造商品卡片消息這是本次逆向的終極目標(biāo)。我們需要模仿客戶端構(gòu)造一個(gè)能生成商品卡片的消息體。定位卡片生成代碼回到Jadx利用之前找到的與“商品”、“卡片”相關(guān)的類(lèi)。搜索product_card,commerce_card,generateCard等方法。找到負(fù)責(zé)構(gòu)建卡片消息體的類(lèi)和方法。注意觀察它需要哪些參數(shù)商品ID (product_id)、商品標(biāo)題、圖片URL、價(jià)格、跳轉(zhuǎn)鏈接等等。Hook卡片構(gòu)建方法使用Frida Hook你找到的卡片構(gòu)建方法。在真實(shí)的TikTok App中分享一個(gè)商品到私信觸發(fā)這個(gè)Hook。打印出該方法構(gòu)建出的完整消息對(duì)象或其中的關(guān)鍵字段。這是獲取正確消息結(jié)構(gòu)的最直接方法。組裝完整消息根據(jù)Hook得到的數(shù)據(jù)結(jié)構(gòu)用Python字典如果最終是JSON或Protobuf對(duì)象如果使用Protobuf來(lái)組裝一個(gè)一模一樣的消息體。消息體中message_type字段很可能是一個(gè)特定的枚舉值比如2代表富媒體消息content字段內(nèi)再嵌套具體的卡片類(lèi)型和數(shù)據(jù)。序列化與加密將組裝好的消息體按照分析出的格式JSON字符串或Protobuf序列化轉(zhuǎn)換成字節(jié)流。然后調(diào)用我們逆向出來(lái)的加密函數(shù)用Python復(fù)現(xiàn)對(duì)字節(jié)流進(jìn)行加密。建立WSS連接并發(fā)送import asyncio import websockets import json async def send_product_card(): # 1. 建立WSS連接需要從抓包中獲取準(zhǔn)確的WSS URL和必要的Headers如鑒權(quán)Token uri wss://webcast3-ws-web-*.tiktokv.com/... headers { User-Agent: ..., Authorization: Bearer ..., # 關(guān)鍵需要有效的登錄態(tài)Token } async with websockets.connect(uri, extra_headersheaders) as websocket: # 2. 構(gòu)造商品卡片消息明文 card_message { type: 2, # 假設(shè)2是卡片消息類(lèi)型 seq_id: 123456, content: { card_type: product, product_id: 123456789, title: 測(cè)試商品, image_url: https://..., price: 99.99, jump_url: https://www.tiktok.com/product/... } } plaintext json.dumps(card_message).encode(utf-8) # 3. 加密 ciphertext encrypt_aes_ecb(plaintext, key) # 使用之前復(fù)現(xiàn)的加密函數(shù) # 4. 發(fā)送可能需要Base64編碼 await websocket.send(base64.b64encode(ciphertext).decode()) print(商品卡片消息已發(fā)送) asyncio.run(send_product_card())核心難點(diǎn)與避坑鑒權(quán)TokenWSS連接建立時(shí)往往需要攜帶用戶登錄憑證Token。這個(gè)Token通常存在于App的本地存儲(chǔ)或內(nèi)存中??梢酝ㄟ^(guò)Frida Hook登錄后的Token存儲(chǔ)函數(shù)來(lái)獲取。沒(méi)有有效的Token服務(wù)器會(huì)拒絕連接或發(fā)送消息。消息序列號(hào)seq_idIM協(xié)議通常要求消息有嚴(yán)格遞增的序列號(hào)用于保證消息順序和去重。你需要從客戶端代碼或服務(wù)器響應(yīng)中維護(hù)一個(gè)正確的序列號(hào)。心跳?;頦SS連接需要定期發(fā)送心跳包Ping/Pong或特定指令來(lái)保持連接。你需要從抓包中分析出心跳包的格式和間隔并在你的Python客戶端中模擬。風(fēng)控策略TikTok有完善的風(fēng)控。短時(shí)間內(nèi)發(fā)送大量消息、消息內(nèi)容異常、從未知IP建立連接等行為都可能導(dǎo)致連接被斷開(kāi)或賬號(hào)受限。模擬行為應(yīng)盡量貼近真實(shí)用戶間隔時(shí)間隨機(jī)化。5. 常見(jiàn)問(wèn)題排查與經(jīng)驗(yàn)總結(jié)在整個(gè)逆向和模擬過(guò)程中我遇到了無(wú)數(shù)問(wèn)題以下是幾個(gè)最具代表性的排查思路問(wèn)題1Fiddler抓不到TikTok的HTTPS/WSS流量。排查首先確認(rèn)手機(jī)代理設(shè)置正確且電腦防火墻允許Fiddler端口連接。然后檢查T(mén)ikTok是否使用了證書(shū)綁定SSL Pinning。證書(shū)綁定會(huì)驗(yàn)證服務(wù)器證書(shū)是否與App內(nèi)硬編碼的證書(shū)匹配繞過(guò)系統(tǒng)證書(shū)導(dǎo)致Fiddler解密失敗。解決使用Frida腳本來(lái)禁用SSL Pinning。網(wǎng)上有通用的禁用腳本也可以針對(duì)TikTok使用的網(wǎng)絡(luò)庫(kù)如OkHttp3進(jìn)行Hook。例如HookOkHttpClient.Builder的sslSocketFactory和hostnameVerifier方法將其替換為信任所有證書(shū)的實(shí)現(xiàn)。問(wèn)題2Hook加密函數(shù)時(shí)打印出的明文是亂碼或看起來(lái)不像消息內(nèi)容。排查可能Hook錯(cuò)了函數(shù)或者消息在加密前經(jīng)過(guò)了壓縮如GZIP或另一種編碼如Protobuf。解決向上追溯調(diào)用棧。在Frida腳本中可以使用Java.use(android.util.Log).e(TAG, 調(diào)用棧: Java.use(android.util.Log).getStackTraceString(Java.use(java.lang.Throwable).$new()))來(lái)打印堆??纯词钦l(shuí)調(diào)用了這個(gè)加密函數(shù)。從而找到更早的、處理原始消息體的函數(shù)進(jìn)行Hook。問(wèn)題3模擬發(fā)送的消息服務(wù)器不響應(yīng)或返回錯(cuò)誤。排查這是一個(gè)綜合問(wèn)題。需要逐一檢查WSS連接URL和Headers是否完全正確特別是Host、Origin、User-Agent和鑒權(quán)Header。消息格式加密前的明文結(jié)構(gòu)是否完全正確字段名、類(lèi)型、嵌套關(guān)系是否與抓包解密后的一致可以使用json.dumps(..., indent2)美化打印后仔細(xì)對(duì)比。加密算法和密鑰是否100%還原包括算法、模式、填充、初始向量如果有??梢杂肏ook到的明文和密鑰用你的Python加密函數(shù)加密看結(jié)果是否與Hook到的密文一致。序列號(hào)和時(shí)序seq_id是否連續(xù)且大于上一次的值消息發(fā)送的節(jié)奏是否過(guò)快解決采用“最小化驗(yàn)證”策略。先不發(fā)送復(fù)雜的商品卡片而是嘗試發(fā)送最簡(jiǎn)單的文本消息hello。如果文本消息能成功發(fā)送并被對(duì)方接收說(shuō)明連接、基礎(chǔ)消息格式、加密都沒(méi)問(wèn)題問(wèn)題就出在商品卡片消息體的具體構(gòu)造上。問(wèn)題4賬號(hào)因模擬行為被限制功能。經(jīng)驗(yàn)這是進(jìn)行此類(lèi)逆向模擬的最大風(fēng)險(xiǎn)。務(wù)必使用測(cè)試專(zhuān)用的小號(hào)切勿使用主力賬號(hào)。模擬的行為應(yīng)盡可能“人性化”連接后等待一會(huì)兒再發(fā)消息消息間隔加入隨機(jī)延遲如3-10秒消息內(nèi)容不要完全一致。即便如此也不能保證100%安全要有賬號(hào)被暫時(shí)限制的心理準(zhǔn)備和備用方案。這次對(duì)TikTok IM協(xié)議的逆向之旅更像是一次系統(tǒng)的工程訓(xùn)練。它不僅僅關(guān)乎一個(gè)加密算法或一個(gè)API端點(diǎn)而是涵蓋了環(huán)境搭建、流量分析、靜態(tài)逆向、動(dòng)態(tài)調(diào)試、協(xié)議模擬和風(fēng)控對(duì)抗等多個(gè)環(huán)節(jié)。每一個(gè)環(huán)節(jié)都可能遇到意想不到的困難需要耐心、細(xì)致的觀察和邏輯推理。最終成功發(fā)送出商品卡片的那一刻所有的折騰都變得值得。更重要的是這套方法論可以遷移到對(duì)其他移動(dòng)應(yīng)用協(xié)議的分析中。記住逆向工程的樂(lè)趣在于探索和理解請(qǐng)務(wù)必在法律和道德框架內(nèi)進(jìn)行尊重知識(shí)產(chǎn)權(quán)和用戶隱私。

相關(guān)新聞

從零構(gòu)建股票大數(shù)據(jù)分析系統(tǒng):架構(gòu)、可視化與預(yù)測(cè)模型實(shí)戰(zhàn)

從零構(gòu)建股票大數(shù)據(jù)分析系統(tǒng):架構(gòu)、可視化與預(yù)測(cè)模型實(shí)戰(zhàn)

1. 從數(shù)據(jù)到?jīng)Q策:一個(gè)股票分析系統(tǒng)的誕生幾年前,我還在一個(gè)量化研究團(tuán)隊(duì)里打雜,每天面對(duì)的就是海量的股票行情數(shù)據(jù)、財(cái)務(wù)報(bào)告和新聞?shì)浨?。團(tuán)隊(duì)里的研究員們經(jīng)常需要同時(shí)打開(kāi)好幾個(gè)軟件:一個(gè)看K線圖,一個(gè)跑回測(cè)模型&…

2026/7/29 7:06:07 閱讀更多
AI代碼生成提示詞優(yōu)化實(shí)戰(zhàn)與技巧

AI代碼生成提示詞優(yōu)化實(shí)戰(zhàn)與技巧

1. AI代碼生成與優(yōu)化提示詞的核心價(jià)值在編程領(lǐng)域,AI代碼生成工具正在改變開(kāi)發(fā)者的工作方式。但很多人發(fā)現(xiàn)直接使用原始提示詞生成的代碼質(zhì)量參差不齊,這時(shí)候就需要專(zhuān)門(mén)的優(yōu)化提示詞技術(shù)。好的提示詞能幫助AI更準(zhǔn)確地理解需求,生成更符合預(yù)期的…

2026/7/29 7:06:07 閱讀更多
WindowsPC本地部署大語(yǔ)言模型實(shí)戰(zhàn)指南

WindowsPC本地部署大語(yǔ)言模型實(shí)戰(zhàn)指南

1. 本地大模型WindowsPC測(cè)試概述在個(gè)人PC上部署和測(cè)試大語(yǔ)言模型正成為技術(shù)愛(ài)好者和開(kāi)發(fā)者的新趨勢(shì)。不同于云端API調(diào)用,本地部署能完全掌控?cái)?shù)據(jù)流、避免隱私泄露風(fēng)險(xiǎn),還能根據(jù)硬件條件靈活調(diào)整模型參數(shù)。我的ThinkPad P15v移動(dòng)工作站搭載NVIDIA RTX A20…

2026/7/29 7:06:07 閱讀更多
FPGA實(shí)戰(zhàn)(58):10G Ethernet XGMII PHY層 接口設(shè)計(jì)與仿真驗(yàn)證

FPGA實(shí)戰(zhàn)(58):10G Ethernet XGMII PHY層 接口設(shè)計(jì)與仿真驗(yàn)證

引言 隨著數(shù)據(jù)中心與高速互聯(lián)場(chǎng)景對(duì)帶寬需求的持續(xù)增長(zhǎng),10 Gigabit Ethernet(10GbE)已成為各類(lèi) FPGA 平臺(tái)的標(biāo)準(zhǔn)高速接口方案。IEEE 802.3ae 定義的 10GBASE-R 物理層采用 64B/66B 編碼,通過(guò) XGMII(10 Gigabit Media Independent Interface)總線與 MAC 層交互——數(shù)據(jù)通…

2026/7/29 9:06:11 閱讀更多
AI如何提升學(xué)術(shù)寫(xiě)作效率與質(zhì)量

AI如何提升學(xué)術(shù)寫(xiě)作效率與質(zhì)量

1. 當(dāng)AI遇上學(xué)術(shù)寫(xiě)作:一場(chǎng)生產(chǎn)力革命的開(kāi)端 十年前我完成第一部學(xué)術(shù)專(zhuān)著時(shí),整整耗費(fèi)了兩年半的周末和假期。如今看著團(tuán)隊(duì)里的年輕學(xué)者用AI工具三個(gè)月就能完成同等質(zhì)量的初稿,這種代際差異讓我深刻意識(shí)到:學(xué)術(shù)寫(xiě)作正在經(jīng)歷古騰堡印…

2026/7/29 9:06:11 閱讀更多
Altium Designer原理圖連接線全解析:從Wire到Port的規(guī)范應(yīng)用與避坑指南

Altium Designer原理圖連接線全解析:從Wire到Port的規(guī)范應(yīng)用與避坑指南

1. 項(xiàng)目概述:原理圖連接線,遠(yuǎn)不止“畫(huà)線”那么簡(jiǎn)單干了這么多年硬件設(shè)計(jì),畫(huà)過(guò)的原理圖少說(shuō)也有幾百?gòu)埩恕P率止こ處熥钊菀撞鹊目?amp;#xff0c;往往就藏在最基礎(chǔ)的地方——比如,怎么把元器件“連”起來(lái)。很多人剛接觸Altium Design…

2026/7/29 9:06:11 閱讀更多
STM32 CAN通信從入門(mén)到實(shí)戰(zhàn):核心原理、配置與雙節(jié)點(diǎn)通信調(diào)試

STM32 CAN通信從入門(mén)到實(shí)戰(zhàn):核心原理、配置與雙節(jié)點(diǎn)通信調(diào)試

1. 項(xiàng)目概述:從零開(kāi)始理解CAN通信最近在整理嵌入式項(xiàng)目資料,發(fā)現(xiàn)很多朋友對(duì)CAN通信這塊又愛(ài)又怕。愛(ài)的是它在汽車(chē)電子、工業(yè)控制等領(lǐng)域無(wú)處不在,是工程師的必備技能;怕的是它協(xié)議??雌饋?lái)復(fù)雜,各種幀格式、仲裁機(jī)制、錯(cuò)…

2026/7/29 9:06:11 閱讀更多
iOS持續(xù)集成中證書(shū)管理的最佳實(shí)踐與解決方案

iOS持續(xù)集成中證書(shū)管理的最佳實(shí)踐與解決方案

1. iOS持續(xù)集成中的證書(shū)管理痛點(diǎn)在iOS應(yīng)用的CI/CD流程中,證書(shū)和配置文件的管理一直是開(kāi)發(fā)者最頭疼的問(wèn)題之一。不同于Android開(kāi)發(fā)可以直接使用調(diào)試密鑰,蘋(píng)果的生態(tài)要求每個(gè)應(yīng)用都必須使用有效的證書(shū)簽名才能安裝到設(shè)備上。這就導(dǎo)致在Jenkins自動(dòng)化構(gòu)建時(shí)…

2026/7/29 9:06:11 閱讀更多
LARA-R6401與PIC18LF45K42的低功耗物聯(lián)網(wǎng)設(shè)計(jì)實(shí)踐

LARA-R6401與PIC18LF45K42的低功耗物聯(lián)網(wǎng)設(shè)計(jì)實(shí)踐

1. LARA-R6401與PIC18LF45K42的硬件協(xié)同設(shè)計(jì)在物聯(lián)網(wǎng)邊緣計(jì)算領(lǐng)域,LARA-R6401 LTE Cat 1模塊與PIC18LF45K42微控制器的組合正在開(kāi)創(chuàng)低功耗廣域連接的新范式。這個(gè)組合最吸引人的特點(diǎn)是:LARA-R6401提供了僅24x26mm的緊湊封裝中集成了全球多頻段LTE連接能力…

2026/7/29 8:56:11 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果?!?/p>

2026/7/29 0:15:24 閱讀更多