安装包逆向2

import os
import struct
import lzma
import hashlib

DEBUG = False  # 调试标志
BASE_ADDRESS = 0x00120200  # 基地址偏移量

# Base类,用于存储基地址的数据
class Base:
    def __init__(self):
        self.startFilePos = 0  # 基地址在文件中的起始位置
        self.data = bytearray(0x15C8)  # 存储基地址的数据

# SingleFileData类,用于存储单个文件的数据
class SingleFileData:
    def __init__(self):
        self.fileInt = [0, 0]  # 存储文件的大小和其他属性
        self._dataSize = 0  # 文件数据的大小
        self.fileData = bytearray()  # 文件数据
        self.nextSingleFileData = None  # 下一个文件数据节点的引用

# SingleFile类,用于存储单个文件的信息
class SingleFile:
    def __init__(self):
        self.startFilePos = 0  # 文件在文件中的起始位置
        self.data = bytearray(0x194)  # 存储文件信息的数据
        self._times = 0  # 文件包含的子文件数量
        self._isFolder = False  # 文件是否是文件夹
        self._fileSize = 0  # 文件的总大小
        self.firstFileData = None  # 第一个文件数据节点的引用

# 读取基地址的函数
def read_base(file):
    # 定位到基地址的位置并读取数据
    file.seek(BASE_ADDRESS)
    base = Base()
    base.startFilePos = file.tell()  # 记录基地址在文件中的位置
    base.data = bytearray(file.read(0x15C8))  # 读取基地址的数据
    return base

# 读取下一个文件的函数
def read_next_file(file, need_data):
    # 创建SingleFile对象来存储文件信息
    single_file = SingleFile()
    single_file.startFilePos = file.tell()  # 记录文件在文件中的起始位置
    single_file.data = bytearray(file.read(0x194))  # 读取文件信息的数据
    single_file._isFolder = (single_file.data[200] == -1)  # 判断文件是否是文件夹
    single_file._times = single_file.data[0x190]  # 获取文件包含的子文件数量

    first_file_data = None  # 记录第一个文件数据节点的引用
    for i in range(single_file._times):
        file_data = SingleFileData()  # 创建SingleFileData对象来存储文件数据
        file_data.fileInt = struct.unpack('<2I', file.read(8))  # 读取文件的大小和其他属性
        single_file._fileSize += file_data.fileInt[0]  # 计算文件的总大小

        # 如果不是文件夹,且需要数据,则读取文件数据
        if not single_file._isFolder:
            if not DEBUG:
                file_data.fileData = bytearray(file.read(file_data.fileInt[0]))  # 读取文件数据
            else:
                file.seek(file_data.fileInt[0], os.SEEK_CUR)  # 跳过文件数据

        # 将文件数据节点连接到单个文件对象上
        if first_file_data is None:
            single_file.firstFileData = file_data
            first_file_data = file_data
        else:
            first_file_data.nextSingleFileData = file_data
            first_file_data = file_data

    return single_file

# 提取文件的函数
def extract_file(f, output_folder):
    # 获取文件名并构建文件路径
    filename = re.sub(r'[^\w\-_. ]', '', f.data.decode("utf-16le").replace("\x00", ""))
    path = os.path.join(output_folder, filename)
    os.makedirs(os.path.dirname(path), exist_ok=True)  # 创建文件夹
    with open(path, "wb") as file_handle:
        file_data = f.firstFileData
        while file_data is not None:
            if file_data.fileData is not None:
                file_handle.write(file_data.fileData)  # 写入文件数据
            file_data = file_data.nextSingleFileData
    return path

# 计算文件MD5值的函数
def calculate_md5(file_path):
    hasher = hashlib.md5()
    with open(file_path, "rb") as file:
        for chunk in iter(lambda: file.read(4096), b""):
            hasher.update(chunk)
    return hasher.hexdigest()

