【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目

文章目录

    • 背景
    • 目的
    • 安装
      • 1、安装 Rust
      • 2、克隆 heimdall-dec
      • 3、编译 heimdall-dec
      • 4、运行 heimdall-dec
    • 使用说明
      • 1、访问 Web 界面
      • 2、输入合约信息
      • 3、查看反编译结果
    • 实战演示
      • 1、解析普通合约
      • 2、解析代理合约

在这里插入图片描述

背景

在区块链安全研究中,智能合约的审计和分析至关重要。

RPC端点为与区块链节点(如以太坊、Polygon、BSC等)之间的通信提供了一种方式。通过RPC端点,任何人都可以访问区块链上合约的字节码、状态数据等信息。而合约地址则是定位特定智能合约的唯一标识符。

通过RPC端点和合约地址,我们能够与区块链节点上的合约进行通信,查询该合约的字节码。合约字节码是编译后的 Solidity 代码,包含了合约的执行逻辑,但不以可读的形式展示。

Heimdall 是一款智能合约反编译工具,通过反编译字节码,可将其还原为易于理解的可读 Solidity 代码。

基于 Heimdall 的反编译功能,heimdall-dec 项目实现了一个 Web 前端,能够通过图形化界面展示反编译后的合约代码。它不仅支持普通合约的反编译,还能自动解析代理合约(Proxy Contract),并找到对应的实现合约(Implementation Contract)进行反编译,极大地方便了合约分析工作。

该项目的 GitHub 地址如下:

https://github.com/smartdone/heimdall-dec

目的

本篇文章的目的:

1.介绍 heimdall-dec 反编译工具的安装和使用方法。
2.解析智能合约,包括普通合约和代理合约。
3.实战演示,展示如何使用 heimdall-dec 反编译合约。

安装

由于 heimdall-dec 是基于 Rust 开发的,首先需要安装 Rust。

1、安装 Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装完成后,执行以下命令确认 Rust 是否安装成功:

source $HOME/.cargo/env  # 让终端识别 Rust 命令rustc --version

在这里插入图片描述

2、克隆 heimdall-dec

克隆项目代码仓库:

git clone https://github.com/smartdone/heimdall-dec.git
cd heimdall-dec

在这里插入图片描述

3、编译 heimdall-dec

使用 cargo build 进行编译:

cargo build --release

在这里插入图片描述

编译完成后,生成的可执行文件位于:

./target/release/heimdall-dec

4、运行 heimdall-dec

./target/release/heimdall-dec

在这里插入图片描述

此时,heimdall-dec 将启动一个本地 Web 服务器,默认监听 http://127.0.0.1:8080。

使用说明

1、访问 Web 界面

在浏览器中打开:http://127.0.0.1:8080

在这里插入图片描述

2、输入合约信息

RPC 链接:输入区块链网络的 RPC 端点(可从 Chainlist 获取)。例如:

以太坊主网:https://mainnet.infura.io/v3/YOUR_API_KEYPolygon:https://polygon-rpc.comBSC:https://bsc-dataseed.binance.org

合约地址:输入需要反编译的智能合约地址。

3、查看反编译结果

点击提交后,Heimdall 将查询该地址的合约字节码。如果是代理合约,自动解析其实现合约,反编译字节码并显示可读的 Solidity 代码。

实战演示

1、解析普通合约

Polygon(Matic)对应的 RPC 为:

https://polygon-rpc.com

该网络上的 USDC(Token USD Coin)智能合约地址为:

0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174

输入 RPC 和合约地址,点击提交:

在这里插入图片描述

查看解析后的 Solidity 代码,分析其逻辑:

在这里插入图片描述

2、解析代理合约

在智能合约部署之后,通常无法修改其逻辑代码。一旦合约发布,就无法直接更新或者修复漏洞。为了解决这个问题,代理合约采用了将逻辑合约和存储分离的设计。代理合约只是一个转发请求的合约,而实际的业务逻辑由实现合约(Implementation Contract)来执行。如果发现某些漏洞或需要添加新功能时,开发者只需要部署新的实现合约,并将代理指向新合约。

