C/C++壳与汇编壳的不同以及DLL壳相对于EXE壳的难点

《黑客免杀攻防学习笔记》——C++设计一个简单的壳1 本文中的代码均来自《黑客免杀攻防》,如要转载,需写明来源,请勿用于非法用途,作者对此文章中的代码造成的任何后果不负法律责任。 看了一遍书本的第11章,感觉内容确实比较高级,之前虽然自认为是热衷于搞C/C++开发,但是运用windows API的开发真的是太少了。先来看看一个简单的壳的编写。          这个加壳脱壳程序分为三部分,首先是用MFC写的界面程序,这个自然不用多说,主要功能就是 阅读详情

这个月主要是学习PE文件以及壳。革命尚未成功,先记下遇到的难点吧。C/C++壳与汇编壳的不同与DLL壳相对于EXE壳的难点看起来是不同的话题,但两者有一定的关联性,暂且放在一起吧。而且后面一个难题我还在攻克中,不能提供答案,只能让人思索。

C/C++壳与汇编壳的不同

 

很奇怪的一件事,我发现大多数壳都是汇编写的,C/C++壳很少。当然不可否认的是,壳主要是指针的操作(加壳程序还得算上文件IO),汇编相对于C/C++操纵指针起来更加得心应手。尤其是汇编可以直接操纵堆栈,由此有了两大优势:一、方便数据寻址,二、方便堆栈平衡。

 

再加上操纵PE文件有许多现成的汇编代码可供参考(罗云彬写的Windows环境下32位汇编程序设计有专门的PE文件一章),调试壳也只能用汇编(除非有人能成功使得C/C++壳的pdb调试符文件可用,这想来应该是件浩大的工程)。

 

这样算来,无怪乎大多数壳是用汇编写的了。不过能熟练用汇编写程序的人毕竟是少数,C/C++相比于其它高级语言,算得上是最接近汇编的了。对我而言,在C/C++壳基础上可以方便的重构,虽然有学好汇编的想法,但是真正学好汇编不是短期内能完成的事情。

 

(以上是个人看法,实际情况不得而知)

 

DLL壳相对于EXE壳的难点

由于C/C++壳与汇编壳的不同,C/C++程序员写起壳来比汇编程序员遇到的困难更多一些,尤其是在支持DLL加壳上。

 

我现在试图使一个现成的C/C++壳支持DLL,遇到困难如下:

一、重定位

这个问题的描述就引用Writing your packer一文中的话吧

 

Since the stub is a parasite, and since it will have to be

located in a spot at the original application's convenience,

we will have to be relocating it dynamically in the packer

application. To help with this we will make the stub with

relocation records. These are usually used for dlls when

they can't be loaded at their preferred address.

......

If you're an avid ASM coder, many things are more

straightforward since you can take care to produce

positionindependent

code.

不解释,你懂的。

 

二、堆栈平衡

引用《加密与解密》一书的话描述这个问题

 

编写加壳软件时,必须保证外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的(主要是ESP、EBP等重要的寄存器值)。加壳程序初始化时保存各寄存器的值,外壳执行完毕,再恢复各寄存器内容,最后再跳到原程序执行。

......

可以把整个外壳当作一个函数或子程序来理解,这个过程遵守堆栈平衡的原理。

我现在的问题就是执行到原程序的OEP,堆栈平衡被破坏了。大眼瞪小眼,有些不知所措的感觉。

 

三、DLL相对于EXE的特点,DLL的入口点在整个过程中至少执行两次。一次是开始时,用来对DLL做一些初始化。至少还有一次是在退出时,用来清理DLL再退出。

 

因此对于壳而言,退出时再次进入入口点,外壳跳过相关的初始化代码。

由于没有完成这方面工作,我测试加壳DLL退出时在解压缩部分报错,提示访问非法地址。

 

目前遇到以上三个难题,第一个已经解决,但是不清楚是否有副作用。也许在真正解决完这个问题的路上会碰到更多的难题也不一定。

 