# 主函数
def main():
    output_folder = r"F:\The couers of He predecessor\The fourth lesson\data"  # 输出文件夹路径

    with open("F:/The couers of He predecessor/The fourth lesson/MeiqiaWinLatest.exe", "rb") as f:
        base = read_base(f)  # 读取基地址
        print(f"baseStartPos: {base.startFilePos:0x}")  # 打印基地址的起始位置

        while True:
            file = read_next_file(f, not DEBUG)  # 读取下一个文件
            if file._fileSize <= 0:
                break

            extracted_file_path = ""
            if not DEBUG:
                extracted_file_path = extract_file(file, output_folder)  # 提取文件

            md5 = ""
            if extracted_file_path:
                md5 = calculate_md5(extracted_file_path)  # 计算文件的MD5值

            # 打印文件信息和MD5值
            print(f"fileStartPos: {file.startFilePos:0x}\t\tisFolder: {file._isFolder}")
            print(f"fileName: {file.data.decode('utf-16le')}\t\tfileZipSize: 0x{file._fileSize:0x}\n")
            print(f"MD5: {md5}\n")

if __name__ == "__main__":
    main()


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯嵌入式】按键控制LED与LCD(必考三件套)

【蓝桥杯嵌入式】按键控制LED与LCD&#xff08;必考三件套&#xff09; 前言LED相关功能的实现LED基础功能函数&#xff08;点亮、全熄灭、翻转&#xff09;LED的闪烁与定时点亮熄灭流水灯的实现 按键的扫描及长短按、双击的实现按键的短按按键业务逻辑程序进程按键的长短按长短…

1995-2021年各省分品种能源产量和消费量数据

1995-2021年各省分品种能源产量和消费量数据 1、时间&#xff1a;1995-2021年 2、来源&#xff1a;能源统计年鉴、各省年鉴 3、指标&#xff1a;能源消费总量、煤炭消费量、焦炭消费量、原油消费量、汽油消费量、煤油消费量、柴油消费量、燃料油消费量、天然气消费量、电力消…

让智能体像孩子一样观察别人学习动作,跨视角技能学习数据集EgoExoLearn来了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 在探索人工智能边界时&#xff0c;我们时常惊叹于人类孩童的学习能力 —— 可以轻易地将他人…

Unity学习笔记 - 第一个Hello World都算不上的项目

一、Unity安装 这里不细说安装了&#xff0c;首先需要Visual Studio&#xff0c;然后要安装Unity Hub&#xff0c;Unity Hub就像一个管理平台&#xff0c;安装完它之后&#xff0c;可以在它的界面上选择安装各个版本的编辑器。 开始您的创意项目并下载 Unity Hub | Unity通过 …

【Qt 学习笔记】Qt 中出现乱码的解释及讨论

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 中出现乱码的解释及讨论 文章编号&#xff1a;Qt 学习笔记 / 06 文…

Nginx配置之localhost和反向代理

文章目录 第一步、查看安装位置和配置文件第二步、web服务器设置第三步、localhost 指令第四步、设置反向代理 清明假期&#xff0c;在家练习Nginx配置&#xff0c;在前期【 linux环境下安装配置nginx代理服务器】已经完成nginx环境搭建&#xff0c;本期主要实践web服务器&…

副业选择攻略:如何找到最适合自己的那一个?

大家好&#xff0c;我是木薯。今天有个新人伙伴来咨询客服&#xff1a;新手适不适合在水牛社上做副业&#xff1f;什么样的副业适合自己&#xff1f; 这种问题其实对我们来说已经见得太多太多了&#xff0c;归其原因是因为自己对副业没有一个清晰的自我认知&#xff0c;从而感觉…

阿里千问大模型 Qwen1.5 开源 32B 模型,将开源进行到底!!!

阿里开源的千问系列模型&#xff0c;一直受到业界好评&#xff0c;之前版本有0.5B、1.8B、7B、14B、72B&#xff0c;但一直缺少的30B级别开源模型&#xff0c;这也一直是一个遗憾。 怎么说呢&#xff1f;72B模型太大&#xff0c;很多人用不起来&#xff0c;无论是微调&#xf…

基于JAVA+SSM+微信小程序+MySql+前后端分离的图书捐赠管理系统设计与实现

一、项目背景介绍&#xff1a; 在当今社会&#xff0c;图书捐赠是一种普遍而有益的行为&#xff0c;旨在促进阅读、教育和知识传播。图书捐赠可以帮助改善教育资源不足的地区、学校和社区的阅读环境&#xff0c;提供更多的学习机会和知识获取途径。随着互联网和移动技术的发展&…

pytorch交叉熵

