脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - LyScript获取上一条与下一条汇编指令的方法详解

LyScript获取上一条与下一条汇编指令的方法详解

2022-07-28 14:48lyshark Python

LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools工具包直接调用内置命令得到,本文就为大家详细讲讲如何实现

LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插件API基础上自己封装实现这个功能。

LyScript项目地址:https://github.com/lyshark/LyScript

获取下一条汇编指令

下一条汇编指令的获取需要注意如果是被命中的指令则此处应该是CC断点占用一个字节,如果不是则正常获取到当前指令即可。

1.我们需要检查当前内存断点是否被命中,如果没有命中则说明此处我们需要获取到原始的汇编指令长度,然后与当前eip地址相加获得。

2.如果命中了断点,则此处有两种情况

1.1 如果是用户下的断点,则此处调试器会在指令位置替换为CC,也就是汇编中的init停机指令,该指令占用1个字节,需要eip+1得到。

1.2 如果是系统断点,EIP所停留的位置,则我们需要正常获取当前指令地址,此处调试器没有改动汇编指令仅仅只下下了异常断点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from LyScript32 import MyDebug
 
# 获取当前EIP指令的下一条指令
def get_disasm_next(dbg,eip):
    next = 0
 
    # 检查当前内存地址是否被下了绊子
    check_breakpoint = dbg.check_breakpoint(eip)
 
    # 说明存在断点,如果存在则这里就是一个字节了
    if check_breakpoint == True:
 
        # 接着判断当前是否是EIP,如果是EIP则需要使用原来的字节
        local_eip = dbg.get_register("eip")
 
        # 说明是EIP并且命中了断点
        if local_eip == eip:
            dis_size = dbg.get_disasm_operand_size(eip)
            next = eip + dis_size
            next_asm = dbg.get_disasm_one_code(next)
            return next_asm
        else:
            next = eip + 1
            next_asm = dbg.get_disasm_one_code(next)
            return next_asm
        return None
 
    # 不是则需要获取到原始汇编代码的长度
    elif check_breakpoint == False:
        # 得到当前指令长度
        dis_size = dbg.get_disasm_operand_size(eip)
        next = eip + dis_size
        next_asm = dbg.get_disasm_one_code(next)
        return next_asm
    else:
        return None
 
if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()
 
    eip = dbg.get_register("eip")
 
    next = get_disasm_next(dbg,eip)
    print("下一条指令: {}".format(next))
 
    prev = get_disasm_next(dbg,12391436)
    print("下一条指令: {}".format(prev))
 
    dbg.close()

获取结果如下:

LyScript获取上一条与下一条汇编指令的方法详解

获取上一条汇编指令

上一条指令的获取难点就在于,我们无法确定当前指令的上一条指令到底有多长,所以只能用笨办法,逐行扫描对比汇编指令,如果找到则取出其上一条指令即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from LyScript32 import MyDebug
 
# 获取当前EIP指令的上一条指令
def get_disasm_prev(dbg,eip):
    prev_dasm = None
    # 得到当前汇编指令
    local_disasm = dbg.get_disasm_one_code(eip)
 
    # 只能向上扫描10行
    eip = eip - 10
    disasm = dbg.get_disasm_code(eip,10)
 
    # 循环扫描汇编代码
    for index in range(0,len(disasm)):
        # 如果找到了,就取出他的上一个汇编代码
        if disasm[index].get("opcode") == local_disasm:
            prev_dasm = disasm[index-1].get("opcode")
            break
 
    return prev_dasm
 
if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()
 
    eip = dbg.get_register("eip")
 
    next = get_disasm_prev(dbg,eip)
    print("上一条指令: {}".format(next))
 
    dbg.close()

输出效果如下:

LyScript获取上一条与下一条汇编指令的方法详解

到此这篇关于LyScript获取上一条与下一条汇编指令的方法详解的文章就介绍到这了,更多相关LyScript获取汇编指令内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/LyShark/p/16527744.html

延伸 · 阅读

精彩推荐