纯脚本类的功能实现都是调用的x64dbg命令,目前由于run_command_exec()
命令无法返回参数,故通过中转eax寄存器实现了取值,目前只能取出整数类型的参数。
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) | 最后一个异常信息 |
如上是一些常用的脚本命令的封装,他们的调用方式如下面代码中所示。
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()
标签:返回,LyScriptTools,addr,Script,地址,API,指令,模块,读取
From: https://blog.51cto.com/lyshark/5870397