LyScript實(shí)現(xiàn)指令查詢功能的示例代碼
通過(guò)對(duì)LyScript自動(dòng)化插件進(jìn)行二次封裝,實(shí)現(xiàn)從內(nèi)存中讀入目標(biāo)進(jìn)程解碼后的機(jī)器碼,并通過(guò)Python代碼在這些機(jī)器碼中尋找特定的十六進(jìn)制字符數(shù)組,或直接檢索是否存在連續(xù)的反匯編指令片段等功能。
LyScript項(xiàng)目地址:https://github.com/lyshark/LyScript
搜索內(nèi)存中的機(jī)器碼
內(nèi)存機(jī)器碼需要配合LyScript32插件,從內(nèi)存中尋找指令片段。
from LyScript32 import MyDebug # 將可執(zhí)行文件中的單數(shù)轉(zhuǎn)換為 0x00 格式 def ReadHexCode(code): hex_code = [] for index in code: if index >= 0 and index <= 15: #print("0" + str(hex(index).replace("0x",""))) hex_code.append("0" + str(hex(index).replace("0x",""))) else: hex_code.append(hex(index).replace("0x","")) #print(hex(index).replace("0x","")) return hex_code # 獲取到內(nèi)存中的機(jī)器碼 def GetCode(): try: ref_code = [] dbg = MyDebug() connect_flag = dbg.connect() if connect_flag != 1: return None start_address = dbg.get_local_base() end_address = start_address + dbg.get_local_size() # 循環(huán)得到機(jī)器碼 for index in range(start_address,end_address): read_bytes = dbg.read_memory_byte(index) ref_code.append(read_bytes) dbg.close() return ref_code except Exception: return False # 在字節(jié)數(shù)組中匹配是否與特征碼一致 def SearchHexCode(Code,SearchCode,ReadByte): SearchCount = len(SearchCode) #print("特征碼總長(zhǎng)度: {}".format(SearchCount)) for item in range(0,ReadByte): count = 0 # 對(duì)十六進(jìn)制數(shù)切片,每次向后遍歷SearchCount OpCode = Code[ 0+item :SearchCount+item ] #print("切割數(shù)組: {} --> 對(duì)比: {}".format(OpCode,SearchCode)) try: for x in range(0,SearchCount): if OpCode[x] == SearchCode[x]: count = count + 1 #print("尋找特征碼計(jì)數(shù): {} {} {}".format(count,OpCode[x],SearchCode[x])) if count == SearchCount: # 如果找到了,就返回True,否則返回False return True exit(0) except Exception: pass return False if __name__ == "__main__": # 讀取到內(nèi)存機(jī)器碼 ref_code = GetCode() if ref_code != False: # 轉(zhuǎn)為十六進(jìn)制 hex_code = ReadHexCode(ref_code) code_size = len(hex_code) # 指定要搜索的特征碼序列 search = ['c0', '74', '0d', '66', '3b', 'c6', '77', '08'] # 搜索特征: hex_code = exe的字節(jié)碼,search=搜索特征碼,code_size = 搜索大小 ret = SearchHexCode(hex_code, search, code_size) if ret == True: print("特征碼 {} 存在".format(search)) else: print("特征碼 {} 不存在".format(search)) else: print("讀入失敗")
輸出效果:
搜索內(nèi)存反匯編代碼
通過(guò)LyScript插件讀入內(nèi)存機(jī)器碼,并在該機(jī)器碼中尋找指令片段,找到后返回內(nèi)存首地址。
from LyScript32 import MyDebug # 檢索指定序列中是否存在一段特定的指令集 def SearchOpCode(OpCodeList,SearchCode,ReadByte): SearchCount = len(SearchCode) for item in range(0,ReadByte): count = 0 OpCode_Dic = OpCodeList[ 0 + item : SearchCount + item ] # print("切割字典: {}".format(OpCode_Dic)) try: for x in range(0,SearchCount): if OpCode_Dic[x].get("opcode") == SearchCode[x]: #print(OpCode_Dic[x].get("addr"),OpCode_Dic[x].get("opcode")) count = count + 1 if count == SearchCount: #print(OpCode_Dic[0].get("addr")) return OpCode_Dic[0].get("addr") exit(0) except Exception: pass if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連接狀態(tài): {}".format(connect_flag)) # 得到EIP位置 eip = dbg.get_register("eip") # 反匯編前1000行 disasm_dict = dbg.get_disasm_code(eip,1000) # 搜索一個(gè)指令序列,用于快速查找構(gòu)建漏洞利用代碼 SearchCode = [ ["push 0xC0000409", "call 0x003F1B38", "pop ecx"], ["push ecx", "push ebx"] ] # 檢索內(nèi)存指令集 for item in range(0,len(SearchCode)): Search = SearchCode[item] # disasm_dict = 返回匯編指令 Search = 尋找指令集 1000 = 向下檢索長(zhǎng)度 ret = SearchOpCode(disasm_dict,Search,1000) if ret != None: print("指令集: {} --> 首次出現(xiàn)地址: {}".format(SearchCode[item],hex(ret))) dbg.close()
輸出效果:
以上就是LyScript實(shí)現(xiàn)指令查詢功能的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于LyScript指令查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python解析、提取url關(guān)鍵字的實(shí)例詳解
今天小編就為大家分享一篇Python解析、提取url關(guān)鍵字的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12基于Python實(shí)現(xiàn)自動(dòng)關(guān)機(jī)小工具
上班族經(jīng)常會(huì)遇到這樣情況,著急下班結(jié)果將關(guān)機(jī)誤點(diǎn)成重啟,或者臨近下班又通知開會(huì),開完會(huì)已經(jīng)遲了還要去給電腦關(guān)機(jī)。今天使用PyQt5做了個(gè)自動(dòng)關(guān)機(jī)的小工具,設(shè)置好關(guān)機(jī)時(shí)間然后直接提交即可,需要的可以參考一下2022-10-10Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例
quick sort快速排序是一種再基礎(chǔ)不過(guò)的排序算法,使用Python代碼寫起來(lái)相當(dāng)簡(jiǎn)潔,這里我們就來(lái)看一下Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例:2016-06-06python性能檢測(cè)工具函數(shù)運(yùn)行內(nèi)存及運(yùn)行時(shí)間
這篇文章主要介紹了python性能檢測(cè)工具函數(shù)運(yùn)行內(nèi)存及運(yùn)行時(shí)間,python雖然是一門慢語(yǔ)言,但是也有著比較多的性能檢測(cè)工具來(lái)幫助我們優(yōu)化程序的運(yùn)行效率,下文小編給大家分享五個(gè)性能檢測(cè)工具,需要的朋友可以參考一下2022-05-05python實(shí)現(xiàn)用戶登錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)用戶登錄系統(tǒng)的相關(guān)資料,感興趣的朋友可以參考一下2016-05-05Python實(shí)現(xiàn)蒙特卡洛算法小實(shí)驗(yàn)過(guò)程詳解
這篇文章主要介紹了Python實(shí)現(xiàn)基于蒙特卡洛算法過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07