初探 c/c++ 与 汇编 之间的交叉编译 命令行实现 <br />也不知道怎么了,最近想搞搞这个东西,嘿嘿,,可能觉得某些方面对速度要求不高的用c/c++就可以了且很方便,可对速度要求高的用汇编来实现也是个不错的选择。。而通常情况下,这两条都希望有,所以想到了交叉编译,当然写成DLL形式再接口调用也未尝不可,只是有时希望整合一下,嘿嘿。。。。罗嗦了吧,哈哈,下面开始吧。<br /> <br />说明:<br />1.调用约定<br />  统一采用_stdcall方式压栈,通常用于Win32 Api中,函数采用从右到左的压栈方式, <br />  自己在退出时 阅读详情

相关推荐

论用C++做壳

 1. 加壳语言.现在的壳多数都是汇编的.但本人汇编水平一般,连olly都使不好,所以只能放弃汇编.我见过delphi和VB做的壳.VB做的那个真的不错,有机会上传到这里,让大家看看.本人是C/C++的忠实用户,而且C和汇编很接近了,所以选择了C++做壳.2. 加壳原理加壳原理我想大家都很清楚,无非是wrap oep, remove reloc, 然后在最后价格stub.修改oep.话说起来轻悄,

xuplus的专栏 1305

C++实现简单加密壳

文章目录概述加壳思路加壳步骤1. 添加一个新的节区用于添加壳代码,即将dll内容复制过来2. 在dll中保存的壳代码必须保存的信息3. 处理程序的TLS4. 根据新添加的区段位置修正dll中的重定位信息 概述 类似上篇手动加壳的流程,可以使用程序实现一个加壳器,加壳步骤和手动加壳类似。这里使用C++实现一个简单的加密壳,实现以下的功能 实现源程序的区段的压缩 加密代码段 加密IAT 运行密码 简...

wojiukanxia的博客 7155

[系统安全]源码免杀、C++壳的编写

使用动态加载API的方法解决会碰到获取GetProcAddress()函数地址的问题,GetProcAddress()函数是从系统文件kernel32.dll中导出的,如果能找到kernel32.dll的加载基址,根据它的导出表就一定能找到GetProcAddress()函数的地址。通过以上代码可知,导出了一个名为A1Pack_Base()的函数,此函数的两个参数分别为需要加壳的文件路径及加壳后的程序是否弹出提示解密成功的对话框。未考虑修复类型的问题,如果要提高兼容性,应该对3种重定位类型进行区别对待。

2401_88858891的博客 976

【第53节】Windows编程必学之使用C++写exe压缩加密壳

壳是软件保护领域里的高端技术,自打出现,就一直处在安全对抗的最前线。这些年不断发展,加密壳的类型越来越多,可不管怎么变,它的核心思路始终是对PE文件做些变形处理,让软件不那么容易被分析和破解。在我的信息安全专栏中,我们试过一步步脱掉一些常见的壳,相信大家对壳已经有了比较清楚的认识。不熟悉的同学请自行关注学习我的前面的文章和信息安全专栏的文章。而在这个项目里,我们要打造一个加壳软件的框架。

攻城狮7号的博客 6382

C++写壳详解之初级篇

C++写壳详解之初级篇 之前在15PB学习,写了一个基于Windows平台对PE文件加壳的项目,经过一个月的缓冲,在这决定复习总结及分享下的我的心得。 主要工具: 010Editor、VS2017、x64dbg、LordPE、OD 实现功能: 压缩文件、对代码段加密。 一、加壳原理 要想弄明白怎么对PE文件加壳,首先需要对PE文件比较熟悉,而最快的熟悉PE文件的方法就是自己写一个PE解析工具和写壳...

qq_31507523的博客 3735

VSCode配置C/C++教程(详细、有资源)

本文详细介绍了在Windows系统下使用VS Code配置C/C++开发环境的完整流程。 VS Code的下载与安装(推荐系统安装版)、必备插件安装(汉化和C/C++扩展包)、C/C++编译过程的四个阶段解析(预处理→编译→汇编→链接)。 文章通过一个包含多文件结构的示例工程,详细说明了三个核心配置文件的用途:c_cpp_properties.json(代码智能感知)、tasks.json(编译构建)和launch.json(调试运行)。MinGW-w64和MSVC两种工具链都有介绍

cctv1324的博客 7282

DLL和EXE的区别和联系

在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!    初窥门径:Windows的基石    随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是 Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版

似水流年 2768

Virtualizer 专门针对Exe与dll的加壳 防报毒 防破解

