• LyScriptTools Control 调试类API手册


    LyScriptTools模块中的DebugControl类主要负责控制x64dbg调试器的行为,例如获取或设置寄存器组,执行单步命令等,此类内的方法也是最常用的。

    LyScript项目地址: https://github.com/lyshark/LyScript

    调试类命令总结如下表所示:

    DebugControl 类内函数名函数作用
    GetEAX()获取通用寄存器系列
    SetEAX(decimal_value)设置特定寄存器中的值(十进制)
    GetZF()获取标志寄存器系列
    SetZF(decimal_bool)设置标志寄存器的值(布尔型)
    Script_InitDebug(path)传入文件路径,载入被调试程序
    Script_CloseDebug()终止当前被调试进程
    Script_DetachDebug()让进程脱离当前调试器
    Script_RunDebug()让进程运行起来
    Script_ERun()释放锁并允许程序运行,忽略异常
    Script_SeRun()释放锁并允许程序运行,跳过异常中断
    Script_Pause()暂停调试器运行
    Script_StepInto()步进
    Script_EStepInfo()步进,跳过异常
    Script_SeStepInto()步进,跳过中断
    Script_StepOver()步过到结束
    Script_StepOut()普通步过F8
    Script_Skip()跳过执行
    Script_Inc(register)递增寄存器
    Script_Dec(register)递减寄存器
    Script_Add(register,decimal_int)对寄存器进行add运算
    Script_Sub(register,decimal_int)对寄存器进行sub运算
    Script_Mul(register,decimal_int)对寄存器进行mul乘法
    Script_Div(register,decimal_int)对寄存器进行div除法
    Script_And(register,decimal_int)对寄存器进行and与运算
    Script_Or(register,decimal_int)对寄存器进行or或运算
    Script_Xor(register,decimal_int)对寄存器进行xor或运算
    Script_Neg(register,decimal_int)对寄存器参数进行neg反转
    Script_Rol(register,decimal_int)对寄存器进行rol循环左移
    Script_Ror(register,decimal_int)对寄存器进行ror循环右移
    Script_Shl(register,decimal_int)对寄存器进行shl逻辑左移
    Script_Shr(register,decimal_int)对寄存器进行shr逻辑右移
    Script_Sal(register,decimal_int)对寄存器进行sal算数左移
    Script_Sar(register,decimal_int)对寄存器进行sar算数右移
    Script_Not(register,decimal_int)对寄存器进行not按位取反
    Script_Bswap(register,decimal_int)进行字节交换也就是反转
    Script_Push(register_or_value)对寄存器入栈
    Script_Pop(register_or_value)对寄存器弹出元素
    Pause()内置API暂停
    Run()内置API运行
    StepIn()内置API步入
    StepOut()内置API步过
    StepOut()内置API到结束
    Stop()内置API停止
    Wait()内置API等待
    IsDebug()判断调试器是否在调试
    IsRunning()判断调试器是否在运行

    自动控制类主要功能如上表示,其中Script开头的API是调用的脚本命令实现,其他的是API实现,我们以批量自动载入程序为例,演示该类内函数是如何使用的。

    1. import os
    2. import pefile
    3. import time
    4. from LyScript32 import MyDebug
    5. from LyScriptTools32 import Module
    6. from LyScriptTools32 import Disassemble
    7. from LyScriptTools32 import DebugControl
    8. # 得到特定目录下的所有文件,并返回列表
    9. def GetFullFilePaht(path):
    10. ref = []
    11. for root,dirs,files in os.walk(str(path)):
    12. for index in range(0,len(files)):
    13. ref.append(str(root + "/" + files[index]))
    14. return ref
    15. if __name__ == "__main__":
    16. dbg = MyDebug()
    17. connect_flag = dbg.connect()
    18. print("连接状态: {}".format(connect_flag))
    19. # 初始化调试控制器
    20. debug = DebugControl(dbg)
    21. # 得到特定目录下的所有文件
    22. full_path = GetFullFilePaht("d://test/")
    23. for i in range(0,len(full_path)):
    24. debug.Script_InitDebug(str(full_path[i]))
    25. time.sleep(0.3)
    26. debug.Script_RunDebug()
    27. time.sleep(0.3)
    28. local_base = dbg.get_local_base()
    29. print("当前调试进程: {} 基地址: {}".format(full_path[i],local_base))
    30. time.sleep(0.3)
    31. # 关闭调试
    32. debug.Script_CloseDebug()
    33. dbg.close()

    如果你不使用Script_InitDebug来加载被调试进程,你也可以使用如下方式打开一个文件。

    1. import win32api
    2. import win32gui, win32con
    3. import win32clipboard
    4. import re
    5. import time
    6. from LyScript32 import MyDebug
    7. class cWindow:
    8. def __init__(self):
    9. self._hwnd = None
    10. def SetAsForegroundWindow(self):
    11. win32gui.SetForegroundWindow(self._hwnd)
    12. def Maximize(self):
    13. # 最大化
    14. win32gui.ShowWindow(self._hwnd, win32con.SW_MAXIMIZE)
    15. def _window_enum_callback(self, hwnd, regex):
    16. if self._hwnd is None and re.match(regex, str(win32gui.GetWindowText(hwnd))) is not None:
    17. self._hwnd = hwnd
    18. def find_window_regex(self, regex):
    19. self._hwnd = None
    20. win32gui.EnumWindows(self._window_enum_callback, regex)
    21. def hide_always_on_top_windows(self):
    22. win32gui.EnumWindows(self._window_enum_callback_hide, None)
    23. def _window_enum_callback_hide(self, hwnd, unused):
    24. if hwnd != self._hwnd:
    25. if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) & win32con.WS_EX_TOPMOST:
    26. className = win32gui.GetClassName(hwnd)
    27. if not (className == 'Button' or className == 'Shell_TrayWnd'):
    28. win32gui.ShowWindow(hwnd, win32con.SW_FORCEMINIMIZE)
    29. def OpenFile(self,path):
    30. # 按下F3
    31. win32api.keybd_event(0x72, 0, 0, 0)
    32. win32api.keybd_event(0x72, 0, win32con.KEYEVENTF_KEYUP, 0)
    33. # 打开剪贴板
    34. win32clipboard.OpenClipboard()
    35. # 清空剪贴板
    36. win32clipboard.EmptyClipboard()
    37. # 设置剪贴板内容
    38. win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, path)
    39. # 获取剪贴板内容
    40. date = win32clipboard.GetClipboardData()
    41. print("[*] OpenFile = {}".format(date))
    42. # 关闭剪贴板
    43. win32clipboard.CloseClipboard()
    44. time.sleep(0.2)
    45. # 按下ctrl+v
    46. win32api.keybd_event(0x11, 0, 0, 0)
    47. win32api.keybd_event(0x56, 0, 0, 0)
    48. win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)
    49. win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)
    50. # 按下回车
    51. win32api.keybd_event(0x0D, 0, 0, 0)
    52. win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)
    53. def deatch(self):
    54. # 按下Ctrl+Alt+F2
    55. win32api.keybd_event(0x11, 0, 0, 0)
    56. win32api.keybd_event(0x12, 0, 0, 0)
    57. win32api.keybd_event(0x71, 0, 0, 0)
    58. win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)
    59. win32api.keybd_event(0x12, 0, win32con.KEYEVENTF_KEYUP, 0)
    60. win32api.keybd_event(0x71, 0, win32con.KEYEVENTF_KEYUP, 0)
    61. # 打开调试程序
    62. def OpenFile(path):
    63. regex = ".*x32dbg.*"
    64. cWindows = cWindow()
    65. cWindows.find_window_regex(regex)
    66. cWindows.SetAsForegroundWindow()
    67. cWindows.SetAsForegroundWindow()
    68. cWindows.OpenFile(path)
    69. # 关闭调试程序
    70. def DeatchFile():
    71. regex = ".*x32dbg.*"
    72. cWindows = cWindow()
    73. cWindows.find_window_regex(regex)
    74. cWindows.SetAsForegroundWindow()
    75. cWindows.SetAsForegroundWindow()
    76. cWindows.deatch()
    77. # 得到脚本返回值
    78. def GetScriptValue(dbg,script):
    79. try:
    80. ref = dbg.run_command_exec("push eax")
    81. if ref != True:
    82. return None
    83. ref = dbg.run_command_exec(f"eax={script}")
    84. if ref != True:
    85. return None
    86. reg = dbg.get_register("eax")
    87. ref = dbg.run_command_exec("pop eax")
    88. if ref != True:
    89. return None
    90. return reg
    91. except Exception:
    92. return None
    93. return None
    94. if __name__ == "__main__":
    95. dbg = MyDebug()
    96. dbg.connect()
    97. # 批量打开一个列表
    98. for item in ["D:\Win32Project.exe","D:\Windows Tools\C32ASM\c32asm.exe"]:
    99. OpenFile(item)
    100. time.sleep(3)
    101. for i in range(1,100):
    102. dbg.set_debug("StepIn")
    103. time.sleep(0.2)
    104. eip = dbg.get_register("eip")
    105. print("eip = > {}".format(hex(eip)))
    106. time.sleep(3)
    107. DeatchFile()
  • 相关阅读:
    如何在 iPhone 上使用蓝牙鼠标
    开发deepstram的自定义插件,使用gst-dseaxmple插件进行扩充,实现deepstream图像输出前的预处理,实现图像自定义绘制图(精四)
    2024年火爆全网的三款ai智能直播系统,你知道哪一种?
    Redis Twemproxy 集群,水平扩展 ,扩容方案
    antd3和dva-自定义组件初始化值的操作演示和自定义组件校验
    Java中关键字packag和import的使用
    DirectX 3D C++ 圆柱体的渲染(源代码)
    harbor 搭建和部署
    医药、护士资格考试题库小程序使用指引
    极大似然函数和似然函数的区别
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126186496