首頁 > 軟體

Python利用LyScript外掛實現批次開啟關閉程序

2022-07-22 18:01:09

LyScript是一款x64dbg主動化操控外掛,經過Python操控X64dbg,完成了遠端動態偵錯,解決了逆向工作者剖析漏洞,尋覓指令片段,原生指令碼不行強壯的問題,經過與Python相結合使用Python語法的靈活性以及豐富的第三方庫,進步剖析功率,完成主動化剖析程式碼。

python包請裝置與外掛一致的版別,在cmd命令列下履行pip命令即可裝置。

裝置Python包:pipinstallLyScript32或者pipinstallLyScript64

其次你需求手動下載對應x64dbg版別的驅動檔案,並放入指定目錄下。

外掛下載好以後,請將該外掛複製到x64dbg目錄下的plugins目錄下,程式運轉後會主動載入外掛檔案。

當外掛載入成功後,會在紀錄檔方位看到具體的繫結資訊以及輸出偵錯,該外掛並不會在外掛欄顯示。

假如需求遠端偵錯,則只需求在初始化MyDebug()類是傳入對端IP地址即可,假如不填寫引數則預設使用127.0.0.1地址,請保證對端放行了6589埠,不然無法銜接。

運轉x64dbg程式並手動載入需求剖析的可履行檔案,然後我們能夠經過connect()方法銜接到偵錯程式,銜接後會建立一個持久對談直到python指令碼完畢則銜接會被強制斷開,在此期間可呼叫is_connect()檢視該連結是否還存在,具體程式碼如下所示。

fromLyScript32importMyDebugif__name__==」__main__」:#初始化dbg=MyDebug()#銜接到偵錯程式
connect_flag=dbg.connect()print(「銜接狀況:{}」.format(connect_flag))#檢測通訊端是否還在
​​​​​​​ref=dbg.is_connect()print(「是否在銜接:」,ref)dbg.close()

LyScript外掛預設沒有批次載入功能,導致使用者只能手動將被偵錯程序拖入到x64dbg中才可以偵錯,使用python模擬快捷鍵即可解決這個問題,具體使用程式碼如下。

import win32api
import win32gui, win32con
import win32clipboard
import re
import time
from LyScript32 import MyDebug

class cWindow:
    def __init__(self):
        self._hwnd = None

    def SetAsForegroundWindow(self):
        win32gui.SetForegroundWindow(self._hwnd)

    def Maximize(self):
        # 最大化
        win32gui.ShowWindow(self._hwnd, win32con.SW_MAXIMIZE)

    def _window_enum_callback(self, hwnd, regex):
        if self._hwnd is None and re.match(regex, str(win32gui.GetWindowText(hwnd))) is not None:
            self._hwnd = hwnd

    def find_window_regex(self, regex):
        self._hwnd = None
        win32gui.EnumWindows(self._window_enum_callback, regex)

    def hide_always_on_top_windows(self):
        win32gui.EnumWindows(self._window_enum_callback_hide, None)

    def _window_enum_callback_hide(self, hwnd, unused):
        if hwnd != self._hwnd:
            if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) & win32con.WS_EX_TOPMOST:
                className = win32gui.GetClassName(hwnd)
                if not (className == 'Button' or className == 'Shell_TrayWnd'):
                    win32gui.ShowWindow(hwnd, win32con.SW_FORCEMINIMIZE)

    def OpenFile(self,path):
        # 按下F3
        win32api.keybd_event(0x72, 0, 0, 0)
        win32api.keybd_event(0x72, 0, win32con.KEYEVENTF_KEYUP, 0)

        # 開啟剪貼簿
        win32clipboard.OpenClipboard()
        # 清空剪貼簿
        win32clipboard.EmptyClipboard()
        # 設定剪貼簿內容
        win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, path)
        # 獲取剪貼簿內容
        date = win32clipboard.GetClipboardData()
        print("[*] OpenFile = {}".format(date))
        # 關閉剪貼簿
        win32clipboard.CloseClipboard()
        time.sleep(0.2)

        # 按下ctrl+v
        win32api.keybd_event(0x11, 0, 0, 0)
        win32api.keybd_event(0x56, 0, 0, 0)
        win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)
        win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)

        # 按下回車
        win32api.keybd_event(0x0D, 0, 0, 0)
        win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)

    def deatch(self):
        # 按下Ctrl+Alt+F2
        win32api.keybd_event(0x11, 0, 0, 0)
        win32api.keybd_event(0x12, 0, 0, 0)
        win32api.keybd_event(0x71, 0, 0, 0)
        win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)
        win32api.keybd_event(0x12, 0, win32con.KEYEVENTF_KEYUP, 0)
        win32api.keybd_event(0x71, 0, win32con.KEYEVENTF_KEYUP, 0)

# 開啟偵錯程式
def OpenFile(path):
    regex = ".*x32dbg.*"
    cWindows = cWindow()
    cWindows.find_window_regex(regex)
    cWindows.SetAsForegroundWindow()
    cWindows.SetAsForegroundWindow()
    cWindows.OpenFile(path)

# 關閉偵錯程式
def DeatchFile():
    regex = ".*x32dbg.*"
    cWindows = cWindow()
    cWindows.find_window_regex(regex)
    cWindows.SetAsForegroundWindow()
    cWindows.SetAsForegroundWindow()
    cWindows.deatch()

# 得到指令碼返回值
def GetScriptValue(dbg,script):
    try:
        ref = dbg.run_command_exec("push eax")
        if ref != True:
            return None
        ref = dbg.run_command_exec(f"eax={script}")
        if ref != True:
            return None
        reg = dbg.get_register("eax")
        ref = dbg.run_command_exec("pop eax")
        if ref != True:
            return None
        return reg
    except Exception:
        return None
    return None

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    # 批次開啟一個列表
    for item in ["D:Win32Project.exe","D:Windows ToolsC32ASMc32asm.exe"]:
        OpenFile(item)
        time.sleep(3)

        for i in range(1,100):
            dbg.set_debug("StepIn")
            time.sleep(0.2)

        eip = dbg.get_register("eip")
        print("eip = > {}".format(hex(eip)))

        time.sleep(3)
        DeatchFile()

到此這篇關於Python利用LyScript外掛實現批次開啟關閉程序的文章就介紹到這了,更多相關Python批次開啟關閉程序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com