最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

LyScript實(shí)現(xiàn)Hook改寫MessageBox的方法詳解

 更新時(shí)間:2022年09月13日 08:47:52   作者:lyshark  
LyScript可實(shí)現(xiàn)自定義匯編指令的替換功能。用戶可自行編寫匯編指令,將程序中特定的通用函數(shù)進(jìn)行功能改寫與轉(zhuǎn)向操作,此功能原理是簡(jiǎn)單的Hook操作。本文將詳細(xì)介紹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("地址: {} --> 長(zhǎng)度計(jì)數(shù)器: {} --> 寫出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index]))
        # 得到asm長(zhǎng)度
        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("地址: {} --> 長(zhǎng)度計(jì)數(shù)器: {} --> 寫出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index]))
        # 得到asm長(zhǎng)度
        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)文章

  • django的auth認(rèn)證,authenticate和裝飾器功能詳解

    django的auth認(rèn)證,authenticate和裝飾器功能詳解

    這篇文章主要介紹了django的auth認(rèn)證,authenticate和裝飾器功能詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python獲取微信企業(yè)號(hào)打卡數(shù)據(jù)并生成windows計(jì)劃任務(wù)

    python獲取微信企業(yè)號(hào)打卡數(shù)據(jù)并生成windows計(jì)劃任務(wù)

    由于公司的系統(tǒng)用的是Java版本,開通了企業(yè)號(hào)打卡之后又沒有預(yù)算讓供應(yīng)商做數(shù)據(jù)對(duì)接,所以只能自己搗鼓這個(gè),以下是個(gè)人設(shè)置的一些內(nèi)容,僅供大家參考
    2019-04-04
  • 淺談Python中的繼承

    淺談Python中的繼承

    這篇文章主要介紹了Python中繼承的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • pyqt5實(shí)現(xiàn)繪制ui,列表窗口,滾動(dòng)窗口顯示圖片的方法

    pyqt5實(shí)現(xiàn)繪制ui,列表窗口,滾動(dòng)窗口顯示圖片的方法

    今天小編就為大家分享一篇pyqt5實(shí)現(xiàn)繪制ui,列表窗口,滾動(dòng)窗口顯示圖片的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python?queue雙端隊(duì)列模塊及用法小結(jié)

    Python?queue雙端隊(duì)列模塊及用法小結(jié)

    雙端隊(duì)列是一種具有隊(duì)列和棧性質(zhì)的線性數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Python?queue雙端隊(duì)列模塊及用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python幫你解決手機(jī)qq微信內(nèi)存占用太多問題

    Python幫你解決手機(jī)qq微信內(nèi)存占用太多問題

    你有沒有發(fā)現(xiàn)以前16G內(nèi)存也可以裝幾個(gè)游戲玩,現(xiàn)在128G的卻日常使用都不夠了?更不用說裝什么游戲,這其實(shí)是軟件內(nèi)存占用過多導(dǎo)致的,今天我們用python來清理下
    2022-02-02
  • Django REST Framework之頻率限制的使用

    Django REST Framework之頻率限制的使用

    這篇文章主要介紹了Django REST Framework之頻率限制的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python使用Turtle庫(kù)繪制動(dòng)態(tài)鐘表

    python使用Turtle庫(kù)繪制動(dòng)態(tài)鐘表

    這篇文章主要為大家詳細(xì)介紹了python使用Turtle庫(kù)繪制動(dòng)態(tài)鐘表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼

    Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼

    本文主要介紹了Python服務(wù)器創(chuàng)建虛擬環(huán)境跑代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python爬蟲框架scrapy實(shí)現(xiàn)的文件下載功能示例

    Python爬蟲框架scrapy實(shí)現(xiàn)的文件下載功能示例

    這篇文章主要介紹了Python爬蟲框架scrapy實(shí)現(xiàn)的文件下載功能,結(jié)合實(shí)例形式分析了scrapy框架進(jìn)行文件下載的具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08

最新評(píng)論

永年县| 罗江县| 长阳| 古蔺县| 中阳县| 邵东县| 平阴县| 聂拉木县| 连云港市| 东宁县| 平南县| 白水县| 邳州市| 那坡县| 海安县| 荆门市| 南木林县| 永德县| 连云港市| 桐柏县| 彰武县| 清原| 洱源县| 建湖县| 太白县| 长治市| 招远市| 南汇区| 阿坝县| 桐柏县| 岑溪市| 营口市| 江西省| 宜兴市| 深圳市| 新源县| 西华县| 麻栗坡县| 天水市| 永修县| 石屏县|