LyScript實(shí)現(xiàn)Hook改寫MessageBox的方法詳解
LyScript 可實(shí)現(xiàn)自定義匯編指令的替換功能,用戶可以自行編寫一段匯編指令,將程序中特定的通用函數(shù)進(jìn)行功能改寫與轉(zhuǎn)向操作,此功能原理是簡(jiǎn)單的Hook操作。
首先我們先來實(shí)現(xiàn)一個(gè)Hook模板,在代碼中實(shí)現(xiàn)中轉(zhuǎn)機(jī)制,如下代碼以MessageBoxA
函數(shù)為案例實(shí)現(xiàn)修改匯編參數(shù)傳遞。
from LyScript32 import MyDebug # 傳入?yún)R編列表,寫出到內(nèi)存 def assemble(dbg, address=0, asm_list=[]): asm_len_count = 0 for index in range(0,len(asm_list)): # 寫出到內(nèi)存 dbg.assemble_at(address, asm_list[index]) # print("地址: {} --> 長度計(jì)數(shù)器: {} --> 寫出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index])) # 得到asm長度 asm_len_count = dbg.assemble_code_size(asm_list[index]) # 地址每次遞增 address = address + asm_len_count if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連接狀態(tài): {}".format(connect_flag)) # 找到MessageBoxA messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA") print("MessageBoxA內(nèi)存地址 = {}".format(hex(messagebox_address))) # 分配空間 HookMem = dbg.create_alloc(1024) print("自定義內(nèi)存空間: {}".format(hex(HookMem))) # 寫出FindWindowA內(nèi)存地址,跳轉(zhuǎn)地址 asm = [ f"push {hex(HookMem)}", "ret" ] # 將列表中的匯編指令寫出到內(nèi)存 assemble(dbg,messagebox_address,asm) dbg.close()
上方代碼中可以看到,首先獲取到MessageBoxA
函數(shù)內(nèi)存地址,然后我們通過dbg.create_alloc(1024)
分配一段空間,并利用assemble()
函數(shù)寫出一個(gè)跳轉(zhuǎn)指令。
此段代碼執(zhí)行后,MessageBoxA
處的指令將被替換,跳轉(zhuǎn)到我們自己分配的內(nèi)存中去。
接著我們就來實(shí)現(xiàn)功能改寫,將彈窗中的消息替換成我們自己的版權(quán)信息,此處先給出代碼。
from LyScript32 import MyDebug # 傳入?yún)R編列表,寫出到內(nèi)存 def assemble(dbg, address=0, asm_list=[]): asm_len_count = 0 for index in range(0,len(asm_list)): # 寫出到內(nèi)存 dbg.assemble_at(address, asm_list[index]) # print("地址: {} --> 長度計(jì)數(shù)器: {} --> 寫出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index])) # 得到asm長度 asm_len_count = dbg.assemble_code_size(asm_list[index]) # 地址每次遞增 address = address + asm_len_count if __name__ == "__main__": dbg = MyDebug() connect_flag = dbg.connect() print("連接狀態(tài): {}".format(connect_flag)) # 找到MessageBoxA messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA") print("MessageBoxA內(nèi)存地址 = {}".format(hex(messagebox_address))) # 分配空間 HookMem = dbg.create_alloc(1024) print("自定義內(nèi)存空間: {}".format(hex(HookMem))) # 寫出FindWindowA內(nèi)存地址,跳轉(zhuǎn)地址 asm = [ f"push {hex(HookMem)}", "ret" ] # 將列表中的匯編指令寫出到內(nèi)存 assemble(dbg,messagebox_address,asm) # 定義兩個(gè)變量,存放字符串 MsgBoxAddr = dbg.create_alloc(512) MsgTextAddr = dbg.create_alloc(512) # 填充字符串內(nèi)容 # lyshark 標(biāo)題 txt = [0x6c, 0x79, 0x73, 0x68, 0x61, 0x72, 0x6b] # 內(nèi)容 lyshark.com box = [0x6C, 0x79, 0x73, 0x68, 0x61, 0x72, 0x6B, 0x2E, 0x63, 0x6F, 0x6D] for txt_count in range(0,len(txt)): dbg.write_memory_byte(MsgBoxAddr + txt_count, txt[txt_count]) for box_count in range(0,len(box)): dbg.write_memory_byte(MsgTextAddr + box_count, box[box_count]) print("標(biāo)題地址: {} 內(nèi)容: {}".format(hex(MsgBoxAddr),hex(MsgTextAddr))) # 此處是MessageBox替換后的片段 PatchCode =\ [ "mov edi, edi", "push ebp", "mov ebp,esp", "push -1", "push 0", "push dword ptr ss:[ebp+0x14]", f"push {hex(MsgBoxAddr)}", f"push {hex(MsgTextAddr)}", "push dword ptr ss:[ebp+0x8]", "call 0x76030E20", "pop ebp", "ret 0x10" ] # 寫出到自定義內(nèi)存 assemble(dbg, HookMem, PatchCode) print("地址已被替換,可以運(yùn)行了.") dbg.set_debug("Run") dbg.set_debug("Run") dbg.close()
首先程序運(yùn)行后,會(huì)經(jīng)過assemble(dbg,messagebox_address,asm)
匯編寫出的位置,此處是一個(gè)跳轉(zhuǎn),直接跳轉(zhuǎn)到我們自己申請(qǐng)的內(nèi)存空間內(nèi)。
當(dāng)EIP走到此處后,跳轉(zhuǎn)到我們自己構(gòu)建的彈窗位置,此處的代碼如下。
當(dāng)彈窗運(yùn)行后,讀入的內(nèi)存地址有兩處MsgBoxAddr
是消息MsgTextAddr
是文本,這兩處位置都被python中的push {hex()}
替換掉了,當(dāng)運(yùn)行彈窗后,就是執(zhí)行我們自己的函數(shù)。
到此這篇關(guān)于LyScript實(shí)現(xiàn)Hook改寫MessageBox的方法詳解的文章就介紹到這了,更多相關(guān)LyScript Hook改寫MessageBox內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了PyQt5 QThread倒計(jì)時(shí)功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04畫pytorch模型圖,以及參數(shù)計(jì)算的方法
今天小編就為大家分享一篇畫pytorch模型圖,以及參數(shù)計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典
這篇文章主要介紹了Python中3種內(nèi)建數(shù)據(jù)結(jié)構(gòu):列表、元組和字典,需要的朋友可以參考下2014-11-11利用Python第三方庫實(shí)現(xiàn)預(yù)測(cè)NBA比賽結(jié)果
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著利用Python實(shí)現(xiàn)預(yù)測(cè)NBA比賽結(jié)果展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06Python寫入MySQL數(shù)據(jù)庫的三種方式詳解
Python 讀取數(shù)據(jù)自動(dòng)寫入 MySQL 數(shù)據(jù)庫,這個(gè)需求在工作中是非常普遍的,主要涉及到 python 操作數(shù)據(jù)庫,讀寫更新等。本文總結(jié)了Python寫入MySQL數(shù)據(jù)庫的三種方式,需要的可以參考一下2022-06-06基于Python實(shí)現(xiàn)西西成語接龍小助手
成語接龍是中華民族傳統(tǒng)的文字游戲。本文將用Python制作一個(gè)簡(jiǎn)單的成語接龍小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08