许多 DeFi 项目使用代理合约(如 Transparent Proxy、UUPS Proxy),直接查询合约无法获取完整代码。

但该项目能够解析代理合约,并找到对应的实现合约(Implementation Contract)进行反编译。

举个例子,提交:

RPC:https://eth.llamarpc.com
Address:0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9

输出结果如下图所示:

// proxy address: 0x5D4Aa78B08Bc7C530e21bf7447988b1Be7991322

在这里插入图片描述

这意味着:

  • 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9 是一个代理合约(Proxy Contract)
  • 0x5D4Aa78B08Bc7C530e21bf7447988b1Be7991322 是实现合约(Implementation Contract)

同时,也可通过终端查看输出(不含源码):

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 PCI-Express 交换机实现面向未来的推理服务器

在数据中心系统的历史上,没有比被 Nvidia 选为其 AI 系统的组件供应商更高的赞誉了。 这就是为什么新兴的互连芯片制造商 Astera Labs 感到十分高兴,因为该公司正在 PCI-Express 交换机、PCI-Express 重定时器和 CXL 内存控制器方面与 Broadcom 和 Marv…

智能交通预警杆:守护道路安全的科技先锋

在城市化进程加速以及机动车保有量持续增长的背景下,道路交通安全与拥堵问题渐趋严峻。智能交通预警杆应时而生,其集成多种高科技功能,正逐步成为现代城市交通管理中至关重要的智能装备,对于提升交通效率、保障出行安全发挥着关键…

flink 基站与服务器长连接,每次连接和断开都会上报数据,统计过去一小时每个基站断开次数和时长

模拟生成数据 CREATE TABLE ods_station_log (base_station_id int, -- 基站IDevent_type int, -- 事件类型: connect/disconnectevent_time TIMESTAMP_LTZ(3), -- 事件时间WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND -- 允许5秒乱序 ) WITH …

自定义一些C语言的字符串函数

一、代码如下 (一)十六进制字符串转十进制整数 #include<stdio.h> // 把一个十六进制字符转成十进制整数 int hexToInt(char hexs[]){ int index; int k 0; for(k 0; ; k) { if(hexs[k] \0) { index k; break; …

核函数(机器学习深度学习)

一、核函数的基本概念 核函数&#xff08;Kernel Function&#xff09; 是机器学习中处理非线性问题的核心工具&#xff0c;通过隐式映射将数据从原始空间转换到高维特征空间&#xff0c;从而在高维空间中实现线性可分或线性建模。其数学本质是计算两个样本在高维空间中的内积…

微服务架构中的精妙设计:服务注册/服务发现-Eureka

一.使用注册中心背景 1.1服务远程调用问题 服务之间远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺点&#xff1a; 当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服…

极速版:栈的内存/局部变量表/堆的内存细分

1. 栈的存储 每个线程都有自己的栈&#xff0c;栈中数据以栈帧&#xff08;Stack Frame&#xff09;为基本单位 线程上正在执行的每个方法都各自对应一个栈桢&#xff08;Stack Frame&#xff09; 栈桢是一个内存区块&#xff0c;是一个数据集&#xff0c;维系着方法执行过程…

【操作系统】内存泄漏 vs 内存碎片

【操作系统】内存泄漏 vs 内存碎片 内存泄漏&#xff08;Memory Leak&#xff09; vs 内存碎片&#xff08;Memory Fragmentation&#xff09;1. 内存泄漏&#xff08;Memory Leak&#xff09;2. 内存碎片&#xff08;Memory Fragmentation&#xff09;3. 内存泄漏 vs 内存碎片…

力扣HOT100之矩阵:73. 矩阵置零

这道题我没有想到什么好的办法&#xff0c;直接暴力AC了&#xff0c;直接遍历两次矩阵&#xff0c;第一次遍历用两个向量分别记录出现0的行数和列数&#xff0c;第二次遍历就判断当前的元素的行数或者列数是否出现在之前的两个向量中&#xff0c;若出现了就直接置零&#xff0c…

