97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

南昌優(yōu)化網(wǎng)站排名邯鄲網(wǎng)站建設(shè)在哪里

鶴壁市浩天電氣有限公司 2026/01/24 10:38:05
南昌優(yōu)化網(wǎng)站排名,邯鄲網(wǎng)站建設(shè)在哪里,包頭北京網(wǎng)站建設(shè),濟(jì)南搜到網(wǎng)絡(luò)推廣公司文章目錄一、Ghidra Python腳本基礎(chǔ)1. 運(yùn)行環(huán)境與核心規(guī)則2. 核心模塊與常用類/函數(shù)二、5個(gè)實(shí)戰(zhàn)腳本案例案例1#xff1a;批量反編譯所有函數(shù)到文件案例2#xff1a;提取所有字符串并導(dǎo)出到CSV案例3#xff1a;批量重命名相似函數(shù)#xff08;基于特征#xff09;案例4批量反編譯所有函數(shù)到文件案例2提取所有字符串并導(dǎo)出到CSV案例3批量重命名相似函數(shù)基于特征案例4掃描程序中的硬編碼IP地址案例5統(tǒng)計(jì)函數(shù)調(diào)用關(guān)系并生成DOT圖三、Ghidra Python腳本開(kāi)發(fā)技巧四、總結(jié)在汽車嵌入式開(kāi)發(fā)中 常常使用Ghidra工具來(lái)對(duì)二進(jìn)制目標(biāo)代碼進(jìn)行分析。Ghidra是NSA開(kāi)源的逆向工程利器其內(nèi)置的Python腳本引擎基于Jython兼容Python 2.7極大擴(kuò)展了逆向分析的自動(dòng)化能力。無(wú)論是批量反編譯、函數(shù)特征提取還是自定義漏洞檢測(cè)Python腳本都能將重復(fù)的手工操作轉(zhuǎn)化為高效的自動(dòng)化流程。本文將從Ghidra Python腳本的基礎(chǔ)語(yǔ)法、核心API入手結(jié)合5個(gè)實(shí)戰(zhàn)腳本案例全面講解Ghidra Python腳本的開(kāi)發(fā)技巧。一、Ghidra Python腳本基礎(chǔ)1. 運(yùn)行環(huán)境與核心規(guī)則解釋器Ghidra內(nèi)置JythonPython 2.7 Java交互可直接調(diào)用Ghidra的Java API也兼容大部分Python 2.7語(yǔ)法腳本入口無(wú)顯式main函數(shù)腳本從上至下執(zhí)行可通過(guò)currentProgram、currentAddress等全局變量獲取當(dāng)前分析上下文核心依賴無(wú)需額外安裝庫(kù)直接導(dǎo)入Ghidra內(nèi)置模塊如ghidra.program.model.listing、ghidra.app.decompiler即可。2. 核心模塊與常用類/函數(shù)Ghidra Python腳本的核心是調(diào)用其Java封裝的API以下是逆向分析中最常用的模塊和類模塊/類功能描述ghidra.program.model.listing程序列表操作獲取函數(shù)、指令、數(shù)據(jù)、符號(hào)等核心模塊ghidra.app.decompiler反編譯相關(guān)將二進(jìn)制函數(shù)轉(zhuǎn)為C代碼ghidra.program.model.address地址操作構(gòu)建、比較、偏移地址ghidra.program.model.mem內(nèi)存操作讀取/寫入程序內(nèi)存數(shù)據(jù)ghidra.util.task.ConsoleTaskMonitor任務(wù)監(jiān)視器用于反編譯、分析等耗時(shí)操作的進(jìn)度跟蹤currentProgram全局變量當(dāng)前打開(kāi)的程序?qū)ο髄isting currentProgram.getListing()獲取程序列表對(duì)象用于遍歷函數(shù)/指令func.getEntryPoint()獲取函數(shù)入口地址decompiler.decompileFunction()反編譯指定函數(shù)memory.getBytes(addr, length)從指定地址讀取指定長(zhǎng)度的字節(jié)數(shù)據(jù)二、5個(gè)實(shí)戰(zhàn)腳本案例案例1批量反編譯所有函數(shù)到文件功能遍歷程序中所有函數(shù)將反編譯后的C代碼批量導(dǎo)出到指定文件方便離線分析。# -*- coding: utf-8 -*-# 批量反編譯函數(shù)腳本importghidra.app.decompilerasdecompilerimportghidra.program.model.listingaslistingimportcodecs# Python 2處理UTF-8編碼# 導(dǎo)出路徑自定義EXPORT_PATHD:\ghidra_decompile_all_functions.c# 獲取當(dāng)前程序和列表對(duì)象programcurrentProgram listingprogram.getListing()# 初始化反編譯器decompiler_servicedecompiler.DecompInterface()decompiler_service.openProgram(program)# 任務(wù)監(jiān)視器避免阻塞monitorghidra.util.task.ConsoleTaskMonitor()# 打開(kāi)文件并寫入withcodecs.open(EXPORT_PATH,w,utf-8)asf:f.write(// Auto decompiled by Ghidra Python Script )f.write(#include stdint.h )# 遍歷所有函數(shù)遞歸獲取forfuncinlisting.getFunctions(True):func_namefunc.getName()func_addrfunc.getEntryPoint()# 跳過(guò)系統(tǒng)自動(dòng)生成的無(wú)效函數(shù)iffunc_name.startswith(_)andfunc_name.find(sub_)-1:continue# 寫入函數(shù)頭信息f.write(// %s 0x%s %(func_name,func_addr))# 反編譯函數(shù)decompile_resultdecompiler_service.decompileFunction(func,0,monitor)ifdecompile_result.decompileCompleted():c_codedecompile_result.getDecompiledFunction().getC()f.write(c_code )else:f.write(// Decompile failed: %s %func_name)printDecompile failed: %s%func_name# 釋放資源decompiler_service.dispose()printAll functions decompiled to: %s%EXPORT_PATH案例2提取所有字符串并導(dǎo)出到CSV功能掃描程序內(nèi)存中的所有字符串ASCII/Unicode提取字符串內(nèi)容、地址、長(zhǎng)度導(dǎo)出為CSV文件輔助快速定位關(guān)鍵字符串如硬編碼密碼、URL。# -*- coding: utf-8 -*-# 提取字符串并導(dǎo)出CSV腳本importghidra.program.model.listingaslistingimportghidra.program.model.memasmemimportcodecs# 導(dǎo)出路徑CSV_PATHD:\ghidra_strings.csvprogramcurrentProgram listingprogram.getListing()memoryprogram.getMemory()# 字符串類型ASCII/UnicodeSTRING_TYPES[listing.DataUtilities.STRING_TYPE,listing.DataUtilities.UNICODE_STRING_TYPE]# 打開(kāi)CSV文件并寫入表頭withcodecs.open(CSV_PATH,w,utf-8)asf:f.write(Address,Type,Length,Content )# 遍歷程序中所有數(shù)據(jù)fordatainlisting.getDefinedData(True):# 判斷是否為字符串類型ifdata.getDataType().isString()anddata.getValue()isnotNone:addrdata.getAddress()str_typeASCIIifdata.getDataType().getName()stringelseUnicodestr_lendata.getLength()str_contentdata.getValue().encode(utf-8,ignore)# 處理特殊字符# 寫入CSV行f.write(0x%s,%s,%d,%s %(addr,str_type,str_len,str_content))printStrings exported to: %s%CSV_PATH案例3批量重命名相似函數(shù)基于特征功能識(shí)別以sub_開(kāi)頭的自動(dòng)命名函數(shù)若函數(shù)包含指定指令特征如mov eax, 0x1則批量重命名為func_xxx提升逆向可讀性。# -*- coding: utf-8 -*-# 批量重命名函數(shù)腳本importghidra.program.model.listingaslistingimportghidra.program.model.addressasaddress programcurrentProgram listingprogram.getListing()# 目標(biāo)指令特征字節(jié)碼mov eax, 0x1 → 0xB8 0x01 0x00 0x00 0x00TARGET_OPCODE[0xB8,0x01,0x00,0x00,0x00]RENAME_PREFIXfunc_syscall_counter0# 遍歷所有函數(shù)forfuncinlisting.getFunctions(True):func_namefunc.getName()# 僅處理自動(dòng)命名的sub_函數(shù)iffunc_name.startswith(sub_):func_addrfunc.getEntryPoint()func_instructionslisting.getInstructions(func.getBody(),True)# 檢查函數(shù)指令是否包含目標(biāo)特征has_target_opcodeFalseforinstinfunc_instructions:# 讀取指令字節(jié)碼opcode_bytes[]foriinrange(len(TARGET_OPCODE)):try:byteprogram.getMemory().getByte(inst.getAddress().add(i))opcode_bytes.append(byte0xFF)except:break# 匹配特征ifopcode_bytesTARGET_OPCODE:has_target_opcodeTruebreak# 重命名函數(shù)ifhas_target_opcode:new_name%s%d%(RENAME_PREFIX,counter)func.setName(new_name,ghidra.program.model.symbol.SourceType.USER_DEFINED)printRenamed: %s → %s (0x%s)%(func_name,new_name,func_addr)counter1printRenamed %d functions%counter案例4掃描程序中的硬編碼IP地址功能掃描程序內(nèi)存中的4字節(jié)數(shù)據(jù)解析為IPv4地址如0x0100007F→127.0.0.1提取所有硬編碼IP并導(dǎo)出輔助漏洞分析。# -*- coding: utf-8 -*-# 掃描硬編碼IP腳本importghidra.program.model.memasmemimportcodecs# 導(dǎo)出路徑IP_PATHD:\ghidra_hardcoded_ips.txtprogramcurrentProgram memoryprogram.getMemory()# 遍歷程序所有內(nèi)存塊IP_LIST[]defbytes_to_ip(byte1,byte2,byte3,byte4):4字節(jié)轉(zhuǎn)IPv4地址小端序return%d.%d.%d.%d%(byte40xFF,byte30xFF,byte20xFF,byte10xFF)# 遍歷內(nèi)存僅掃描可執(zhí)行/數(shù)據(jù)段forblockinmemory.getBlocks():ifblock.isReadable()andnotblock.isExternal():start_addrblock.getStart()end_addrblock.getEnd()current_addrstart_addr# 逐4字節(jié)掃描whilecurrent_addr.compareTo(end_addr)0:try:# 讀取4字節(jié)b1memory.getByte(current_addr)b2memory.getByte(current_addr.add(1))b3memory.getByte(current_addr.add(2))b4memory.getByte(current_addr.add(3))# 轉(zhuǎn)換為IPipbytes_to_ip(b1,b2,b3,b4)# 過(guò)濾無(wú)效IP如0.0.0.0、255.255.255.255ifipnotin[0.0.0.0,255.255.255.255]:IP_LIST.append((current_addr,ip))# 偏移4字節(jié)current_addrcurrent_addr.add(4)except:current_addrcurrent_addr.add(1)# 去重并寫入文件unique_ipslist(set(IP_LIST))withcodecs.open(IP_PATH,w,utf-8)asf:f.write(Address,IP Address )foraddr,ipinunique_ips:f.write(0x%s,%s %(addr,ip))printFound %d hardcoded IPs, exported to: %s%(len(unique_ips),IP_PATH)案例5統(tǒng)計(jì)函數(shù)調(diào)用關(guān)系并生成DOT圖功能分析指定函數(shù)的調(diào)用關(guān)系被誰(shuí)調(diào)用/調(diào)用了誰(shuí)生成DOT格式文件可通過(guò)Graphviz轉(zhuǎn)為可視化流程圖。# -*- coding: utf-8 -*-# 生成函數(shù)調(diào)用關(guān)系DOT腳本importghidra.program.model.listingaslistingimportghidra.program.model.symbolassymbolimportcodecs# 目標(biāo)函數(shù)名可修改TARGET_FUNC_NAMEmainDOT_PATHD:\ghidra_callgraph.dotprogramcurrentProgram listingprogram.getListing()symbol_tableprogram.getSymbolTable()# 查找目標(biāo)函數(shù)target_funcNoneforfuncinlisting.getFunctions(True):iffunc.getName()TARGET_FUNC_NAME:target_funcfuncbreakifnottarget_func:printFunction %s not found!%TARGET_FUNC_NAME exit(0)# 獲取調(diào)用關(guān)系caller_list[]# 調(diào)用當(dāng)前函數(shù)的函數(shù)callee_list[]# 當(dāng)前函數(shù)調(diào)用的函數(shù)# 1. 獲取被調(diào)用者calleeforrefinprogram.getReferenceManager().getReferencesFrom(target_func.getEntryPoint()):ifref.getReferenceType().isCall():callee_addrref.getToAddress()callee_funclisting.getFunctionContaining(callee_addr)ifcallee_func:callee_list.append(callee_func.getName())# 2. 獲取調(diào)用者callerforrefinprogram.getReferenceManager().getReferencesTo(target_func.getEntryPoint()):ifref.getReferenceType().isCall():caller_addrref.getFromAddress()caller_funclisting.getFunctionContaining(caller_addr)ifcaller_func:caller_list.append(caller_func.getName())# 生成DOT文件withcodecs.open(DOT_PATH,w,utf-8)asf:f.write(digraph CallGraph { )f.write( node [shapebox]; )# 繪制調(diào)用者→目標(biāo)函數(shù)forcallerincaller_list:f.write( %s - %s; %(caller,TARGET_FUNC_NAME))# 繪制目標(biāo)函數(shù)→被調(diào)用者forcalleeincallee_list:f.write( %s - %s; %(TARGET_FUNC_NAME,callee))f.write(} )printCall graph generated to: %s%DOT_PATHprintCallers of %s: %s%(TARGET_FUNC_NAME,caller_list)printCallees of %s: %s%(TARGET_FUNC_NAME,callee_list)三、Ghidra Python腳本開(kāi)發(fā)技巧類型轉(zhuǎn)換Jython中Java對(duì)象與Python類型可直接轉(zhuǎn)換如java.lang.String→ Python字符串但需注意編碼推薦utf-8異常處理內(nèi)存讀取、函數(shù)查找等操作需加try-except避免因無(wú)效地址導(dǎo)致腳本崩潰性能優(yōu)化遍歷大量數(shù)據(jù)時(shí)如全內(nèi)存掃描優(yōu)先使用getBlocks()按內(nèi)存塊遍歷而非逐字節(jié)掃描調(diào)試技巧通過(guò)print輸出中間結(jié)果或使用Ghidra的Script Console實(shí)時(shí)執(zhí)行代碼片段調(diào)試兼容性避免使用Python 3專屬語(yǔ)法如f-string全部改用%格式化或str.format()。四、總結(jié)Ghidra Python腳本是逆向工程自動(dòng)化的核心工具通過(guò)調(diào)用其豐富的Java API可實(shí)現(xiàn)從批量反編譯、特征提取到自定義分析的全流程自動(dòng)化。本文介紹的5個(gè)實(shí)戰(zhàn)腳本覆蓋了逆向分析中最常見(jiàn)的場(chǎng)景開(kāi)發(fā)者可基于這些案例擴(kuò)展功能如漏洞掃描、惡意代碼特征匹配等。掌握Ghidra Python腳本開(kāi)發(fā)能大幅提升逆向分析效率將重復(fù)的手工操作轉(zhuǎn)化為可復(fù)用的自動(dòng)化流程。
版權(quán)聲明: 本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

