最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

LyScript實(shí)現(xiàn)內(nèi)存交換與差異對比的方法詳解

 更新時間:2022年08月04日 08:58:29   作者:lyshark  
LyScript?針對內(nèi)存讀寫函數(shù)的封裝功能并不多,只提供了內(nèi)存讀取和內(nèi)存寫入函數(shù)的封裝,本篇文章將繼續(xù)對API進(jìn)行封裝,實(shí)現(xiàn)一些在軟件逆向分析中非常實(shí)用的功能,需要的可以參考一下

LyScript 針對內(nèi)存讀寫函數(shù)的封裝功能并不多,只提供了內(nèi)存讀取和內(nèi)存寫入函數(shù)的封裝,本篇文章將繼續(xù)對API進(jìn)行封裝,實(shí)現(xiàn)一些在軟件逆向分析中非常實(shí)用的功能,例如內(nèi)存交換,內(nèi)存區(qū)域?qū)Ρ?,磁盤與內(nèi)存鏡像比較,特征碼檢索等功能。

LyScript項(xiàng)目地址:https://github.com/lyshark/LyScript

內(nèi)存區(qū)域交換

實(shí)現(xiàn)被加載程序內(nèi)特定一塊內(nèi)存區(qū)域的交換,該方法實(shí)現(xiàn)原理就是兩個變量之間的交換,只是在交換時需要逐個字節(jié)進(jìn)行,調(diào)用read_memory_byte()函數(shù)實(shí)現(xiàn)起了很容易。

from LyScript32 import MyDebug

# 交換兩個內(nèi)存區(qū)域
def memory_xchage(dbg,memory_ptr_x,memory_ptr_y,bytes):
    ref = False
    for index in range(0,bytes):
        # 讀取兩個內(nèi)存區(qū)域
        read_byte_x = dbg.read_memory_byte(memory_ptr_x + index)
        read_byte_y = dbg.read_memory_byte(memory_ptr_y + index)

        # 交換內(nèi)存
        ref = dbg.write_memory_byte(memory_ptr_x + index,read_byte_y)
        ref = dbg.write_memory_byte(memory_ptr_y + index, read_byte_x)
    return ref

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    eip = dbg.get_register("eip")

    # 內(nèi)存交換
    flag = memory_xchage(dbg, 6815744,6815776,4)
    print("內(nèi)存交換狀態(tài): {}".format(flag))
    dbg.close()

PE文件頭節(jié)點(diǎn)交換后如下:

內(nèi)存區(qū)域?qū)Ρ?/h2>

可用于對比該進(jìn)程內(nèi)存中的特定一塊區(qū)域的差異,返回是列表中的字典形式,分別傳入對比內(nèi)存x,y以及需要對比的內(nèi)存長度,此處建議不要超過1024字節(jié)。

from LyScript32 import MyDebug

# 對比兩個內(nèi)存區(qū)域
def memory_cmp(dbg,memory_ptr_x,memory_ptr_y,bytes):
    cmp_memory = []
    for index in range(0,bytes):

        item = {"addr":0, "x": 0, "y": 0}

        # 讀取兩個內(nèi)存區(qū)域
        read_byte_x = dbg.read_memory_byte(memory_ptr_x + index)
        read_byte_y = dbg.read_memory_byte(memory_ptr_y + index)

        if read_byte_x != read_byte_y:
            item["addr"] = memory_ptr_x + index
            item["x"] = read_byte_x
            item["y"] = read_byte_y
            cmp_memory.append(item)
    return cmp_memory

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    eip = dbg.get_register("eip")

    # 內(nèi)存對比
    cmp_ref = memory_cmp(dbg, 6815744,6815776,4)
    for index in range(0,len(cmp_ref)):
        print("地址: 0x{:08X} -> X: 0x{:02x} -> y: 0x{:02x}".format(cmp_ref[index].get("addr"),cmp_ref[index].get("x"),cmp_ref[index].get("y")))

    dbg.close()

對比特定內(nèi)存區(qū)域,返回差異字節(jié)地址:

內(nèi)存與磁盤機(jī)器碼比較

通過調(diào)用read_memory_byte()函數(shù),或者open()打開文件,等就可以得到程序磁盤與內(nèi)存中特定位置的機(jī)器碼參數(shù),然后通過對每一個列表中的字節(jié)進(jìn)行比較,就可得到特定位置下磁盤與內(nèi)存中的數(shù)據(jù)是否一致的判斷。

