安装包逆向1

1.找到程序的入口点

在IDA中我们看到函数非常多,但是一般都是有主要的入口的,所以找一下有没有主函数
可以直接
Ctr+F直接查找
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CNsInstaller::CNsInstaller

这里搞半天在获取文件路径
在这里插入图片描述

CNsInstaller::StartInstall

在这里插入图片描述
在这里插入图片描述

CNsInstaller::InstallFunc
char __thiscall CNsInstaller::InstallFunc(CNsInstaller *this)
{const wchar_t *v2; // eaxCNsInstaller *v3; // ecxconst WCHAR *v4; // eax__int64 v5; // raxconst wchar_t *v6; // eaxCNsInstaller *v7; // edxconst WCHAR *v8; // eaxstruct CNsApp *v9; // eaxCNsApp *v10; // eaxconst WCHAR *v11; // eaxchar *v12; // [esp-24h] [ebp-A58h]char *v13; // [esp-20h] [ebp-A54h]int Offset; // [esp+28h] [ebp-A0Ch] BYREFint v15; // [esp+2Ch] [ebp-A08h] BYREFint v16; // [esp+30h] [ebp-A04h] BYREFint Buff; // [esp+34h] [ebp-A00h]int v18; // [esp+38h] [ebp-9FCh] BYREFchar v19[4]; // [esp+3Ch] [ebp-9F8h] BYREFchar v20[5]; // [esp+40h] [ebp-9F4h] BYREFchar v21; // [esp+45h] [ebp-9EFh]char v22; // [esp+46h] [ebp-9EEh]char v23; // [esp+47h] [ebp-9EDh]FILE *Stream; // [esp+48h] [ebp-9ECh]CNsInstaller *v25; // [esp+4Ch] [ebp-9E8h]LONG dwNewLong[297]; // [esp+50h] [ebp-9E4h] BYREFWCHAR Buffer[202]; // [esp+4F4h] [ebp-540h] BYREFWCHAR String1[202]; // [esp+688h] [ebp-3ACh] BYREFWCHAR Filename[260]; // [esp+81Ch] [ebp-218h] BYREFint v30; // [esp+A30h] [ebp-4h]v25 = this;memset(Filename, 0, sizeof(Filename));GetModuleFileNameW(0, Filename, 0x104u); 用于获取当前进程已加载模块的文件路径*((_QWORD *)v25 + 2) = FileSize(Filename);Buff = NsResGetBuff(0x1F41u, L"BIN", &Offset);这里也很重要,从获取buff点进去看尝试从资源中检索包含安装数据的缓冲区,该资源由 "BIN" 和 ID 0x1F41 标识if ( !Buff ){memset((char *)v25 + 36, 0, 0x15C8u);return 0;}Stream = _wfopen(Filename, L"rb");if ( !Stream )return 0;fseek(Stream, Offset, 0);memset((char *)v25 + 36, 0, 0x15C8u);fread((char *)v25 + 36, 0x15C8u, 1u, Stream);将文件的前 4096 字节 (0x15C8) 读入 CNsInstaller 对象中的缓冲区CNsInstaller::InitPath(v25, (CNsInstaller *)((char *)v25 + 36));DoReport(L"http://hofosoft.cn/api/report.asp", L"install", (LPCWSTR)v25 + 18);这里看到火凤一个网站CNsInstaller::CheckValid(v25);CNsInstaller::InstallComponent(v25);v2 = (const wchar_t *)Json::StaticString::c_str((CNsInstaller *)((char *)v25 + 5808));使用 Json::StaticString::c_str 从安装数据缓冲区中提取文件路径。CNsInstaller::CheckDir(v25, v2, &word_11FBED4);使用 CNsInstaller::CheckDir 检查目录是否存在v15 = 0;Buff = NsResGetBuff(0x1F5Bu, L"BIN", &v15);检索包含安装数据的另一个缓冲区 (ID 0x1F5B)if ( Buff && v15 ){v3 = v25;*((_DWORD *)v25 + 4) = 0;*((_DWORD *)v3 + 5) = 0;memset(String1, 0, sizeof(String1));fread(String1, 0x194u, 1u, Stream);CNsInstaller::ExtractFile(v25, String1, Stream);使用 CNsInstaller::ExtractFile 从可执行文件中提取文件memset(String1, 0, sizeof(String1));fread(String1, 0x194u, 1u, Stream);if ( lstrcmpW(String1, L"SPLIT") || *(_DWORD *)&String1[200] )检查文件名是否为 "SPLIT" 以及偏移量 200 处是否存在特定值return 0;fclose(Stream);sub_11396A0(Filename);v30 = 0;sub_113D410(v20);sub_113D470((wchar_t *)L".exe", L".hf");v4 = (const WCHAR *)Json::StaticString::c_str((Json::StaticString *)v20);获取新文件的大小并将其存储在 CNsInstaller 对象中v5 = FileSize(v4);*((_QWORD *)v25 + 2) = v5;*((_QWORD *)v25 + 3) = 0i64;计算可执行文件的剩余大小以进行进一步处理v6 = (const wchar_t *)Json::StaticString::c_str((Json::StaticString *)v20);Stream = _wfopen(v6, L"rb");//这里对文件进行读写的操作if ( !Stream ){v23 = 0;v30 = -1;sub_1139680(v20);return v23;}v30 = -1;sub_1139680(v20);}else{*((_QWORD *)v25 + 2) -= Offset;v7 = v25;*((_DWORD *)v25 + 6) = 5576;*((_DWORD *)v7 + 7) = 0;}if ( *((__int64 *)v25 + 2) >= 419430400 ){if ( *((__int64 *)v25 + 2) >= 0x100000000i64 )*((_DWORD *)v25 + 8) = 2;else*((_DWORD *)v25 + 8) = 1;}else{*((_DWORD *)v25 + 8) = 0;}while ( !feof(Stream) ){if ( *((_BYTE *)v25 + 8) )return 0;memset(Buffer, 0, sizeof(Buffer));fread(Buffer, 0x194u, 1u, Stream);if ( !lstrcmpW(Buffer, &off_11FBF4C) && !*(_DWORD *)&Buffer[200] )检查缓冲区内容是否指示安装数据部分的结尾break;if ( *(_DWORD *)&Buffer[200] == -1 ){CNsInstaller::CheckDir(v25, Buffer, 0);}else{*((_QWORD *)v25 + 3) += 404i64;if ( !CNsInstaller::ExtractFile(v25, Buffer, Stream) )break;}}fclose(Stream);sub_11397C0(&v18);v30 = 1;sub_1139D70((int)&v18, (wchar_t *)L"%s\\%s", *((_DWORD *)v25 + 1452));v8 = (const WCHAR *)Json::StaticString::c_str((Json::StaticString *)&v18);if ( PathFileExistsW(v8) ){if ( *((_BYTE *)v25 + 5816) ){sub_11397C0(&v16);LOBYTE(v30) = 4;sub_1139D70((int)&v16, (wchar_t *)L"%s\\%s", *((_DWORD *)v25 + 1452));v11 = (const WCHAR *)Json::StaticString::c_str((Json::StaticString *)&v16);DeleteFileW(v11);LOBYTE(v30) = 1;sub_1139680(&v16);}else{CNsInstaller::WriteReg(v25, (CNsInstaller *)((char *)v25 + 36));CNsInstaller::CreateShortcuts(v25, (CNsInstaller *)((char *)v25 + 36));CNsInstaller::CreateUninstallCfg(v25, (CNsInstaller *)((char *)v25 + 36));}CNsInstaller::ExecScript(v25, (const wchar_t *)v25 + 1868);CNsInstaller::ImportReg(v25);SendMessageW(*(HWND *)v25, 0x7E9u, 0x2710u, 0);v21 = 1;v30 = -1;sub_1139680(&v18);return v21;}else{sub_11397C0(v19);LOBYTE(v30) = 2;if ( isEnglish() )sub_11395C0(v19, L"Installation failed, does not have write permission!");elsesub_11395C0(v19, &unk_11FBFD8);sub_113DBE0();LOBYTE(v30) = 3;v13 = (char *)CNsApp::Instance() + 530;v12 = (char *)Json::StaticString::c_str((Json::StaticString *)v19);v9 = CNsApp::Instance();sub_113E350((LONG)dwNewLong, *((_DWORD *)v9 + 1), v12, v13, 0, 6, 300, 160, 8, 9, 1);v10 = CNsApp::Instance();CNsApp::ExitApp(v10);v22 = 0;LOBYTE(v30) = 2;sub_113DE10(dwNewLong);LOBYTE(v30) = 1;sub_1139680(v19);v30 = -1;sub_1139680(&v18);return v22;}
}

