LyScript实现Hook改写MessageBox的方法详解

 更新时间:2022年09月13日 08:47:52   作者:lyshark  
LyScript可实现自定义汇编指令的替换功能。用户可自行编写汇编指令,将程序中特定的通用函数进行功能改写与转向操作,此功能原理是简单的Hook操作。本文将详细介绍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的方法详解的文章就介绍到这了,更多相关LyScript Hook改写MessageBox内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django的auth认证,authenticate和装饰器功能详解

    django的auth认证,authenticate和装饰器功能详解

    这篇文章主要介绍了django的auth认证,authenticate和装饰器功能详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python获取微信企业号打卡数据并生成windows计划任务

    python获取微信企业号打卡数据并生成windows计划任务

    由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考
    2019-04-04
  • 浅谈Python中的继承

    浅谈Python中的继承

    这篇文章主要介绍了Python中继承的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法

    pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法

    今天小编就为大家分享一篇pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python queue双端队列模块及用法小结

    Python queue双端队列模块及用法小结

    双端队列是一种具有队列和栈性质的线性数据结构,本文主要介绍了Python queue双端队列模块及用法小结,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Python帮你解决手机qq微信内存占用太多问题

    Python帮你解决手机qq微信内存占用太多问题

    你有没有发现以前16G内存也可以装几个游戏玩,现在128G的却日常使用都不够了?更不用说装什么游戏,这其实是软件内存占用过多导致的,今天我们用python来清理下
    2022-02-02
  • Django REST Framework之频率限制的使用

    Django REST Framework之频率限制的使用

    这篇文章主要介绍了Django REST Framework之频率限制的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python使用Turtle库绘制动态钟表

    python使用Turtle库绘制动态钟表

    这篇文章主要为大家详细介绍了python使用Turtle库绘制动态钟表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Python服务器创建虚拟环境跑代码

    Python服务器创建虚拟环境跑代码

    本文主要介绍了Python服务器创建虚拟环境跑代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Python爬虫框架scrapy实现的文件下载功能示例

    Python爬虫框架scrapy实现的文件下载功能示例

    这篇文章主要介绍了Python爬虫框架scrapy实现的文件下载功能,结合实例形式分析了scrapy框架进行文件下载的具体操作步骤与相关实现技巧,需要的朋友可以参考下
    2018-08-08

最新评论