Python利用capstone实现反汇编


Posted in Python onApril 06, 2022

Capstone是Kali Linux自带的一款轻量级反汇编引擎。它可以支持多种硬件构架,如ARM、ARM64、MIPS、X86。该框架使用C语言实现,但支持C++、Python、Ruby、OCaml、C#、Java和Go语言,具有很好的扩展性。因此,该框架被256种工具所集成,如Cuckoo、Binwalk、IntelliJ IDEA。渗透测试人员一额可以通过Python、Ruby语言编写脚本,引入Capstone引擎,从而构建自己的反汇编工具。

Capstone作为一个轻量级的多平台、多架构的反汇编框架,该模块支持目前所有通用操作系统,反汇编架构几乎全部支持。

capstone使用起来非常简单,如果只需要静态反汇编,则几行代码即可完成该功能了。

from capstone import *

# powerby LyShark
def Disassembly(path,BaseAddr,FileOffset,ReadByte):
    with open(path,"rb") as fp:
        fp.seek(int(FileOffset))
        opcode = fp.read(int(ReadByte))

    md = Cs(CS_ARCH_X86, CS_MODE_32)
    for item in md.disasm(opcode, 0):
        addr = int(BaseAddr) + item.address
        dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str}
        print(dic)

if __name__ == "__main__":
    # 文件名 内存地址 开始位置 长度
    Disassembly("d://Win32Project.exe",401000,0,1024)

如果需要针对.text节进行反汇编,则需要通过pefile模块找到该节所对应到文件中的位置,并从该位置开始向下反编译即可,代码如下:

from capstone import *
import pefile

# 遍历整个可执行文件并返回汇编代码,有一个小Bug
# powerby LyShark
def FOA_Disassembly(FilePath):
    opcode_list = []
    pe = pefile.PE(FilePath)
    ImageBase = pe.OPTIONAL_HEADER.ImageBase

    for item in pe.sections:
        if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text":
            # print("虚拟地址: 0x%.8X 虚拟大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize))
            VirtualAddress = item.VirtualAddress
            VirtualSize = item.Misc_VirtualSize
            ActualOffset = item.PointerToRawData
    StartVA = ImageBase + VirtualAddress
    StopVA = ImageBase + VirtualAddress + VirtualSize
    with open(FilePath,"rb") as fp:
        fp.seek(ActualOffset)
        HexCode = fp.read(VirtualSize)

    md = Cs(CS_ARCH_X86, CS_MODE_32)
    for item in md.disasm(HexCode, 0):
        addr = hex(int(StartVA) + item.address)
        dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str}
        print("[+] 反汇编地址: {} 参数: {}".format(addr,dic))
        opcode_list.append(dic)
    return opcode_list

if __name__ == "__main__":
    ref = FOA_Disassembly("d://Win32Project.exe")
    print(ref)

Python利用capstone实现反汇编

到此这篇关于Python利用capstone实现反汇编的文章就介绍到这了,更多相关Python capstone反汇编内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
windows下python连接oracle数据库
Jun 07 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
python列表生成式与列表生成器的使用
Feb 23 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
用python做游戏的细节详解
Jun 25 Python
使用python实现ftp的文件读写方法
Jul 02 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python线程定时器Timer实现原理解析
Nov 30 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 Python
pycharm 实现调试窗口恢复
Feb 05 Python
关于Python中进度条的六个实用技巧分享
如何在Python中妥善使用进度条详解
Apr 05 #Python
Python接口自动化之文件上传/下载接口详解
Apr 05 #Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Python中使用Opencv开发停车位计数器功能
Python采集股票数据并制作可视化柱状图
python疲劳驾驶困倦低头检测功能的实现
You might like
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
kali中python版本的切换方法
2019/07/11 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
python实现最大优先队列
2019/08/29 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
建筑设计专业求职自我评价
2014/03/02 职场文书
愚人节活动策划方案
2014/03/11 职场文书
冰峪沟导游词
2015/02/09 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
mysqldump进行数据备份详解
2022/07/15 MySQL
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS