簽)
x64dbg labellist 命令詳解在 Reference View 中列出并遍歷用戶自定義標(biāo)簽【免費(fèi)下載鏈接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.項(xiàng)目地址: https://gitcode.com/gh_mirrors/x6/x64dbglabellist是 x64dbg 用戶數(shù)據(jù)庫(kù)user database命令族中的核心查詢命令用于把當(dāng)前調(diào)試會(huì)話中全部用戶自定義標(biāo)簽label以表格形式填充到 Reference View引用視圖并返回標(biāo)簽總數(shù)。本文以 labellist 官方文檔 為骨架結(jié)合 cmd-user-database.cpp 與 label.cpp 的源碼實(shí)現(xiàn)完整講解命令的語法、結(jié)果語義、Reference View 列結(jié)構(gòu)以及如何借助ref.addr()等表達(dá)式函數(shù)在腳本中遍歷標(biāo)簽列表實(shí)現(xiàn)批量定位、批量刪除等實(shí)戰(zhàn)操作。命令概述與適用場(chǎng)景l(fā)abellist是 x64dbg 用戶數(shù)據(jù)庫(kù)四大操作設(shè)置labelset、刪除labeldel、列表labellist、清空labelclear中的查詢環(huán)節(jié)見 user-database 命令索引。標(biāo)簽本身是用戶在任意地址上命名的助記文本可通過 labelset 設(shè)置并支持 String Formatting常用于標(biāo)注關(guān)鍵函數(shù)、數(shù)據(jù)塊或可疑調(diào)用點(diǎn)。典型使用場(chǎng)景包括逆向分析過程中集中查看當(dāng)前已標(biāo)注的所有地址快速核對(duì)命名是否完整在腳本中遍歷所有標(biāo)簽批量生成日志、批量跳轉(zhuǎn)或批量刪除將標(biāo)簽列表導(dǎo)出到 Reference View 后借助視圖自帶的Delete右鍵/菜單命令直接刪除某一行對(duì)應(yīng)的標(biāo)簽。labellist命令不帶任何參數(shù)其行為由源碼cbInstrLabelListcmd-user-database.cpp完全確定。語法與參數(shù)labellist的語法極其簡(jiǎn)單沒有任何可選或必選參數(shù)labellist這也是 labellist.md 中 This command has no arguments. 的含義命令解析器不會(huì)讀取argv[1]之后的任何內(nèi)容因此直接執(zhí)行即可。作為對(duì)比同族的labelset需要兩個(gè)參數(shù)地址 標(biāo)簽文本labeldel需要一個(gè)參數(shù)地址而labellist與labelclear一樣屬于無參命令。執(zhí)行結(jié)果與 Reference View 填充結(jié)果變量$result命令執(zhí)行后$result變量會(huì)被設(shè)置為當(dāng)前用戶自定義標(biāo)簽的數(shù)量即填充進(jìn) Reference View 的總行數(shù)這是腳本自動(dòng)化中最重要的返回值$result 標(biāo)簽總數(shù)對(duì)應(yīng)源碼位于 cmd-user-database.cppvarset($result, count, false);。腳本可通過$result判斷是否存在標(biāo)簽0 表示沒有以及決定后續(xù)遍歷次數(shù)。Reference View 的三列結(jié)構(gòu)cbInstrLabelList首先初始化 Reference View并依次添加三列cmd-user-database.cpp列列寬列頭內(nèi)容來源第 0 列2 * sizeof(duint)即一個(gè)指針寬度32 位下 8 字符、64 位下 16 字符Address標(biāo)簽所在絕對(duì)地址%p格式化第 1 列50Disassembly該地址處的反匯編文本GuiGetDisassembly第 2 列0自動(dòng)擴(kuò)展Label用戶自定義的標(biāo)簽文本每一行依次通過GuiReferenceSetRowCount/GuiReferenceSetCellContent寫入最終調(diào)用GuiReferenceReloadData()刷新視圖cmd-user-database.cpp。命令結(jié)束后控制臺(tái)輸出統(tǒng)計(jì)信息%d label(s) listed in Reference View。地址的模塊基址還原源碼中有一個(gè)容易被忽略的細(xì)節(jié)標(biāo)簽內(nèi)部以模塊哈希 模塊內(nèi)偏移的方式存儲(chǔ)因此在填充視圖前需要還原為絕對(duì)地址labels[i].addr ModBaseFromName(labels[i].mod().c_str());見 cmd-user-database.cpp。也就是說Reference View 中展示的 Address 是可直接用于跳轉(zhuǎn)、下斷點(diǎn)或計(jì)算偏移的絕對(duì)虛擬地址而不是模塊內(nèi)偏移。無標(biāo)簽時(shí)的行為如果當(dāng)前沒有用戶自定義標(biāo)簽命令不會(huì)報(bào)錯(cuò)而是輸出No labels并在 Reference View 中保持空表cmd-user-database.cpp此時(shí)$result為 0。標(biāo)簽數(shù)據(jù)的底層來源Reference View 中展示的標(biāo)簽來自LabelGetListlabel.cpp其數(shù)據(jù)包含兩部分持久化標(biāo)簽通過labels.GetList(list)從標(biāo)簽哈希表Labels基于AddrInfoHashMap取出這些標(biāo)簽保存在用戶數(shù)據(jù)庫(kù)database中可隨dbsave持久化、隨dbload恢復(fù)臨時(shí)標(biāo)簽tempLabels中的標(biāo)簽也被并入結(jié)果且manual標(biāo)記為falselabel.cpp用于表示非手動(dòng)命名如自動(dòng)/臨時(shí)標(biāo)注的標(biāo)簽。因此labellist列出的并非只有手動(dòng)labelset設(shè)置的標(biāo)簽還包括臨時(shí)標(biāo)簽這一行為與同文件的CommentListcbInstrCommentList支持1參數(shù)篩選 manual略有差異——cbInstrLabelList不提供參數(shù)始終列出全部標(biāo)簽。腳本遍歷結(jié)合 ref 表達(dá)式函數(shù)Reference View 的內(nèi)容可以在腳本中通過 ref 表達(dá)式函數(shù) 迭代ref.count()當(dāng)前 Reference View 中的條目總數(shù)ref.addr(index)返回第index條引用對(duì)應(yīng)的地址失敗返回 0。labellist官方文檔給出了一個(gè)完整的遍歷腳本它打印每條引用的序號(hào)與地址i 0 loop: addr ref.addr(i) log reference {d:i} {p:addr} i cmp i, ref.count() jne loop腳本邏輯解析i 0初始化索引進(jìn)入loop標(biāo)簽addr ref.addr(i)取出第i條引用的絕對(duì)地址log reference {d:i} {p:addr}使用 String Formatting 的{d:...}十進(jìn)制與{p:...}指針/十六進(jìn)制地址格式化輸出i后與ref.count()比較jne loop直到遍歷完畢。由于labellist執(zhí)行后$result等于標(biāo)簽數(shù)、Reference View 行數(shù)也等于標(biāo)簽數(shù)ref.count()與$result在此場(chǎng)景下等價(jià)兩者都可以作為循環(huán)上界。遍歷得到的addr是絕對(duì)地址可直接用于后續(xù)labeldel addr、bp addr等操作。與其他用戶數(shù)據(jù)庫(kù)命令的配合labellist通常與以下命令組合使用形成完整的標(biāo)簽管理閉環(huán)命令作用文檔labelset addr text/lbl/lblset在指定地址設(shè)置標(biāo)簽labelset.mdlabeldel addr/lblc/lbldel刪除指定地址的標(biāo)簽labeldel.mdlabellist列出全部標(biāo)簽到 Reference Viewlabellist.mdlabelclear清空所有模塊的全部標(biāo)簽labelclear.md此外Reference View 頂部會(huì)注冊(cè)一個(gè) Delete 命令源碼GuiReferenceAddCommand(..., labeldel $0)見 cmd-user-database.cpp即視圖內(nèi)選中某一行執(zhí)行 Delete 時(shí)實(shí)際調(diào)用labeldel 該行地址實(shí)現(xiàn)可視化逐條刪除標(biāo)簽。實(shí)戰(zhàn)示例示例 1查看標(biāo)簽總量并輸出到日志labellist log total labels: {d:$result}示例 2遍歷所有標(biāo)簽地址并跳轉(zhuǎn)檢查labellist i 0 loop: cmp i, ref.count() jae done addr ref.addr(i) disasm $result ; 跳轉(zhuǎn)到該地址查看反匯編 log checking {p:addr} i jmp loop done:示例 3批量刪除 Reference View 中的全部標(biāo)簽labellist i 0 loop: cmp i, ref.count() jae done addr ref.addr(i) labeldel addr i jmp loop done: log removed {d:$result} labels注意示例腳本中jae無符號(hào)大于等于跳轉(zhuǎn)用于保護(hù)性循環(huán)邊界避免ref.addr越界具體跳轉(zhuǎn)助記符需與 x64dbg 腳本語言的比較/跳轉(zhuǎn)語義配合使用參考 script 命令文檔。小結(jié)labellist雖然是一個(gè)零參數(shù)命令但其價(jià)值在于把散落在用戶數(shù)據(jù)庫(kù)中的標(biāo)簽統(tǒng)一匯入 Reference View并通過$result與ref.addr(i)/ref.count()打通腳本自動(dòng)化鏈路。理解其實(shí)現(xiàn)標(biāo)簽的模塊基址還原、持久化與臨時(shí)標(biāo)簽合并、視圖三列結(jié)構(gòu)有助于在大型逆向工程與惡意樣本分析任務(wù)中高效組織標(biāo)注信息配合labelset、labeldel、labelclear形成完整的標(biāo)簽生命周期管理方案?!久赓M(fèi)下載鏈接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.項(xiàng)目地址: https://gitcode.com/gh_mirrors/x6/x64dbg創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考