LyScript實現(xiàn)Hook改寫MessageBox的方法詳解
LyScript 可實現(xiàn)自定義匯編指令的替換功能,用戶可以自行編寫一段匯編指令,將程序中特定的通用函數(shù)進行功能改寫與轉(zhuǎn)向操作,此功能原理是簡單的Hook操作。
首先我們先來實現(xiàn)一個Hook模板,在代碼中實現(xiàn)中轉(zhuǎn)機制,如下代碼以MessageBoxA函數(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("地址: {} --> 長度計數(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ù)寫出一個跳轉(zhuǎn)指令。
此段代碼執(zhí)行后,MessageBoxA處的指令將被替換,跳轉(zhuǎn)到我們自己分配的內(nèi)存中去。

接著我們就來實現(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("地址: {} --> 長度計數(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)
# 定義兩個變量,存放字符串
MsgBoxAddr = dbg.create_alloc(512)
MsgTextAddr = dbg.create_alloc(512)
# 填充字符串內(nèi)容
# lyshark 標題
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("標題地址: {} 內(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("地址已被替換,可以運行了.")
dbg.set_debug("Run")
dbg.set_debug("Run")
dbg.close()
首先程序運行后,會經(jīng)過assemble(dbg,messagebox_address,asm)匯編寫出的位置,此處是一個跳轉(zhuǎn),直接跳轉(zhuǎn)到我們自己申請的內(nèi)存空間內(nèi)。

當EIP走到此處后,跳轉(zhuǎn)到我們自己構(gòu)建的彈窗位置,此處的代碼如下。

當彈窗運行后,讀入的內(nèi)存地址有兩處MsgBoxAddr是消息MsgTextAddr是文本,這兩處位置都被python中的push {hex()}替換掉了,當運行彈窗后,就是執(zhí)行我們自己的函數(shù)。

到此這篇關(guān)于LyScript實現(xiàn)Hook改寫MessageBox的方法詳解的文章就介紹到這了,更多相關(guān)LyScript Hook改寫MessageBox內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django的auth認證,authenticate和裝飾器功能詳解
這篇文章主要介紹了django的auth認證,authenticate和裝飾器功能詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07
python獲取微信企業(yè)號打卡數(shù)據(jù)并生成windows計劃任務(wù)
由于公司的系統(tǒng)用的是Java版本,開通了企業(yè)號打卡之后又沒有預(yù)算讓供應(yīng)商做數(shù)據(jù)對接,所以只能自己搗鼓這個,以下是個人設(shè)置的一些內(nèi)容,僅供大家參考2019-04-04
pyqt5實現(xiàn)繪制ui,列表窗口,滾動窗口顯示圖片的方法
今天小編就為大家分享一篇pyqt5實現(xiàn)繪制ui,列表窗口,滾動窗口顯示圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼
本文主要介紹了Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
Python爬蟲框架scrapy實現(xiàn)的文件下載功能示例
這篇文章主要介紹了Python爬蟲框架scrapy實現(xiàn)的文件下載功能,結(jié)合實例形式分析了scrapy框架進行文件下載的具體操作步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-08-08

