【区块链安全 | 第九篇】基于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.rhkb.cn/news/42997.html

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

相关文章

CANoe入门——CANoe的诊断模块,调用CAPL进行uds诊断

目录 一、诊断窗口介绍 二、诊断数据库文件管理 三、添加基础诊断描述文件(若没有CDD/ODX/PDX文件)并使用对应的诊断功能进行UDS诊断 3.1、添加基础诊断描述文件 3.2、基于基础诊断,使用诊断控制台进行UDS诊断 3.2.1、生成基础诊断 3.…

关于embedding向量模型的知识

环境: embedding 问题描述: 关于embedding向量模型的知识 解决方案: 向量模型基础 定义与本质:embedding向量模型是一种将离散数据(如文本、图像、用户行为等)映射到连续向量空间的技术。其核心思想是…

Docker远程访问与加密配置指南

实验目的 基础功能验证: 验证Docker远程访问的基础配置方法 测试未加密(2375端口)和TLS加密(2376端口)两种连接方式的可用性安全性对比: 对比防火墙开启/关闭状态下系统的暴露风险 分析未加密通信的数据传输安全性 验证TLS证书认证机制的有效性操作实践…

基于 Python 深度学习 lstm 算法的电影评论情感分析可视化系统(2.0 系统全新升级,已获高分通过)

大家好,欢迎来到我的技术专栏!今天我将和大家聊聊如何利用 Python 的深度学习技术,打造一个集电影评论情感分析与可视化展示于一体的系统。这个系统不仅能自动采集和解析海量影评,还能实时生成直观的情感趋势图表,对于…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练,因此需要将自定义的数据和标签加载到pytorch里面的dataloader里,也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例,我们分别做出图片的训练集和测试集,训练集的标…

业之峰与宏图智能战略携手,开启家装数字化新篇章

3月8日,业之峰装饰集团董事长张钧携高管团队与宏图智能董事长庭治宏及核心团队,在业之峰总部隆重举行了战略合作签约仪式,标志着双方将携手探索业之峰的数字化转型之路,共同推动家装行业的变革与发展。 近年来,家装行业…

区块链赋能,为木材货场 “智” 造未来

区块链赋能,为木材货场 “智” 造未来 在当今数字化浪潮席卷的时代,软件开发公司不断探索创新,为各行业带来高效、智能的解决方案。今天,让我们聚焦于一家软件开发公司的杰出成果 —— 区块链木材货场服务平台,深入了…

Suricata 检测日志中的时间戳不正确

参考连接 Incorrect Timestamp in Suricata Detection Logs - Help - Suricata 问题现象: 使用 Suricata 时遇到一个问题,即检测日志 (eve.json) 中的 and 字段间歇性地显示 2106 年。这似乎偶尔发生,并影响其中一个…

【第34节】windows原理:PE文件的导出表和导入表

目录 一、导出表 1.1 导出表概述 1.2 说明与使用 二、导入表 2.1 导入表概述 2.2 说明与使用 一、导出表 1.1 导出表概述 (1)导出行为和导出表用途:PE文件能把自身的函数、变量或者类,提供给其他PE文件使用,这…

【计算机网络】深入解析TCP/IP参考模型:从四层架构到数据封装,全面对比OSI

TCP/IP参考模型 导读一、历史背景二、分层结构2.1 网络接口层(Network Interface Layer)2.2 网络层(Internet Layer)2.3 传输层(Transport Layer)2.4 应用层(Application Layer) 三、…

项目实战-角色列表

抄上一次写过的代码: import React, { useState, useEffect } from "react"; import axios from axios; import { Button, Table, Modal } from antd; import { BarsOutlined, DeleteOutlined, ExclamationCircleOutlined } from ant-design/icons;const…

LeetCode1两数之和

**思路:**懒得写了,如代码所示 /*** Note: The returned array must be malloced, assume caller calls free().*/ struct hashTable {int key;//存值int val;//存索引UT_hash_handle hh; }; int* twoSum(int* nums, int numsSize, int target, int* re…

去噪算法大比拼

目录 效果图: 实现代码: 密集抖动 pip install pykalman 效果图: 实现代码: import numpy as np import cv2 import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter1d from scipy.signal import butter, filtfilt, savgol_filter from pykalma…

STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法: 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径,避免占用C盘空间。 Core就是Keil(MDK-ARM)的…

深入理解MySQL聚集索引与非聚集索引

在数据库管理系统中,索引是提升查询性能的关键。MySQL支持多种类型的索引,其中最基础也是最重要的两种是聚集索引和非聚集索引。本文将深入探讨这两种索引的区别,并通过实例、UML图以及Java代码示例来帮助您更好地理解和应用它们。 一、概念…

【leetcode】拆解与整合:分治并归的算法逻辑

前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

wx162基于springboot+vue+uniapp的在线办公小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

陈宛汮签约2025火凤凰风赏大典全球形象大使

原标题:陈宛汮签约2025火凤凰风赏大典全球形象大使 共工新闻社香港3月29日电 陈宛汮,华语原创女歌手。“星宝在闪耀”公益活动联合发起人,自闭症儿童康复推广大使。代表作:《荣耀火凤凰》《爱在醉千年》。 从2025年1月1日至2025年12月31日&a…

【深度学习入门_机器学习理论】极致梯度提升原理(XGBoost)

XGBoost(eXtreme Gradient Boosting)是一种高效、灵活且广泛应用的机器学习算法,属于梯度提升决策树(Gradient Boosting Decision Tree, GBDT) 的优化实现。它在分类、回归、排序等结构化/表格数据的预测任务中表现尤为…

Oracle初识:登录方法、导入dmp文件

目录 一、登录方法 以sys系统管理员的身份登录 ,无需账户和密码 以账户密码的用户身份登录 二、导入dmp文件 方法一:PLSQL导入dmp文件 一、登录方法 Oracle的登录方法有两种。 以sys系统管理员的身份登录 ,无需账户和密码 sqlplus / a…