LyScript 实现Hook改写MessageBox
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()}替换掉了,当运行弹窗后,就是执行我们自己的函数。

LyScript 实现Hook改写MessageBox的更多相关文章
- Hook exe 和 file
c#拦截程序的运行 EasyHook + win7 64位 LocalHook.GetProcAddress("Kernel32.dll", "CreateProces ...
- 通过hook实现禁止shift+delete快捷键
实现全局hook必须要将hook代码封装在dll里,所以此程序有两个文件:noShiftDeleteHook.dll和noShiftDelete.exe noShiftDeleteHook.dll / ...
- HOOK -- DLL的远程注入技术详解(1)
DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...
- C# 新建文档CreateNewDocument
// Copyright 2010 ESRI// // All rights reserved under the copyright laws of the United States// and ...
- 10分钟API Hook MessageBox
10分钟API Hook MessageBox 分类: C++2012-04-12 22:52 877人阅读 评论(4) 收藏 举报 hookwinapidllthreadpython编程 转载注明出 ...
- 运用Detours库hook API(原理是改写函数的头5个字节)
一.Detours库的来历及下载: Detours库类似于WTL的来历,是由Galen Hunt and Doug Brubacher自己开发出来,于99年7月发表在一篇名为<Detours: ...
- HOOK API(三)—— HOOK 所有程序的 MessageBox
HOOK API(三) —— HOOK 所有程序的 MessageBox 0x00 前言 本实例要实现HOOK MessageBox,包括MessageBoxA和MessageBoxW,其实现细节与H ...
- HOOK API(二)—— HOOK自己程序的 MessageBox
HOOK API(二) —— HOOK自己程序的 MessageBox 0x00 前言 以下将给出一个简单的例子,作为HOOK API的入门.这里是HOOK 自己程序的MessageBox,即将自己程 ...
- Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good
API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭. const IDTIMEDOUT = 32000; function MessageBoxTim ...
- HOOK API(二) —— HOOK自己程序的 MessageBox
转载来源:https://www.cnblogs.com/hookjc/ 0x00 前言 以下将给出一个简单的例子,作为HOOK API的入门.这里是HOOK 自己程序的MessageBox,即将自己 ...
随机推荐
- SpringBoot 项目实战 | 瑞吉外卖 Day04
该系列将记录一份完整的实战项目的完成过程,该篇属于第四天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 文件上传下载 新增菜品 ...
- MAVEN 配置和基本使用
Maven 安装配置 解压 apache-maven-3.6.1.rar 既安装完成 配置环境变量 MAVEN_HOME 为安装路径的 bin 目录 在 Path 下添加 %MAVEN_HOME%\b ...
- Python | __init__.py的神奇用法
0._init_.py 在Python工程里,当python检测到一个目录下存在_init_.py文件时,python就会把它当成一个模块(module).Module跟C++的命名空间和Java的P ...
- vivo 互联网业务就近路由技术实战
一.问题背景 在vivo互联网业务高速发展的同时,支撑的服务实例规模也越来越大,然而单个机房能承载的机器容量是有限的,于是同城多机房甚至多地域部署就成为了业务在实际部署过程中不得不面临的场景. 一般情 ...
- 技术文档 | OpenSCA技术原理之composer依赖解析
OpenSCA知识小课堂开课了! 今天主要介绍基于composer包管理器的组件成分解析原理. composer介绍 composer是PHP的依赖管理工具. 开发者受到Node.js的npm及Rub ...
- 杂谈 | 在 SEU 开会可以去哪里
空间预约: 健雄书院预约系统 只对吴院人开放,其他人可通过前台志愿者预约. 秉文书院对全校开放(貌似?),需要 提前一天 预约. 借教室需要 提前两天 申请. 图书馆研讨间可以随时约,只是有点难抢. ...
- Avalonia使用默认弹窗
Avalonia使用默认弹窗 在Avalonia中使用官方默认弹窗WindowNotificationManager Views\MainWindow.axaml相关代码 <Window xml ...
- Laravel路由匹配
Route常规用法如下,特别是最后一个传参之后可以进行正则匹配,非常好用. //@后面内容为所要访问的方法 Route::get('foo', 'Photos\AdminController@meth ...
- java - ArrayList的使用
package list; import java.util.ArrayList; import demo.Hero; public class ListTs { public static void ...
- Oracle表结构&数据类型&约束
1.Oracle 表结构 1.1.创建表名的规范 推荐以"t_xxx" 不能含有"+- "等非法字符,eg:sql create table "t-1 ...