• LyScript 实现Hook改写MessageBox


    LyScript 可实现自定义汇编指令的替换功能,用户可以自行编写一段汇编指令,将程序中特定的通用函数进行功能改写与转向操作,此功能原理是简单的Hook操作。

    首先我们先来实现一个Hook模板,在代码中实现中转机制,如下代码以MessageBoxA函数为案例实现修改汇编参数传递。

    1. from LyScript32 import MyDebug
    2. # 传入汇编列表,写出到内存
    3. def assemble(dbg, address=0, asm_list=[]):
    4. asm_len_count = 0
    5. for index in range(0,len(asm_list)):
    6. # 写出到内存
    7. dbg.assemble_at(address, asm_list[index])
    8. # print("地址: {} --> 长度计数器: {} --> 写出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index]))
    9. # 得到asm长度
    10. asm_len_count = dbg.assemble_code_size(asm_list[index])
    11. # 地址每次递增
    12. address = address + asm_len_count
    13. if __name__ == "__main__":
    14. dbg = MyDebug()
    15. connect_flag = dbg.connect()
    16. print("连接状态: {}".format(connect_flag))
    17. # 找到MessageBoxA
    18. messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA")
    19. print("MessageBoxA内存地址 = {}".format(hex(messagebox_address)))
    20. # 分配空间
    21. HookMem = dbg.create_alloc(1024)
    22. print("自定义内存空间: {}".format(hex(HookMem)))
    23. # 写出FindWindowA内存地址,跳转地址
    24. asm = [
    25. f"push {hex(HookMem)}",
    26. "ret"
    27. ]
    28. # 将列表中的汇编指令写出到内存
    29. assemble(dbg,messagebox_address,asm)
    30. dbg.close()

    上方代码中可以看到,首先获取到MessageBoxA函数内存地址,然后我们通过dbg.create_alloc(1024)分配一段空间,并利用assemble()函数写出一个跳转指令。

    此段代码执行后,MessageBoxA处的指令将被替换,跳转到我们自己分配的内存中去。

    接着我们就来实现功能改写,将弹窗中的消息替换成我们自己的版权信息,此处先给出代码。

    1. from LyScript32 import MyDebug
    2. # 传入汇编列表,写出到内存
    3. def assemble(dbg, address=0, asm_list=[]):
    4. asm_len_count = 0
    5. for index in range(0,len(asm_list)):
    6. # 写出到内存
    7. dbg.assemble_at(address, asm_list[index])
    8. # print("地址: {} --> 长度计数器: {} --> 写出: {}".format(hex(address + asm_len_count), asm_len_count,asm_list[index]))
    9. # 得到asm长度
    10. asm_len_count = dbg.assemble_code_size(asm_list[index])
    11. # 地址每次递增
    12. address = address + asm_len_count
    13. if __name__ == "__main__":
    14. dbg = MyDebug()
    15. connect_flag = dbg.connect()
    16. print("连接状态: {}".format(connect_flag))
    17. # 找到MessageBoxA
    18. messagebox_address = dbg.get_module_from_function("user32.dll","MessageBoxA")
    19. print("MessageBoxA内存地址 = {}".format(hex(messagebox_address)))
    20. # 分配空间
    21. HookMem = dbg.create_alloc(1024)
    22. print("自定义内存空间: {}".format(hex(HookMem)))
    23. # 写出FindWindowA内存地址,跳转地址
    24. asm = [
    25. f"push {hex(HookMem)}",
    26. "ret"
    27. ]
    28. # 将列表中的汇编指令写出到内存
    29. assemble(dbg,messagebox_address,asm)
    30. # 定义两个变量,存放字符串
    31. MsgBoxAddr = dbg.create_alloc(512)
    32. MsgTextAddr = dbg.create_alloc(512)
    33. # 填充字符串内容
    34. # lyshark 标题
    35. txt = [0x6c, 0x79, 0x73, 0x68, 0x61, 0x72, 0x6b]
    36. # 内容 lyshark.com
    37. box = [0x6C, 0x79, 0x73, 0x68, 0x61, 0x72, 0x6B, 0x2E, 0x63, 0x6F, 0x6D]
    38. for txt_count in range(0,len(txt)):
    39. dbg.write_memory_byte(MsgBoxAddr + txt_count, txt[txt_count])
    40. for box_count in range(0,len(box)):
    41. dbg.write_memory_byte(MsgTextAddr + box_count, box[box_count])
    42. print("标题地址: {} 内容: {}".format(hex(MsgBoxAddr),hex(MsgTextAddr)))
    43. # 此处是MessageBox替换后的片段
    44. PatchCode =\
    45. [
    46. "mov edi, edi",
    47. "push ebp",
    48. "mov ebp,esp",
    49. "push -1",
    50. "push 0",
    51. "push dword ptr ss:[ebp+0x14]",
    52. f"push {hex(MsgBoxAddr)}",
    53. f"push {hex(MsgTextAddr)}",
    54. "push dword ptr ss:[ebp+0x8]",
    55. "call 0x76030E20",
    56. "pop ebp",
    57. "ret 0x10"
    58. ]
    59. # 写出到自定义内存
    60. assemble(dbg, HookMem, PatchCode)
    61. print("地址已被替换,可以运行了.")
    62. dbg.set_debug("Run")
    63. dbg.set_debug("Run")
    64. dbg.close()

    首先程序运行后,会经过assemble(dbg,messagebox_address,asm)汇编写出的位置,此处是一个跳转,直接跳转到我们自己申请的内存空间内。

    当EIP走到此处后,跳转到我们自己构建的弹窗位置,此处的代码如下。

    当弹窗运行后,读入的内存地址有两处MsgBoxAddr是消息MsgTextAddr是文本,这两处位置都被python中的push {hex()}替换掉了,当运行弹窗后,就是执行我们自己的函数。

  • 相关阅读:
    生态板行业分析:中国市场消费量同比增长0.8%
    多个pdf怎么合并成一个pdf?
    华为云云耀云服务器L实例评测|部署前后端分离项目
    react 高价组件HOC实现组件复用
    Linux偷偷“吃”了我的内存?
    【MySql】9- 实践篇(七)
    在 Navicat 中执行数据库范围搜索
    对开源自动化测试平台MeterSphere的使用感触
    PyTorch主要组成模块 | 数据读入 | 模型构建 | 模型初始化 | 损失函数 | 优化器 | 训练与评估
    R语言使用append函数在向量数据中的指定位置插入新的元素(一个或者多个数值)
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126809875