#coding: utf-8
import binascii,os,sys
from LyScript32 import MyDebug

# 得到程序的內(nèi)存鏡像中的機(jī)器碼
def get_memory_hex_ascii(address,offset,len):
    count = 0
    ref_memory_list = []
    for index in range(offset,len):
        # 讀出數(shù)據(jù)
        char = dbg.read_memory_byte(address + index)
        count = count + 1

        if count % 16 == 0:
            if (char) < 16:
                print("0" + hex((char))[2:])
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                print(hex((char))[2:])
                ref_memory_list.append(hex((char))[2:])
        else:
            if (char) < 16:
                print("0" + hex((char))[2:] + " ",end="")
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                print(hex((char))[2:] + " ",end="")
                ref_memory_list.append(hex((char))[2:])
    return ref_memory_list

# 讀取程序中的磁盤鏡像中的機(jī)器碼
def get_file_hex_ascii(path,offset,len):
    count = 0
    ref_file_list = []

    with open(path, "rb") as fp:
        # file_size = os.path.getsize(path)
        fp.seek(offset)

        for item in range(offset,offset + len):
            char = fp.read(1)
            count = count + 1
            if count % 16 == 0:
                if ord(char) < 16:
                    print("0" + hex(ord(char))[2:])
                    ref_file_list.append("0" + hex(ord(char))[2:])
                else:
                    print(hex(ord(char))[2:])
                    ref_file_list.append(hex(ord(char))[2:])
            else:
                if ord(char) < 16:
                    print("0" + hex(ord(char))[2:] + " ", end="")
                    ref_file_list.append("0" + hex(ord(char))[2:])
                else:
                    print(hex(ord(char))[2:] + " ", end="")
                    ref_file_list.append(hex(ord(char))[2:])
    return ref_file_list

if __name__ == "__main__":
    dbg = MyDebug()

    connect_flag = dbg.connect()
    print("連接狀態(tài): {}".format(connect_flag))

    module_base = dbg.get_base_from_address(dbg.get_local_base())
    print("模塊基地址: {}".format(hex(module_base)))

    # 得到內(nèi)存機(jī)器碼
    memory_hex_byte = get_memory_hex_ascii(module_base,0,100)

    # 得到磁盤機(jī)器碼
    file_hex_byte = get_file_hex_ascii("d://Win32Project1.exe",0,100)

    # 輸出機(jī)器碼
    print("\n內(nèi)存機(jī)器碼: ",memory_hex_byte)
    print("\n磁盤機(jī)器碼: ",file_hex_byte)

    dbg.close()

讀取后輸出時會默認(rèn)十六個字符一次換行,輸出效果如下。

我們繼續(xù)增加磁盤與內(nèi)存對比過程,然后就能實(shí)現(xiàn)對特定內(nèi)存區(qū)域與磁盤區(qū)域字節(jié)碼一致性的判斷。

#coding: utf-8
import binascii,os,sys
from LyScript32 import MyDebug

# 得到程序的內(nèi)存鏡像中的機(jī)器碼
def get_memory_hex_ascii(address,offset,len):
    count = 0
    ref_memory_list = []
    for index in range(offset,len):
        # 讀出數(shù)據(jù)
        char = dbg.read_memory_byte(address + index)
        count = count + 1

        if count % 16 == 0:
            if (char) < 16:
                print("0" + hex((char))[2:])
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                print(hex((char))[2:])
                ref_memory_list.append(hex((char))[2:])
        else:
            if (char) < 16:
                print("0" + hex((char))[2:] + " ",end="")
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                print(hex((char))[2:] + " ",end="")
                ref_memory_list.append(hex((char))[2:])
    return ref_memory_list

# 讀取程序中的磁盤鏡像中的機(jī)器碼
def get_file_hex_ascii(path,offset,len):
    count = 0
    ref_file_list = []

    with open(path, "rb") as fp:
        # file_size = os.path.getsize(path)
        fp.seek(offset)

        for item in range(offset,offset + len):
            char = fp.read(1)
            count = count + 1
            if count % 16 == 0:
                if ord(char) < 16:
                    print("0" + hex(ord(char))[2:])
                    ref_file_list.append("0" + hex(ord(char))[2:])
                else:
                    print(hex(ord(char))[2:])
                    ref_file_list.append(hex(ord(char))[2:])
            else:
                if ord(char) < 16:
                    print("0" + hex(ord(char))[2:] + " ", end="")
                    ref_file_list.append("0" + hex(ord(char))[2:])
                else:
                    print(hex(ord(char))[2:] + " ", end="")
                    ref_file_list.append(hex(ord(char))[2:])
    return ref_file_list