​Flink/Kafka在python中的用处

一、基础概念 1. ​Apache Kafka 是什么&#xff1f; ​核心功能&#xff1a;Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据管道和流式应用程序。​核心概念&#xff1a; ​生产者&#xff08;Producer&#xff09;​&#xff1a;向 Kafka 发送数据的程序。…

推荐系统(十八):优势特征蒸馏(Privileged Features Distillation)在商品推荐中的应用

在商品推荐系统中&#xff0c;粗排和精排环节的知识蒸馏方法主要通过复杂模型&#xff08;Teacher&#xff09;指导简单模型&#xff08;Student&#xff09;的训练&#xff0c;以提升粗排效果及与精排的一致性。本文将以淘宝的一篇论文《Privileged Features Distillation at …

深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述

目录 &#x1f4c2; 深度学习四大核心架构 &#x1f330; 知识点概述 &#x1f9e0; 核心区别对比表 ⚡ 生活化案例理解 &#x1f511; 选型指南 &#x1f4c2; 深度学习四大核心架构 第一篇&#xff1a; 神经网络基础&#xff08;NN&#xff09; &#x1f330; 知识点概述…

R语言对偏态换数据进行转换(对数、平方根、立方根)

我们进行研究的时候经常会遇见偏态数据&#xff0c;数据转换是统计分析和数据预处理中的一项基本技术。使用 R 时&#xff0c;了解如何正确转换数据有助于满足统计假设、标准化分布并提高分析的准确性。在 R 中实现和可视化最常见的数据转换&#xff1a;对数、平方根和立方根转…

第十四届蓝桥杯省赛电子类单片机学习记录(客观题)

01.一个8位的DAC转换器&#xff0c;供电电压为3.3V&#xff0c;参考电压2.4V&#xff0c;其ILSB产生的输出电压增量是&#xff08;D&#xff09;V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析&#xff1a; ILSB&#xff08;最低有效位&#xff09;的电压增量计算公式…

HarmonyOSNext_API16_媒体查询

媒体查询条件详解 媒体查询是响应式设计的核心工具&#xff0c;通过判断设备特征动态调整界面样式。其完整规则由媒体类型、逻辑操作符和媒体特征三部分组成&#xff0c;具体解析如下&#xff1a; 一、媒体查询语法结构 基本格式&#xff1a; [媒体类型] [逻辑操作符] (媒体特…

Python+拉普拉斯变换求解微分方程

引言 在数学和工程学中,微分方程广泛应用于描述动态系统的行为,如电路、电气控制系统、机械振动等。求解微分方程的一个常见方法是使用拉普拉斯变换,尤其是在涉及到初始条件时。今天,我们将通过 Python 演示如何使用拉普拉斯变换来求解微分方程,并帮助大家更好地理解这一…

【算法】手撕快速排序

快速排序的思想 任取一个元素作为枢轴&#xff0c;然后想办法把这个区间划分为两部分&#xff0c;小于等于枢轴的放左边&#xff0c;大于等于枢轴的放右边 然后递归处理左右区间&#xff0c;直到空或只剩一个 具体动画演示详见 数据结构合集 - 快速排序(算法过程, 效率分析…

《八大排序算法》

相关概念 排序&#xff1a;使一串记录&#xff0c;按照其中某个或某些关键字的大小&#xff0c;递增或递减的排列起来。稳定性&#xff1a;它描述了在排序过程中&#xff0c;相等元素的相对顺序是否保持不变。假设在待排序的序列中&#xff0c;有两个元素a和b&#xff0c;它们…

深度学习篇---paddleocr正则化提取

文章目录 前言一、代码总述&介绍1.1导入必要的库1.1.1cv21.1.2re1.1.3paddleocr 1.2初始化PaddleOCR1.3打开摄像头1.4使用 PaddleOCR 进行识别1.5定义正则表达式模式1.6打印提取结果1.7异常处理 二、正则表达式2.1简介2.2常用正则表达式模式及原理2.2.1. 快递单号模式2.2.2…

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法&#xff08;ES6&#xff09; 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…