目录 1. Entropy2. 交叉熵3. 二分类4. 为什么分类问题使用交叉熵5. 代码示例 1. Entropy Entropy中文是熵的意思&#xff0c;它代表一种不确定性&#xff0c;不确定性越高惊喜度也就越高。 如上图&#xff0c;假设熵代表中奖概率&#xff0c;当熵为2 的中奖概率为1/4没什么惊…

sharding‐jdbc之分库分表(mysql主从同步的数据库安装和使用)

水平分表 创建基础工程.. 引入sharding‐jdbc的maven依赖包 注意需要数据库连接池等依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1&l…

1.0-spring入门

文章目录 前言一、版本要求二、第一个spring程序1.引入pom2.代码部分2.1 spring bean2.2 springContext.xml2.3 测试2.4 执行结果 总结 前言 最近想要系统的学习下spring相关的框架,于是乎,来到了B站(真是个好地方),spring会专门开一个专栏出来,记录学习心得,与大家共勉。 Spri…

51-37 由浅入深理解 Stable Diffusion 3

2024年3月5日&#xff0c;Stability AI公开Stable Diffusion 3论文&#xff0c;Scaling Rectified Flow Transformers for High-Resolution Image Synthesis。公司像往常一样承诺后续将开源代码&#xff0c;开源之光&#xff01;&#xff01;&#xff01; 在LDW潜在扩散模型论文…

缓存击穿以及解决方案

1.定义 缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 问题描述&#xff1a;假设线程1在查询缓存之后&#xff0c;本来应该去查询数据库&#xff0c;然后把…

8、滑动窗口-无重复字符的最长子串

解析&#xff1a; 遍历 判断map是否包含当前字符&#xff0c;如果包含&#xff1a; 获取重复的index下标在哪里获取len长度重新设置L指针,其中L指针不回退&#xff0c;也就是如果这个重复值在L前面那就忽略&#xff0c;如果是在后面那就设置为index1。 代码如下&#xff1a; …

Java初始——IDEA-web的启动

Tomcat 文件夹作用 bin 启动 关闭的脚本文件 conf 配置 lib 依赖的jar包 logs 日志 temp 临时文件 webapps 存放的网站 Maven 1.在javaweb中&#xff0c;需要使用大量的jar包&#xff0c;手动导入 2.Maven 架构管理工具 核心&#xff1a;约定大于配置 必须按照规则 web idea-we…

Day16_IDEAJavaWeb项目下在WEB-INF添加jar包导致Tomcat无法启动的问题解决记录

0 起因 自己用的是Tomcat 9.0.69&#xff0c;老师用的是Tomcat 9.0.87。本以为都是9.0.x&#xff0c;差别不会很大&#xff0c;但是老师演示的时候他没导入mysql包查询数据库的servlet就不能运行&#xff0c;而我的却可以&#xff0c;于是问了GPT&#xff0c;得到以下答复。 …

【MATLAB源码-第180期】基于matlab的PTS,SLM,CPFilter三种降低OFDM系统的PAPR仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 限幅和滤波&#xff08;Clipping and Filtering&#xff09; 原理简介 限幅和滤波是一种基础且直观的方法&#xff0c;用于降低OFDM信号的PAPR。在限幅阶段&#xff0c;信号的幅度在达到设定阈值时会被削减&#xff0c;…

开发项目接单报价快速计算,报价量化程序

定制化开发&#xff0c;如何计算项目预算&#xff0c;是程序开发者头疼的一个问题。 项目费用谈得过低&#xff0c;就天天加班累死赚不到钱&#xff1b;谈得过高&#xff0c;会导致顾客流失&#xff0c;信誉受损。 项目费用量化可见是多么重要。 下面是一段量化的程序&#…

item_search-按关键字搜索淘宝商品:如何通过获取以下关键字、搜索类型、排序方式参数提升用户体验、优化营销策略、提高转化率

在淘宝购物的过程中&#xff0c;搜索功能无疑是用户与商品之间的重要桥梁。通过输入关键字&#xff0c;用户可以迅速找到所需的商品&#xff0c;而搜索结果的准确性和相关性则直接关系到用户的购物体验和满意度。因此&#xff0c;如何通过优化关键字、搜索类型和排序方式参数&a…