在这里插入图片描述

NsResGetBuff

在这里插入图片描述

CNsInstaller::InstallComponent‘

看名字安装原件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CNsInstaller::GetSetupInfo

在这里插入图片描述
下一步:通过自己的代码,把内嵌文件名,大小,文件内容还原出来就行
后续继续

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

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

相关文章

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

Spring 面试题及答案整理,最新面试题

Spring框架中的Bean生命周期是什么? Spring框架中的Bean生命周期包含以下关键步骤: 1、实例化Bean: 首先创建Bean的实例。 2、设置属性值: Spring框架通过反射机制注入属性。 3、调用BeanNameAware的setBeanName()&#xff1a…

某电信公司组织结构优化咨询项目成功案例纪实

——构建前后端组织结构,提升组织运营效率 随着企业的不断发展,行业的竞争也越来越激烈,企业只能不断调整自身的战略才能更好的适应这样的大环境。在战略调整的过程中,企业往往会面临这样的问题:管理层的经营理念各不…

哪些订单预计会亏?一张报表告诉你

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 销售订单一般是企业在销售活动中重要的单据,当我们接到一个客户的订单时,就需要在系统中录入一个销售订…

STM32 | STM32F407ZE中断、按键、灯(续第三天)

上节回顾 STM32 | 库函数与寄存器开发区别及LED等和按键源码(第三天)一、 中断 中断概念 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行(面试题)。 STM32外部中断…

