LyScript 自动化插件增加命令行回传参数的封装,由于x64dbg开发文档中提供的命令执行功能无法实现参数回传,导致LyScript插件无法得到内置命令执行后的返回参数,故本人想了一段时间,找到了这个解决方案。

LyScript 自动化插件增加命令行回传参数的封装,由于x64dbg开发文档中提供的命令执行功能无法实现参数回传,导致LyScript插件无法得到内置命令执行后的返回参数,故本人想了一段时间,找到了这个解决方案。

  • 插件地址: https://github.com/lyshark/LyScript
  • 其实我们完全可以通过一个寄存器进行中转操作,例如在使用寄存器之前对其进行压栈操作,并将内置脚本执行结果放入到寄存器内,最后使用get_register函数直接得到寄存器内的参数即可,录入下面这种写法就可以。

    from LyScript32 import MyDebug
    dbg = MyDebug()
    conn = dbg.connect()
    # 首先定义一个脚本变量
    ref = dbg.run_command_exec("$addr=1024")
    # 将脚本返回值放到eax寄存器,或者开辟一个堆放到堆里
    dbg.run_command_exec("eax=$addr")
    # 最后拿到寄存器的值
    hex(dbg.get_register("eax"))
    

    然后将其封装成GetScriptValue()函数,只需要传入一个内置命令例如teb()字符串即可。

    from LyScript32 import MyDebug
    # 得到脚本返回值
    def GetScriptValue(dbg,script):
            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()
        ref = GetScriptValue(dbg,"teb()")
        print(hex(ref))
        ref = GetScriptValue(dbg,"peb()")
        print(hex(ref))
        eax = dbg.get_register("eax")
        kbase = GetScriptValue(dbg,f"mod.base({eax})")
        print("模块及地址: {}".format(hex(kbase)))
        dbg.close()
    

    读取效果如下:

    这里推荐一篇文章,里面的内置命令都可执行:https://www.cnblogs.com/iBinary/p/16359195.html