LyScript实现计算片段Hash并写出Excel的示例代码

本案例将学习运用LyScript计算特定程序中特定某些片段的Hash特征值,并通过xlsxwriter这个第三方模块将计算到的hash值存储成一个excel表格,本例中的知识点可以说已经具备了简单的表格输出能力,如果时间充裕完全可以实现自动化报告生成。

第一步实现计算特定片段的特征值,此类代码实现原理用户传入一个rva相对地址以及读入指令长度,并通过内置的hashlib库实现计算内存段内指令的特征,如下代码先来实现计算两段指令特征。

import hashlib
import zlib,binascii
from LyScript32 import MyDebug

# 计算哈希
def calc_hash(dbg, rva,size):
    read_list = bytearray()
    ref_hash = { \"va\": None, \"size\": None, \"md5\":None, \"sha256\":None, \"sha512\":None, \"crc32\":None }

    # 得到基地址
    base = dbg.get_local_module_base()

    # 读入数据
    for index in range(0,size):
        readbyte = dbg.read_memory_byte(base + rva + index)
        read_list.append(readbyte)

    # 计算特征
    md5hash = hashlib.md5(read_list)
    sha512hash = hashlib.sha512(read_list)
    sha256hash = hashlib.sha256(read_list)
    # crc32hash = binascii.crc32(read_list) & 0xffffffff

    ref_hash[\"va\"] = hex(base+rva)
    ref_hash[\"size\"] = size
    ref_hash[\"md5\"] = md5hash.hexdigest()
    ref_hash[\"sha256\"] = sha256hash.hexdigest()
    ref_hash[\"sha512\"] = sha512hash.hexdigest()
    ref_hash[\"crc32\"] = hex(zlib.crc32(read_list))
    return ref_hash

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

    # 传入相对地址,计算计算字节
    ref = calc_hash(dbg,0x19fd,10)
    print(ref)

    # 计算第二段
    ref = calc_hash(dbg,0x1030,26)
    print(ref)

    dbg.close()

计算后输出字典格式:

LyScript实现计算片段Hash并写出Excel的示例代码

第二部使用第三方库,将读入的hash参数写出到表格内,并在下方生成hash图例,方便观察。

import hashlib
import time
import zlib,binascii
from LyScript32 import MyDebug
import xlsxwriter

# 计算哈希
def calc_hash(dbg, rva,size):
    read_list = bytearray()
    ref_hash = { \"va\": None, \"size\": None, \"md5\":None, \"sha256\":None, \"sha512\":None, \"crc32\":None }

    # 得到基地址
    base = dbg.get_local_module_base()

    # 读入数据
    for index in range(0,size):
        readbyte = dbg.read_memory_byte(base + rva + index)
        read_list.append(readbyte)

    # 计算特征
    md5hash = hashlib.md5(read_list)
    sha512hash = hashlib.sha512(read_list)
    sha256hash = hashlib.sha256(read_list)
    # crc32hash = binascii.crc32(read_list) & 0xffffffff

    ref_hash[\"va\"] = hex(base+rva)
    ref_hash[\"size\"] = size
    ref_hash[\"md5\"] = md5hash.hexdigest()
    ref_hash[\"sha256\"] = sha256hash.hexdigest()
    ref_hash[\"sha512\"] = sha512hash.hexdigest()
    ref_hash[\"crc32\"] = hex(zlib.crc32(read_list))
    return ref_hash

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

    # 打开一个被调试进程
    dbg.open_debug(\"D:\\\\Win32Project.exe\")

    # 传入相对地址,计算计算字节
    ref = calc_hash(dbg,0x19fd,10)
    print(ref)

    ref2 = calc_hash(dbg,0x1030,26)
    print(ref2)

    ref3 = calc_hash(dbg,0x15EB,46)
    print(ref3)

    ref4 = calc_hash(dbg,0x172B,8)
    print(ref4)

    # 写出表格
    workbook = xlsxwriter.Workbook(\"pe_hash.xlsx\")
    worksheet = workbook.add_worksheet()

    headings = [\"VA地址\", \"计算长度\", \"MD5\", \"SHA256\", \"SHA512\",\"CRC32\"]
    data = [
        [ref.get(\"va\"),ref.get(\"size\"),ref.get(\"md5\"),ref.get(\"sha256\"),ref.get(\"sha512\"),ref.get(\"crc32\")],
        [ref2.get(\"va\"), ref2.get(\"size\"), ref2.get(\"md5\"), ref2.get(\"sha256\"), ref2.get(\"sha512\"), ref2.get(\"crc32\")],
        [ref3.get(\"va\"), ref3.get(\"size\"), ref3.get(\"md5\"), ref3.get(\"sha256\"), ref3.get(\"sha512\"), ref3.get(\"crc32\")],
        [ref4.get(\"va\"), ref4.get(\"size\"), ref4.get(\"md5\"), ref4.get(\"sha256\"), ref4.get(\"sha512\"), ref4.get(\"crc32\")]
    ]

    # 定义表格样式
    head_style = workbook.add_format({\"bold\": True, \"align\": \"center\", \"fg_color\": \"#D7E4BC\"})
    worksheet.set_column(\"A1:F1\", 15)

    # 逐条写入数据
    worksheet.write_row(\"A1\", headings, head_style)
    for i in range(0, len(data)):
        worksheet.write_row(\"A{}\".format(i + 2), data[i])

    # 添加条形图,显示前十个元素
    chart = workbook.add_chart({\"type\": \"line\"})
    chart.add_series({
        \"name\": \"=Sheet1!$B$1\",              # 图例项
        \"categories\": \"=Sheet1!$A$2:$A$10\",  # X轴 Item名称
        \"values\": \"=Sheet1!$B$2:$B$10\"       # X轴Item值
    })
    chart.add_series({
        \"name\": \"=Sheet1!$C$1\",
        \"categories\": \"=Sheet1!$A$2:$A$10\",
        \"values\": \"=Sheet1!$C$2:$C$10\"
    })
    chart.add_series({
        \"name\": \"=Sheet1!$D$1\",
        \"categories\": \"=Sheet1!$A$2:$A$10\",
        \"values\": \"=Sheet1!$D$2:$D$10\"
    })

    # 添加柱状图标题
    chart.set_title({\"name\": \"计算HASH统计图\"})
    # chart.set_style(8)

    chart.set_size({\'width\': 500, \'height\': 250})
    chart.set_legend({\'position\': \'top\'})

    # 在F2处绘制
    worksheet.insert_chart(\"H2\", chart)
    workbook.close()


    # 关闭被调试进程
    time.sleep(1)
    dbg.close_debug()
    dbg.close()

生成后的图例效果如下:

LyScript实现计算片段Hash并写出Excel的示例代码

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容