金湖建設(shè)工程質(zhì)量監(jiān)督網(wǎng)站wordpress二次元模版

金湖建設(shè)工程質(zhì)量監(jiān)督網(wǎng)站,wordpress二次元模版,網(wǎng)上引流推廣怎么做,中國(guó)建設(shè)會(huì)計(jì)網(wǎng)站2025年12月10日#xff0c;宏宇陶瓷“攬星空入宅”發(fā)布會(huì)在佛山潭洲國(guó)際會(huì)展中心啟幕。宏宇陶瓷打造沉浸

2026/01/23 09:56:01

做網(wǎng)站需要了解哪些知識(shí)建站系統(tǒng)源碼

做網(wǎng)站需要了解哪些知識(shí),建站系統(tǒng)源碼,百度關(guān)鍵詞優(yōu)化大師,方案案例網(wǎng)站iStoreOS作為基于OpenWrt的智能路由和NAS系統(tǒng)#xff0c;為用戶提供了強(qiáng)大的網(wǎng)絡(luò)管理和存儲(chǔ)功能。想要讓iStore

2026/01/23 07:49:01

河北省建設(shè)工程信息網(wǎng)站前端旅游網(wǎng)站行程怎么做

河北省建設(shè)工程信息網(wǎng)站,前端旅游網(wǎng)站行程怎么做,如何查詢網(wǎng)站是織夢(mèng)做的,乾安網(wǎng)站建設(shè)哪家好更多內(nèi)容請(qǐng)見(jiàn): 《Python3案例和總結(jié)》 - 專欄介紹和目錄 文章目錄 一、訪問(wèn)者模式概述 1.1 為什么

2026/01/21 17:53:01

財(cái)政網(wǎng)站平臺(tái)建設(shè)不足寧波公司網(wǎng)站建設(shè)價(jià)格

財(cái)政網(wǎng)站平臺(tái)建設(shè)不足,寧波公司網(wǎng)站建設(shè)價(jià)格,軟件開(kāi)發(fā)項(xiàng)目名稱有哪些,設(shè)計(jì)網(wǎng)站公司地址深入解析VXLAN BGP EVPN網(wǎng)絡(luò):?jiǎn)尾?、多播與特殊場(chǎng)景處理 單播轉(zhuǎn)發(fā)流程 在VXLAN網(wǎng)絡(luò)中,當(dāng)數(shù)據(jù)包被

2026/01/21 18:21:01