if __name__ == "__main__":
    dbg = MyDebug()

    connect_flag = dbg.connect()
    print("連接狀態(tài): {}".format(connect_flag))

    module_base = dbg.get_base_from_address(dbg.get_local_base())
    print("模塊基地址: {}".format(hex(module_base)))

    # 得到內(nèi)存機(jī)器碼
    memory_hex_byte = get_memory_hex_ascii(module_base,0,1024)

    # 得到磁盤機(jī)器碼
    file_hex_byte = get_file_hex_ascii("d://Win32Project1.exe",0,1024)

    # 輸出機(jī)器碼
    for index in range(0,len(memory_hex_byte)):
        # 比較磁盤與內(nèi)存是否存在差異
        if memory_hex_byte[index] != file_hex_byte[index]:
            # 存在差異則輸出
            print("\n相對位置: [{}] --> 磁盤字節(jié): 0x{} --> 內(nèi)存字節(jié): 0x{}".
                  format(index,memory_hex_byte[index],file_hex_byte[index]))
    dbg.close()

代碼運(yùn)行后即可輸出,存在差異的相對位置:

內(nèi)存ASCII碼解析

通過封裝的get_memory_hex_ascii得到內(nèi)存機(jī)器碼,然后再使用如下過程實(shí)現(xiàn)輸出該內(nèi)存中的機(jī)器碼所對應(yīng)的ASCII碼。

from LyScript32 import MyDebug
import os,sys

# 轉(zhuǎn)為ascii
def to_ascii(h):
    list_s = []
    for i in range(0, len(h), 2):
        list_s.append(chr(int(h[i:i+2], 16)))
    return ''.join(list_s)

# 轉(zhuǎn)為16進(jìn)制
def to_hex(s):
    list_h = []
    for c in s:
        list_h.append(hex(ord(c))[2:])
    return ''.join(list_h)

# 得到程序的內(nèi)存鏡像中的機(jī)器碼
def get_memory_hex_ascii(address,offset,len):
    count = 0
    ref_memory_list = []
    for index in range(offset,len):
        # 讀出數(shù)據(jù)
        char = dbg.read_memory_byte(address + index)
        count = count + 1

        if count % 16 == 0:
            if (char) < 16:
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                ref_memory_list.append(hex((char))[2:])
        else:
            if (char) < 16:
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                ref_memory_list.append(hex((char))[2:])
    return ref_memory_list


if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    eip = dbg.get_register("eip")

    # 得到模塊基地址
    module_base = dbg.get_base_from_address(dbg.get_local_base())

    # 得到指定區(qū)域內(nèi)存機(jī)器碼
    ref_memory_list = get_memory_hex_ascii(module_base,0,1024)

    # 解析ascii碼
    break_count = 1
    for index in ref_memory_list:
        if break_count %32 == 0:
            print(to_ascii(hex(int(index, 16))[2:]))
        else:
            print(to_ascii(hex(int(index, 16))[2:]),end="")
        break_count = break_count + 1

    dbg.close()

輸出效果如下,如果換成中文,那就是一個中文搜索引擎了。

內(nèi)存特征碼匹配

通過二次封裝get_memory_hex_ascii()實(shí)現(xiàn)掃描內(nèi)存特征碼功能,如果存在則返回True否則返回False。

from LyScript32 import MyDebug
import os,sys

# 得到程序的內(nèi)存鏡像中的機(jī)器碼
def get_memory_hex_ascii(address,offset,len):
    count = 0
    ref_memory_list = []
    for index in range(offset,len):
        # 讀出數(shù)據(jù)
        char = dbg.read_memory_byte(address + index)
        count = count + 1

        if count % 16 == 0:
            if (char) < 16:
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                ref_memory_list.append(hex((char))[2:])
        else:
            if (char) < 16:
                ref_memory_list.append("0" + hex((char))[2:])
            else:
                ref_memory_list.append(hex((char))[2:])
    return ref_memory_list


