網站首頁 編程語言 正文
LyScript 可實現自定義匯編指令的替換功能,用戶可以自行編寫一段匯編指令,將程序中特定的通用函數進行功能改寫與轉向操作,此功能原理是簡單的Hook操作。
首先我們先來實現一個Hook模板,在代碼中實現中轉機制,如下代碼以MessageBoxA
函數為案例實現修改匯編參數傳遞。
from LyScript32 import MyDebug # 傳入匯編列表,寫出到內存 def assemble(dbg, address=0, asm_list=[]): asm_len_count = 0 for index in range(0,len(asm_list)): # 寫出到內存 dbg.assemble_at(address, asm_list[index]) # print("地址: {} --> 長度計數器: {} --> 寫出: {}".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("連接狀態: {}".format(connect_flag)) # 找到MessageBoxA messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA") print("MessageBoxA內存地址 = {}".format(hex(messagebox_address))) # 分配空間 HookMem = dbg.create_alloc(1024) print("自定義內存空間: {}".format(hex(HookMem))) # 寫出FindWindowA內存地址,跳轉地址 asm = [ f"push {hex(HookMem)}", "ret" ] # 將列表中的匯編指令寫出到內存 assemble(dbg,messagebox_address,asm) dbg.close()
上方代碼中可以看到,首先獲取到MessageBoxA
函數內存地址,然后我們通過dbg.create_alloc(1024)
分配一段空間,并利用assemble()
函數寫出一個跳轉指令。
此段代碼執行后,MessageBoxA
處的指令將被替換,跳轉到我們自己分配的內存中去。
接著我們就來實現功能改寫,將彈窗中的消息替換成我們自己的版權信息,此處先給出代碼。
from LyScript32 import MyDebug # 傳入匯編列表,寫出到內存 def assemble(dbg, address=0, asm_list=[]): asm_len_count = 0 for index in range(0,len(asm_list)): # 寫出到內存 dbg.assemble_at(address, asm_list[index]) # print("地址: {} --> 長度計數器: {} --> 寫出: {}".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("連接狀態: {}".format(connect_flag)) # 找到MessageBoxA messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA") print("MessageBoxA內存地址 = {}".format(hex(messagebox_address))) # 分配空間 HookMem = dbg.create_alloc(1024) print("自定義內存空間: {}".format(hex(HookMem))) # 寫出FindWindowA內存地址,跳轉地址 asm = [ f"push {hex(HookMem)}", "ret" ] # 將列表中的匯編指令寫出到內存 assemble(dbg,messagebox_address,asm) # 定義兩個變量,存放字符串 MsgBoxAddr = dbg.create_alloc(512) MsgTextAddr = dbg.create_alloc(512) # 填充字符串內容 # lyshark 標題 txt = [0x6c, 0x79, 0x73, 0x68, 0x61, 0x72, 0x6b] # 內容 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("標題地址: {} 內容: {}".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" ] # 寫出到自定義內存 assemble(dbg, HookMem, PatchCode) print("地址已被替換,可以運行了.") dbg.set_debug("Run") dbg.set_debug("Run") dbg.close()
首先程序運行后,會經過assemble(dbg,messagebox_address,asm)
匯編寫出的位置,此處是一個跳轉,直接跳轉到我們自己申請的內存空間內。
當EIP走到此處后,跳轉到我們自己構建的彈窗位置,此處的代碼如下。
當彈窗運行后,讀入的內存地址有兩處MsgBoxAddr
是消息MsgTextAddr
是文本,這兩處位置都被python中的push {hex()}
替換掉了,當運行彈窗后,就是執行我們自己的函數。
原文鏈接:https://www.cnblogs.com/LyShark/p/16684396.html
相關推薦
- 2022-08-18 R語言使用cgdsr包獲取TCGA數據示例詳解_R語言
- 2023-10-16 input框錄入身份證自動填寫性別年齡
- 2022-04-25 python處理SQLite數據庫的方法_python
- 2022-11-10 Android開發之ViewPager實現滑動切換頁面_Android
- 2022-07-18 RabbitMQ隊列阻塞該如何處理
- 2022-03-24 聊一聊redis奇葩數據類型與集群知識_Redis
- 2023-01-11 React中映射一個嵌套數組實現demo_React
- 2022-10-16 python中列表添加元素的幾種方式(+、append()、extend())_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支