智慧城市大模型来啦!港大百度推出UrbanGPT

论文作者解读链接:https://blog.csdn.net/qq_42715656/article/details/136681839 项目链接:https://urban-gpt.github.io/ 代码链接:https://github.com/HKUDS/UrbanGPT 论文链接:https://arxiv.org/abs/2403.00813 研究实验室链…

编曲制作软件Fruity Loops Studio 21 中文版及新如何选择适合FL Studio 版本

如果你有着满腔的音乐才华,想要自己在家里发片吗?还是听 MOBY 的电子舞曲不过瘾,要再帮他做做 REMIX?有朋友会说,我不懂乐理,不懂五线谱,怎么制作音乐?这话说得很好,说到…

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。 代码如下: public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空,返回null&#xff0c…

Apache Paimon系列之:认识Paimon

Apache Paimon系列之:认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构: 如上架构所示: 读/写:Paimon 支持多种读/写数据和…

4、设计模式之建造者模式(Builder)

一、什么是建造者模式 建造者模式是一种创建型设计模式,也叫生成器模式。 定义:封装一个复杂对象构造过程,并允许按步骤构造。 解释:就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单对象组合起来…

使用 ReclaiMe Pro 进行 RAIDZ 数据恢复

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ZFS 是一个开源文件系统,主要用于 FreeNAS 和 NAS4Free 存储系统。在开发 ZFS 时,主要目标是可靠性,这是通过写时复制、冗余元数据、日志等不同功能来实现的。ZFS 使用自…

修改表结构

目录 修改表结构 创建数据表插入数据 修改已有列 修改 member 表的 name 列的定义 为表增加列 增加一个 address 列,这个列上不设置默认值 增加一个 sex 列,这个列上设置默认值 删除表中的列 删除 sex 列 Oracle从入门到总裁:​​​​​​https…

SpringSecurity两种验证方式及调用流程

一、HttpBasic方式 <security:http-basic/> 二、Formlogin方式 <security:form-login login-page"/userLogin" /> 三、SpringSecurity执行流程

【LeetCode】升级打怪之路 Day 18:二叉树题型 —— 树的深度、高度、路经

今日题目&#xff1a; 104. 二叉树的最大深度111. 二叉树的最小深度110. 平衡二叉树257. 二叉树的所有路径112. 路径总和 目录 Problem 1&#xff1a;树的深度LC 104. 二叉树的最大深度 【easy】LC 111. 二叉树的最小深度 【易错】 Problem 2&#xff1a;树的高度LC 110. 平衡二…

工具推荐:有哪些工具可以搭建本地知识库?

大家是否心头藏着一个个的记录本&#xff0c;里面写满了工作日常、业务过程、个人想法等等&#xff0c;但是随着这个记录本日渐丰满&#xff0c;寻找特定信息的难度也在逐渐增大。如果有一个空间&#xff0c;既像你的记录本一样方便记录&#xff0c;又可以快速检索&#xff0c;…

19113133262(微信同号)2024年环境能源与全球市场营销国际学术会议(ICEEGM 2024)

2024年环境能源与全球市场营销国际学术会议&#xff08;ICEEGM 2024) 会议主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 节能技术 煤矿工程与技术 能源存储技术 可再生能源 热能与动力工程 能源工程与环境工程 可再生能源技术和系统 能源安全和清洁利用 矿…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]返回数据格式&#xff0c;默认为jsonl…

springboot的maven多模块如何混淆jar包

springboot的maven多模块如何混淆jar包 一.简介二. 示例2.1 基本配置2.2 结果 三. 错误3.1 错误13.2 错误2 四. 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.简介 …

[Linux][CentOs][Mysql]基于Linux-CentOs7.9系统安装并配置开机自启Mysql-8.0.28数据库

目录 一、准备工作&#xff1a;获取安装包和相应工具 &#xff08;一&#xff09;所需安装包 &#xff08;二&#xff09;安装包下载链接 &#xff08;三&#xff09;在服务器上创建文件夹并上传安装包 二、安装MySql &#xff08;一&#xff09;删除系统自带的mariadb …

华为三层交换机:ACL的基本实验

实验要求&#xff1a; PC1不允许访问PC3&#xff0c;PC3可以访问PC1 分析问题&#xff1a; PC1不允许访问PC3&#xff0c;问题中含有“目标地址”则我们需要设置目标地址&#xff0c;这样基本ACL是不行的&#xff0c;必须使用高级ACL [sw1]acl ? INTEGER<2000-2999>…