亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LyScript如何獲取上一條與下一條匯編指令

發布時間:2022-07-28 13:46:33 來源:億速云 閱讀:237 作者:iii 欄目:開發技術

這篇“LyScript如何獲取上一條與下一條匯編指令”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“LyScript如何獲取上一條與下一條匯編指令”文章吧。

LyScript 插件默認并沒有提供上一條與下一條匯編指令的獲取功能,當然你可以使用LyScriptTools工具包直接調用內置命令得到,不過這種方式顯然在效率上并不理想,我們需要在LyScript插件API基礎上自己封裝實現這個功能。

獲取下一條匯編指令

下一條匯編指令的獲取需要注意如果是被命中的指令則此處應該是CC斷點占用一個字節,如果不是則正常獲取到當前指令即可。

1.我們需要檢查當前內存斷點是否被命中,如果沒有命中則說明此處我們需要獲取到原始的匯編指令長度,然后與當前eip地址相加獲得。

2.如果命中了斷點,則此處有兩種情況

1.1 如果是用戶下的斷點,則此處調試器會在指令位置替換為CC,也就是匯編中的init停機指令,該指令占用1個字節,需要eip+1得到。

1.2 如果是系統斷點,EIP所停留的位置,則我們需要正常獲取當前指令地址,此處調試器沒有改動匯編指令僅僅只下下了異常斷點。

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如何獲取上一條與下一條匯編指令

獲取上一條匯編指令

上一條指令的獲取難點就在于,我們無法確定當前指令的上一條指令到底有多長,所以只能用笨辦法,逐行掃描對比匯編指令,如果找到則取出其上一條指令即可。

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如何獲取上一條與下一條匯編指令”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淄博市| 兰坪| 黔西县| 汪清县| 昌平区| 五河县| 苏州市| 衡水市| 邵阳县| 独山县| 古蔺县| 弋阳县| 阜城县| 长葛市| 湘潭市| 宾川县| 措美县| 津南区| 浑源县| 富顺县| 平武县| 许昌市| 永定县| 海伦市| 当涂县| 泗洪县| 牡丹江市| 辽宁省| 保德县| 噶尔县| 百色市| 大理市| 沭阳县| 沧州市| 三穗县| 广东省| 二手房| 定安县| 都昌县| 宿迁市| 大邑县|