# 在指定區(qū)域內(nèi)搜索特定的機(jī)器碼,如果完全匹配則返回
def search_hex_ascii(address,offset,len,hex_array):
    # 得到指定區(qū)域內(nèi)存機(jī)器碼
    ref_memory_list = get_memory_hex_ascii(address,offset,len)

    array = []

    # 循環(huán)輸出字節(jié)
    for index in range(0,len + len(hex_array)):

        # 如果有則繼續(xù)裝
        if len(hex_array) != len(array):
            array.append(ref_memory_list[offset + index])

        else:
            for y in range(0,len(array)):
                if array[y] != ref_memory_list[offset + index + y]:
                    return False

        array.clear()
    return False

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    eip = dbg.get_register("eip")

    # 得到模塊基地址
    module_base = dbg.get_base_from_address(dbg.get_local_base())
    
    re = search_hex_ascii(module_base,0,100,hex_array=["0x4d","0x5a"])
    
    dbg.close()

特征碼掃描一般不需要自己寫,自己寫的麻煩,而且不支持通配符,可以直接調(diào)用我們API中封裝好的scan_memory_one()它可以支持??通配符模糊匹配,且效率要高許多。

到此這篇關(guān)于LyScript實(shí)現(xiàn)內(nèi)存交換與差異對比的方法詳解的文章就介紹到這了,更多相關(guān)LyScript內(nèi)存交換 對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Pycharm中的Python Console與Terminal

    淺談Pycharm中的Python Console與Terminal

    今天小編就為大家分享一篇淺談Pycharm中的Python Console與Terminal,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python jupyter入門教程

    python jupyter入門教程

    Jupyter Notebook是一個開源的Web應(yīng)用程序,允許用戶創(chuàng)建和共享包含代碼、方程式、可視化和文本的文檔,今天通過本文給大家分享python jupyter入門教程,需要的朋友一起看看吧
    2021-08-08
  • 已安裝Pytorch卻提示no?moudle?named?'torch'(沒有名稱為torch的模塊)

    已安裝Pytorch卻提示no?moudle?named?'torch'(沒有名稱為torch

    這篇文章主要給大家介紹了關(guān)于已安裝Pytorch卻提示no?moudle?named?'torch'(沒有名稱為torch的模塊)的相關(guān)資料,當(dāng)提示"No module named 'torch'"時,可能是由于安裝的Pytorch版本與當(dāng)前環(huán)境不匹配導(dǎo)致的,需要的朋友可以參考下
    2023-11-11
  • Python常問的100個面試問題匯總(下篇)

    Python常問的100個面試問題匯總(下篇)

    這篇文章主要介紹了Python常問的100個面試問題匯總(下篇),文章內(nèi)容詳細(xì),簡單易懂,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2023-01-01
  • Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用體驗(yàn)

    Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用體驗(yàn)

    這篇文章主要為大家介紹了Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python web框架之tornado的使用

    Python web框架之tornado的使用

    tornado是一個用Python語言寫成的Web服務(wù)器兼Web應(yīng)用框架,本文主要介紹了Python web框架之tornado的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • Python?字符串使用多個分隔符分割成列表的2種方法

    Python?字符串使用多個分隔符分割成列表的2種方法

    本文主要介紹了Python?字符串使用多個分隔符分割成列表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python3兩數(shù)相加的實(shí)現(xiàn)示例

    python3兩數(shù)相加的實(shí)現(xiàn)示例

    這篇文章主要介紹了python3兩數(shù)相加的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 帶你從內(nèi)存的角度看Python中的變量

    帶你從內(nèi)存的角度看Python中的變量

    這篇文章主要為大家介紹了從內(nèi)存的角度看Python中的變量,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python大批量搜索引擎圖像爬蟲工具詳解

    Python大批量搜索引擎圖像爬蟲工具詳解

    這篇文章主要介紹了Python大批量搜索引擎圖像爬蟲工具,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論

新竹县| 湖州市| 白水县| 青神县| 广饶县| 繁昌县| 广饶县| 福海县| 西丰县| 东港市| 革吉县| 子洲县| 密云县| 宜良县| 沙坪坝区| 武邑县| 永泰县| 桦川县| 平南县| 临汾市| 钟祥市| 防城港市| 赞皇县| 竹溪县| 德江县| 牡丹江市| 赫章县| 乌兰察布市| 玛多县| 三江| 镇赉县| 白玉县| 内江市| 龙海市| 仁寿县| 盘锦市| 凤山市| 华宁县| 衡阳县| 兴化市| 伽师县|