Virtualizer 专门针对Exe与dll的加壳 防报毒 防破解 Virtualizer 专门针对Exe与dll的加壳 防报毒 防破解

EXE、DLL文件的脱壳

    这是因为文件使用了一些压缩加壳软件加密过,这就需要对文件进行解压脱壳处理后,才能汉化。这种压缩与我们平时接触的压缩工具如winzip,winrar等压缩不同,winzip压缩后的文件不能直接执行,而这种 EXE 压缩软件,EXE文件压缩后,仍可以运行。这种压缩工具把文件压缩后,会在文件开头一部分,加了一段解压代码。执行时该文件时,该代码先执行解压还原文件,不过这些都是在内存中完成的,由于

平凡的心 9986

PE加壳工具源码

添加新的区段、修改OEP、加密源代码、添加密码验证窗口、简单反调试。

【超简单】一文入门在Ubuntu系统使用GitHub

Github是基于git的代码仓库,对于开发项目的科研者或者工程师,代码仓库都是不可多得的版本控制与多端编程工具,今天这篇文章带你轻松Github入门,简单的项目本文的操作足矣。

a13337649640的博客 5236

汇编、C/C++编译过程

前言 最近安装汇编环境的时候了解到代码的执行与编译过程,对自己曾经学习过语言的编译过程无法准确的回答,借此进行一些简单的梳理。 一、汇编的编译过程 汇编作为我们能够接触到最底层的语言、低级语言,汇编语言的编译方法多是基于对于寄存器的控制,可以直接翻译成机器代码,它同样是其他高级语言的基础,高级语言如 Python、C++ 和 Java 与汇编语言的关系是一对多。比如,C++ 的一条语句就会扩展为多条汇编指令。 故汇编的编译过程较为简单。 (1)使用任意一种文本编辑器输入事先已手工编写好的汇编语言源程序.

wyz14756的博客 3235

T265摄像头插着开机后,需要重新插拔才能正常启动

T265摄像头插着开机后,需要重新插拔才能正常启动

qq_35598561的博客 1078

反汇编工具 - 将exe/dll文件转换为C代码:深度解析与实战应用

反汇编工具 - 将exe/dll文件转换为C#代码:深度解析与实战应用 【下载地址】反汇编工具-将exedll文件转换为C代码 这款开源反汇编工具能够将exe程序或dll文件高效转换为C#代码,支持未加密文件的反编译操作。它不仅适用于exe和dll文件,还能将C++代码转换为C#代码,功能强大且操作简单。只需选择目标文件...

gitblog_06770的博客 588

右腿驱动电路设计:从共模干扰原理到生物电采集实战

在生物电信号采集领域,共模干扰是影响测量精度的核心挑战之一,其本质源于环境电磁场通过容性耦合在人体表面产生的感应电流。根据欧姆定律,由于人体组织阻抗的不均衡性,共模电流会在不同测量点产生差异化的压降,从而转化为难以滤除的差分噪声。为解决这一问题,右腿驱动技术应运而生,它通过负反馈原理主动抵消干扰,显著提升系统的共模抑制比。该技术广泛应用于心电图、脑电图等医疗电子设备中,是确保微弱生理信号质量的关键环节。本文结合工程实践,深入剖析了右腿驱动电路中的仪表放大器选型、反馈环路稳定性设计以及PCB布局布线要点,为高

weixin_31476015的博客 444

Qwen-Image-2.1本地图像生成整合包:8G显存一键部署指南

文生图模型是AI视觉创作的核心技术,其本地化部署需兼顾模型能力、硬件适配与工程易用性。Qwen-Image-2.1作为支持文本生成、图像编辑与多图参考的统一架构模型,突破了传统Diffusion模型在消费级显卡上的运行瓶颈。通过AWQ量化、vLLM推理优化与ComfyUI节点重构,实现8G显存稳定运行,显著降低CUDA环境配置复杂度。该方案面向设计师、教师与普通用户,提供开箱即用的本地AI图像工作流,适用于电商主图迭代、教学配图生成与IP角色延展等真实场景,让高质量图像生成真正走出云端,落地桌面。

weixin_29082143的博客 397

反汇编工具 - 将exe/dll文件转换为C代码

