当前位置: 首页 > news >正文

2.13 PE结构:实现PE代码段加密

代码加密功能的实现原理,首先通过创建一个新的.hack区段,并对该区段进行初始化,接着我们向此区段内写入一段具有动态解密功能的ShellCode汇编指令集,并将程序入口地址修正为ShellCode地址位置处,当解密功能被运行后则可释放加密的.text节,此时再通过一个JMP指令跳转到原始OEP位置,则可继续执行解密后的区段。

如下是一段异或解密功能实现,用于实现循环0x88异或解密代码功能;

00408001  MOV EAX, main.00401000        (代码段首地址)
00408006  XOR BYTE PTR DS : [EAX], 88   (与0x88异或)
00408009  INC EAX
0040800A  CMP EAX, main.00404B46        (代码段结束位置)
0040800F  JNZ SHORT main.00408006       (写入原始OEP)
00408011  POPAD
00408012  MOV EAX, main.00401041        (写入新OEP)
00408017  JMP EAX

有了上述加密流程,则下一步就是对内部的变量进行填充,我们可以提取出这些汇编指令的机器码并存储到Code[]数组内,通过对数组中的特定位置进行替换来完善跳转功能,此处我们需要提取如下几个位置的特征字段;

  • 00408001 数组下标第2位替换为ImageBase + pSection->VirtualAddress
  • 0040800A 数组下标第11位替换为ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize
  • 0040800F 数组下标第19位替换为ImageBase + BaseRVA
  • 00408012 原始OEP位置替换为pSection->VirtualAddress

根据上述流程我们可以编写一个AddPacking函数,该函数通过传入一个待加密程序路径,则可将一段解密代码Code[]写入到程序节表中的最后一个节.hack所在内存空间,并动态修正当前入口地址为.hack节的首地址,最终执行解密后自动跳转回原始OEP位置执行功能,如下代码所示;

// 对文件执行加壳操作
void AddPacking(LPSTR szFileName)
{// 打开文件HANDLE hFile = CreateFileA(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);// 创建文件映射HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, 0);HANDLE lpBase = MapViewOfFile(hMap, FILE_MAP_READ | FILE_SHARE_WRITE, 0, 0, 0);// 找到PE文件头PIMAGE_DOS_HEADER DosHdr = (PIMAGE_DOS_HEADER)lpBase;PIMAGE_NT_HEADERS NtHdr = (PIMAGE_NT_HEADERS)((DWORD)lpBase + DosHdr->e_lfanew);DWORD ImageBase = NtHdr->OptionalHeader.ImageBase;DWORD BaseRVA = NtHdr->OptionalHeader.AddressOfEntryPoint;PIMAGE_FILE_HEADER FileHdr = &NtHdr->FileHeader;PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(NtHdr);// 首先得到最后一个节的指针,然后找到里面的虚拟偏移值,填入到程序OEP位置即可。DWORD SectionNum = FileHdr->NumberOfSections;char Code[] ={"\x60""\xb8\x00\x00\x00\x00""\x80\x30\x88""\x40""\x3d\xff\x4f\x40\x00""\x75\xf5""\x61""\xb8\x00\x00\x00\x00""\xff\xe0"};DWORD dwWrite = 0;// 写入代码节开始位置*(DWORD *)&Code[2] = ImageBase + pSection->VirtualAddress;printf("[+] 写入代码节开始位置: 0x%08X \n", ImageBase + pSection->VirtualAddress);// 写入代码节终止位置*(DWORD *)&Code[11] = ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize;printf("[+] 写入代码节结束位置:0x%08X \n", ImageBase + pSection->VirtualAddress + pSection->Misc.VirtualSize);// 写入原来的的OEP位置*(DWORD *)&Code[19] = ImageBase + BaseRVA;printf("[+] 写入原始OEP 0x%08X \n", ImageBase + BaseRVA);// 拿到最后一个节的文件偏移pSection = pSection + (SectionNum - 1);printf("[+] 得到最后一个节的实际地址: 0x%08X \n", pSection->PointerToRawData);// 设置指针到最后一个节文件偏移位置SetFilePointer(hFile, pSection->PointerToRawData, 0, FILE_BEGIN);WriteFile(hFile, (LPVOID)Code, sizeof(Code), &dwWrite, NULL);FlushViewOfFile(lpBase, 0);// 修正当前入口点地址printf("[+] 修正入口点地址为: 0x%08X \n", pSection->VirtualAddress);*(DWORD *)&NtHdr->OptionalHeader.AddressOfEntryPoint = pSection->VirtualAddress;UnmapViewOfFile(lpBase);
}

