在LyScript插件中获取内置命令执行后的返回参数,可以通过使用一个寄存器进行中转操作。首先将寄存器进行压栈操作,然后执行内置命令并将结果存入寄存器,最后通过get_register函数获取寄存器内的参数。这样就可以在LyScript中获取到内置命令的返回值。

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):
    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()

    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()

读取效果如下:

当然了如果读者使用的是新版插件,那么会内置这个功能,建议使用新版本插件; 

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