反汇编工具 - 将exe/dll文件转换为C#代码 【下载地址】反汇编工具-将exedll文件转换为C代码 这款开源反汇编工具能够将exe程序或dll文件高效转换为C#代码,支持未加密文件的反编译操作。它不仅适用于exe和dll文件,还能将C++代码转换为C#代码,功能强大且操作简单。只需选择目标文件,点击“反汇编”按钮...

gitblog_06769的博客 677

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2474

C/C++ 编译调用 DLL

本文会先阐述用 C/C++ 编译 DLL 的基本问题,然后详解各种导出导入方式,给出一些例子,再说明一些需要了解的常识。以此文,致予苦于寻找却无所获的学习者,供大家交流学习。欢迎转载,但请保留本提要及文章出处,尊重原创者劳动成果。

Icy_Ybk 的博客 3489

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

【华为OD机试真题】439、精准核酸检测 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。现在给定一组确诊人品编号(X1 X2 X3.....n)在所有人当中,找出哪些人票要进行核酸检测,输出需要进行核酸检测的人数。(注意:确诊病例自身不需要再做核酸检) >  需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人   例如:A是确诊病例,A和B有接触、B和

KJ.JK 1434

源程序.cpp编译链接生成可执行文件.exe的详细过程以及动态链接库dll和静态链接库lib的区别

一、前言 .c或.cpp文件生成可执行文件.exe分为两个过程,即编译过程和链接过程。 编译是把文本形式源代码翻译为机器语言形式的目标文件的过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程。 二、编译过程 编译过程分为:预编译过程,编译过程,汇编过程。 2.1、预编译过程 读取.c或.cpp源程序,对其中的伪指令(以# 开头的指令)和特殊符号进行处...

algsup 7051

RT-DETR改进策略【Conv和Transformer】| HiLo注意力机制 通过分离处理图像的高频和低频信息,高效处理图像特征

本文记录的是利用改进检测模型,针对目标检测中面临的多尺度特征融合效率与长距离依赖建模难题,HiLo注意力模块的引入旨在通过频率解耦策略优化高分辨率特征处理,将高频细节(如目标边缘)与低频语义(如场景结构)分离建模,提升目标检测精度。Fast Vision Transformers with HiLo AttentionHiLo注意力模块的提出源于对传统自注意力机制局限性的反思。传统多头自注意力(MSA)在处理高分辨率图像时存在以下问题:HiLo将注意力模块分为高频(Hi-Fi)和低频(Lo-Fi)两个分支,

Limiiiing的博客 818

MSVC 工具链中 cl.exe 用法详解(含 DLL 生成核心命令)

摘要:MSVC工具链中的cl.exe是核心C/C++编译器,通过/LD选项可自动调用link.exe生成DLL。cl.exe负责编译源码为.obj文件,link.exe完成最终链接生成DLL和导入库.lib。主要用法包括:1) /LD自动模式一键生成DLL;2) /c手动模式分步编译链接。关键点:/LD隐含_WINDLL宏和/DLL链接参数,自动触发link.exe;DLL生成必须经过链接步骤;导入库.lib是隐式链接的必要文件。建议优先使用/LD自动模式简化开发流程。

luohaitao的专栏 1214

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

游戏外挂编程二之C/C++内联汇编代码和DLL

游戏外挂编程二之C/C++内联汇编代码和DLL 合肥程序员群:49313181。    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 上一节我讲解了CE的使用,这一节我讲解一下windows下C/C++的在以后外挂编程中会用到的知识,内联汇编和C++MFC的DLL编写。

y13156556538的博客 4182

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java 的 exe脱壳_[已解决]求教如何使用java编写加壳程序对PE文件进行加壳

202017-5-8 15:15这个问题就需要来谈谈壳的架构问题了。壳的三大架构1.最早的壳几乎都是virus演化来的,大部分都是汇编直接写的。好处就是直接可以把汇编代码复制出来当作壳的loader代码添加(感染)到程序上知名的比如aspack,upx,telock,PESpin2.随着对于反调试要求越来越高,功能越来越多,代码一多就难以维护。于是诞生了新的壳架构,功能采用DLL开发,使用load...

weixin_33375038的博客 713

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 指针、字符串与整型数据类型的转换
下一篇: 64位编程
soliddream66
博客等级 码龄19年 93粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值