读者可自行运行上述代码片段,传入d://lyshark.exe对该程序中的.text节进行解密,运行后读者可打开x64dbg调试器,观察入口地址处的变化,此时入口地址已经跳转到.hack节内,此节中的汇编指令则用于对.text代码节进行解密操作,当解密结束后则会跳转到原始地址0x45C865位置处,如下图所示;

当加密功能写入后,则接下来就可以对.text代码节进行加密了,加密的实现也非常容易,如下函数,通过定位到第一个节,并通过ReadFile函数将这个节读入内存,通过循环对这个区域进行加密,最后调用WriteFile函数再将加密后的数据回写到代码节,此时加密功能就实现了,如下所示;

// 将特定的节进行加密,此处只加密Text节
void EncrySection(LPSTR szFileName, DWORD Key)
{// 打开文件HANDLE hFile = CreateFileA(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);// 创建文件映射HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, 0);HANDLE lpBase = MapViewOfFile(hMap, FILE_MAP_READ | FILE_SHARE_WRITE, 0, 0, 0);// 定位PE文件节PIMAGE_DOS_HEADER DosHdr = (PIMAGE_DOS_HEADER)lpBase;PIMAGE_NT_HEADERS NtHdr = (PIMAGE_NT_HEADERS)((DWORD)lpBase + DosHdr->e_lfanew);PIMAGE_FILE_HEADER FileHdr = &NtHdr->FileHeader;PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(NtHdr);printf("[-] 节虚拟地址: 0x%08X 虚拟大小: 0x%08X\n", pSection->VirtualAddress, pSection->Misc.VirtualSize);printf("[-] 读入FOA基地址: 0x%08X 节表长度: 0x%08X \n", pSection->PointerToRawData, pSection->SizeOfRawData);printf("[-] 已对 %s 节 --> XOR加密/解密 --> XOR密钥: %d \n\n", pSection->Name, Key);// 分配内存空间DWORD dwRead = 0;PBYTE pByte = (PBYTE)malloc(pSection->SizeOfRawData);SetFilePointer(hFile, pSection->PointerToRawData, 0, FILE_BEGIN);memset(pByte, 0, pSection->SizeOfRawData);ReadFile(hFile, pByte, pSection->SizeOfRawData, &dwRead, NULL);// 对代码节加密for (int x = 0; x < pSection->SizeOfRawData; x++){pByte[x] ^= Key;}// 写出加密后的数据SetFilePointer(hFile, pSection->PointerToRawData, 0, FILE_BEGIN);WriteFile(hFile, pByte, pSection->SizeOfRawData, 0, FILE_BEGIN);pSection->Characteristics = 0xE0000020;free(pByte);FlushViewOfFile(lpBase, 0);UnmapViewOfFile(lpBase);
}

读者通过AddPacking函数对文件加壳后,接着就可以调用EncrySection函数对目标程序进行异或处理,此处分别传入d://lyshark.exe路径,以及一个加密密钥0x88,等待加密结束即可,此时运行程序即可实现对代码段的解密运行,这样也就起到了保护了代码段的作用,如下是解密之前的代码段;

当解密后,代码段将会被展开,并输出如下图所示的样子,此时程序即可被正确执行;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/5912e71.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章:

2.13 PE结构:实现PE代码段加密

代码加密功能的实现原理&#xff0c;首先通过创建一个新的.hack区段&#xff0c;并对该区段进行初始化&#xff0c;接着我们向此区段内写入一段具有动态解密功能的ShellCode汇编指令集&#xff0c;并将程序入口地址修正为ShellCode地址位置处&#xff0c;当解密功能被运行后则可…...

Rust更换Cargo国内源,镜像了寂寞

换皮不换身 换了国内源&#xff0c;构建时该卡还会卡。因为它所谓的换源&#xff0c;只是更换crates.io“索引”的源&#xff0c;而不是package“内容”的源。换了国内源后&#xff0c;在国内编译时访问 crates.io-index 自然会快很多&#xff0c;可是crates.io-index里面的信…...

【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入

目录 0x00 前言&#xff1a; 0x02 解决&#xff1a; 0x00 前言&#xff1a; 本篇博文可能会有一点点的超级呆 0x02 解决&#xff1a; 你是不是也会想&#xff1a; 使用pyrhon将指定文件夹位置里面的1.txt中数据全部删除以后---->然后再将参数req_text的值写入到1.txt …...

ESP32蓝牙实例-BLE服务器与客户端通信

BLE服务器与客户端通信 文章目录 BLE服务器与客户端通信1、软件准备2、硬件准备3、代码实现3.1 BLE服务器实现3.2 Android手机测试BLE服务器3.3 ESP32 BLE客户端在本文中,我们将介绍如何使用低功耗蓝牙在两个 ESP32 开发板之间执行 BLE 服务器客户端通信。 换句话说,将介绍如…...

