LyScriptTools 扩展Script类API手册

2022-12-28 18:16:47 浏览数 (1)

纯脚本类的功能实现都是调用的x64dbg命令,目前由于run_command_exec()命令无法返回参数,故通过中转eax寄存器实现了取值,目前只能取出整数类型的参数。

  • 插件地址:https://github.com/lyshark/LyScript

Script 类内函数名

函数作用

party(addr)

获取模块的模式编号, addr = 0则是用户模块,1则是系统模块

base(addr)

获取模块基址

size(addr)

返回模块大小

hash(addr)

返回模块hash

entry(addr)

返回模块入口

system(addr)

如果addr是系统模块则为true否则则是false

user(addr)

如果是用户模块则返回true 否则为false

main()

返回主模块基地址

rva(addr)

如果addr不在模块则返回0,否则返回addr所位于模块的RVA偏移

offset(addr)

获取地址所对应的文件偏移量,如果不在模块则返回0

isexport(addr)

判断该地址是否是从模块导出的函数

valid(addr)

判断addr是否有效,有效则返回True

base(addr)

或者当前addr的基址

size(addr)

获取当前addr内存的大小

iscode(addr)

判断当前 addr是否是可执行页面,成功返回TRUE

decodepointer(ptr)

解密指针,相当于调用了DecodePointer ptr

ReadByte(addr/eg)

从addr或者寄存器中读取一个字节内存并且返回

Byte(addr)

从addr或者寄存器中读取一个字节内存并且返回

ReadWord(addr)

读取两个字节

ReadDDword(addr)

读取四个字节

ReadQword(addr)

读取8个字节,但是只能是64位程序方可使用

ReadPtr(addr)

从地址中读取指针(4/8字节)并返回读取的指针值

ReadPointer(addr)

从地址中读取指针(4/8字节)并返回读取的指针值

len(addr)

获取addr处的指令长度

iscond(addr)

判断当前addr位置是否是条件指令

isbranch(addr)

判断当前地址是否是分支指令

isret(addr)

判断是否是ret指令

iscall(addr)

判断是否是call指令

ismem(addr)

判断是否是内存操作数

isnop(addr)

判断是否是nop

isunusual(addr)

判断当前地址是否指示为异常地址

branchdest(addr)

将指令的分支目标位于addr处

branchexec(addr)

如果分支要执行

imm(addr)

获取当前指令位置的立即数

brtrue(addr)

下一条指令的地址

next(addr)

获取addr的下一条地址

prev(addr)

获取addr上一条低地址

iscallsystem(addr)

判断当前指令是否是系统模块指令

get(index)

获取当前函数堆栈中的第index个参数

set(index,value)

设置的索引位置的值

firstchance()

最后一个异常是否为第一次机会异常

addr()

最后一个异常地址

code()

最后一个异常代码

flags()

最后一个异常标志

infocount()

上次异常信息计数

info(index)

最后一个异常信息

如上是一些常用的脚本命令的封装,他们的调用方式如下面代码中所示。

代码语言:javascript复制
from LyScript32 import MyDebug
from LyScriptTools32 import DebugControl
from LyScriptTools32 import Script

# 有符号整数转无符号数
def long_to_ulong(inter, is_64=False):
    if is_64 == False:
        return inter & ((1 << 32) - 1)
    else:
        return inter & ((1 << 64) - 1)

# 无符号整数转有符号数
def ulong_to_long(inter, is_64=False):
    if is_64 == False:
        return (inter & ((1 << 31) - 1)) - (inter & (1 << 31))
    else:
        return (inter & ((1 << 63) - 1)) - (inter & (1 << 63))

if __name__ == "__main__":
    dbg = MyDebug()
    connect_flag = dbg.connect()
    print("连接状态: {}".format(connect_flag))

    # 定义堆栈类
    control = DebugControl(dbg)
    script = Script(dbg)

    # 得到EIP
    eip = control.get_eip()

    size = script.size(eip)
    print("当前模块大小: {}".format(hex(size)))

    entry = script.entry(eip)
    print("当前模块入口: {}".format(hex(entry)))

    # 得到hash值,默认有符号需要转换
    hash = script.hash(eip)
    print("有符号hash值: {}".format(hash))

    hash = long_to_ulong(script.hash(eip))
    print("无符号hash值: {}".format(hex(hash)))

    dbg.close()

0 人点赞