第11章_瑞萨MCU零基础入门系列教程之SysTick

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

【面试题精讲】如何使用Stream的聚合功能

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 求和&#xff08;Sum&#xff09;&#xff1a; List<Integer> numbers Arrays.asList(1, 2, 3, 4, 5);int sum n…...

Linux 中的 chmod 命令及示例

在 Unix 操作系统中,chmod命令用于更改文件的访问模式。该名称是change mode的缩写。其中规定每个文件和目录都有一组权限来控制权限,例如谁可以读取、写入或执行该文件。其中权限分为三类:同时读、写和执行,用“r”、“w”和“x”表示。这些字母组合在一起形成一组用户的特…...

sannaing i14 pro max使用体验

体验了一把山寨机&#xff0c;不明真相的人会以为这是三星的英文标志&#xff0c;又是pro又是max的&#xff0c;价格600&#xff0c;进系统去看了配置&#xff0c;cpu写的是snapdragon 888&#xff0c;运存12g&#xff0c;内存500g。下了个安兔兔也是被忽悠了&#xff0c;它也以…...

Shazam音乐检索算法原理及实现

算法基本流程如下&#xff1a; 1. 采集音乐库 2. 音乐指纹采集 3. 采用局部最大值作为特征点 4. 将临近的特征点进行组合形成特征点对 5. 对每个特征点对进行hash编码 编码过程&#xff1a;将f1和f2进行10bit量化&#xff0c;其余bit用来存储时间偏移合集形成32bit的hash码 …...

vue递归组件

父组件&#xff1a; <template><div><treeVue :treeData"treeData"></treeVue></div> </template><script setup lang"ts"> import { reactive } from "vue"; import treeVue from "./tree.vue…...

软件测试/测试开发丨测试用例自动录入 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27139 测试用例自动录入 测试用例自动录入的价值 省略人工同步的步骤&#xff0c;节省时间 兼容代码版本的自动化测试用例 用例的执行与调度统一化管理…...

来学Python啦,大话字符串

To be a happy man&#xff0c; reading&#xff0c; travel&#xff0c; hard work&#xff0c; care for the body and mind。做一个幸福的人&#xff0c;读书&#xff0c;旅行&#xff0c;努力工作&#xff0c;关心身体和心境。 前面我们讲解过关于用Python写温度转换器&…...

pyqt5设置背景图片

PyQt5设置背景图片 1、打开QTDesigner 创建一个UI&#xff0c;camera.ui。 2、创建一个pictures.qrc文件 在ui文件同级目录下先创建一个pictures.txt&#xff0c;填写内容&#xff1a; <RCC><qresource prefix"media"><file>1.jpg</file>…...

C# WPF 自己写的一个模拟病毒传播的程序,有可视化

源代码: https://github.com/t39q/VirusSpread 主要代码 using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace VirusSpread.Bu…...

stable diffusion实践操作-大模型介绍-SDXL1大模型

系列文章目录 大家移步下面链接中&#xff0c;里面详细介绍了stable diffusion的原理&#xff0c;操作等&#xff08;本文只是下面系列文章的一个写作模板&#xff09;。 stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生…...

软考高级系统架构设计师系列案例考点专题四:嵌入式系统

软考高级系统架构设计师系列案例考点专题四:嵌入式系统 一、相关概念二、软件可靠性和硬件可靠性的区别三、可靠性指标四、可靠性设计五、冗余技术六、软件容错七、双机容错技术八、集群技术九、负载均衡十、可维护性的评价指标十一、软件维护的分类嵌入式每年必考一题,但是属…...

Django Form实现表单使用及应用场景

首先需要定义一个使用场景&#xff1a; 音乐网站的前端部分可以添加上传歌手的单曲&#xff0c; 这个添加页面就使用django form表单来实现。 目录 数据表内容 歌手表及表模型 单曲表及表模型 演示表单使用 设置路由 创建form.py 视图实例化表单类 模板使用表单对象 表…...

golang面试题:json包变量不加tag会怎么样?

问题 json包里使用的时候&#xff0c;结构体里的变量不加tag能不能正常转成json里的字段&#xff1f; 怎么答 如果变量首字母小写&#xff0c;则为private。无论如何不能转&#xff0c;因为取不到反射信息。如果变量首字母大写&#xff0c;则为public。 不加tag&#xff0c…...

国内项目管理中级证书CSPM-3正在报名!

CSPM-3中级项目管理专业人员认证&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…...

vue表格不显示列号123456

我在网上找了半天&#xff0c;都是如何添加列号123456的&#xff0c;没有找到不显示列号的参考&#xff0c;现在把这个解决了&#xff0c;特此记录一下。 没有加右边的就会显示&#xff0c;加上右边的就隐藏了...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...