c语言加花指令,花指令的应用

原标题:花指令的应用

b4b09718de6aaf04b12479f4d0a4d9a0.png

对免杀的影响是非常大的,有效地利用花指令可以使免杀工作事半功倍,甚至单凭花指令就可以达到免杀的效果。

一、花指令在免杀领域的应用

1、花指令的应用技巧

在使用之前,首先我们应该明白什么时候比较适合使用,同时还要清楚什么时候不适合。总的来说,应该在无壳的木马中应用,如果木马已经被加壳,那么我们必须要先脱壳然后再添加。不管是加壳还是加都可以看作是一种加密行为,因此一般都是先加然后再加壳。

有一点需要说明的是,添加也会增加木马被启发式扫描器发现的概率,因为常见的可能本身就包含着特征码,所以究竟什么时候加,加多少是件仁者见仁、智者见智的事情。

下面将带大家进行一次典型的花指令添加操作。首先打开Ollydbg并载入我们要加花的程序,然后找到一段空白区域写入以下花指令:

21ff313767b603384625c270b1353a65.png

首先选中空白区域并按空格键,在调出的反汇编窗口中依次写入上面的指令,然后写入jmp指令跳回到原程序入口点并将程序Dump(转储)保存,最后修改OEP。

其实除了手工添加花指令外,还有一些工具也可以实现自动加花。

2、花指令的修改技巧

既然能制作出来,那么必然也可以修改它,但是的修改是否能达到我们预期的目的,是否能修改成功呢?这就需要有一定的汇编语言基础了。

花指令首先要保证不破坏堆栈平衡,或者它只能在程序可以接受的范围内进行有目的的破坏,这样才能保证程序在加花后仍可正常运行。说到这里,或许会您对“堆栈”这个名词发悚,不用担心,带着问题看下去就会明白了。

所谓的堆栈平衡,目前可以简单地理解为不影响程序的运行结果,例如我们先执行一条push eax,也就是将eax的内容压入栈,然后再执行一条pop eax,也就是将栈顶的内容取出并传递给eax,这样一存一取,对于堆栈来说没有任何影响,也就是说这时的堆栈是平衡的。

保证堆栈平衡是的制作原则,如果要在现成的上进行修改,可以使用特征码的等值替换法来修改原有的语句,例如将add eax,-3修改为sub eax,3等,或者是添加一些自己的语句,例如添加add eax,3与sub eax,3。由此不难看出,的修改其实是很简单的。

3、空白区域寻找与加空白区段

不管是通过反汇编为程序添加功能还是使用跳转法修改特征码,又或者是添加花指令等操作,都有一个共同点,那就是需要有一块比较大的0x00区域以便于我们进行修改。

不管是OllyDbg还是WinHex,都可以非常轻松地找到一块可用的0x00区域,但是还有几点是需要大家注意的:

(1)使用WinHex等十六进制编辑软件找到0x00区域后,先要将其起始地址转换为内存地址,这样就可以在Ollydbg中找到它了,如图1所示。

993359e30a677766a98ceb548ff04740.png

图1 使用WinHex等十六进制编辑器查找0x00区域

(2)找到空白区域后不要忘记检测此区域是否可写,如果不可写的话则会导致最终保存时出现错误,从而前功尽弃。验证方法是选中将要使用的0x00区域,单击右键,在弹出的菜单中选择“复制到可执行文件”>“选择”,之后如果弹出了出错提示,则证明这段区域不可用,否则的话就是可以使用。

(3)在WinHex中也可以通过菜单栏“搜索”下的“查找十六进制数值”来搜索0x00字节,以便快速定位。

除了OllyDbg和WinHex之外,还可以利用一些工具查找空白区段,例如我们常用的PEID就有这个功能。在使用PEID打开一个程序后,单击“PE段”右侧的“>”按钮,如图2所示。

fdce42a7be2e256fd829adc94462ddbc.png

图2 打开PEID的节查看器

右击选择一个区段后,在弹出的对话框中选择“搜索全0处”,如图3所示。

198030cc62a0f866c4175f1a2483ea03.png

图3 搜索全0处

这样就可以找到如图4所示的全0x00区域信息了。

8d9045c9689d359f88df8f8d1e912c5c.png

图4 搜索结果

另外还有一款专门用于搜索0x00区域的软件CodeCaver,也叫做“PE空隙搜索器”,它可以搜索NOP与0空间,但是唯一不好的地方就是需要运行程序才能进行查找。假设我正运行着一个截图软件,打开CodeCaver后在“进程名”下拉菜单中选择“截图软件.exe”,然后单击“搜索”按钮,就会找到如图5所示的00区域信息。

9e4e4259f337182da0f60953aa30d1c5.png

图5 使用“PE空隙搜索器”搜索0x00

CodeCaver找到的0x00区域信息非常丰富,由于是直接在内存中搜索到的,所以不需要进行地址转换就可以直接在OllyDbg中应用,不过这个工具并不利于在进行木马修改时应用,因为它只能在已经运行的程序中进行寻找。

倘若利用以上的方法都无法找到合适的0x00区域又该怎么办呢?其实还可以通过加区段的方法人为地制造出一块可用的区段来。比如,可以使用ToPo这款小工具来增加所需要的区段。运行ToPo后单击“打开”按钮打开要添加区段的程序,在弹出的对话框中选择“创建一个新的区段[文件大小增加]”,然后再单击OK按钮。

接着在“增加字节”栏中填入“128”(一般情况下这里所填写的字节数最好为2的倍数),并勾选上“改变入口”,最后单击“生成”按钮,如图6所示。由图6可以看到,程序已经将128字节增加到0x0103E000这个地址的后面了。

3fdec47f486a52cbcb794ec5a277bea3.png

图6 增加字节

在这里需要说明的是,如果此处选择了“改变入口”这个选项,那程序会自动将入口点更改为软件中所提示的"0x0103E000"这个地址处,而且还会在区段结尾添加一个跳转语句跳转到程序原来的入口地址处,所以我们直接将花指令

二、花指令的高级应用

1、花指令的提取与快速应用

当我们拿到一款免杀的木马或自动添加工具时,是否想过将对方的据为己有?要是能将提取出来,那么这个以后就是我们自己的了。

如果木马程序被加了,那么往往在程序开头处的信息便是了。如图7所示就是一个通过加花工具自动添加进去的。

3555b3622a770debf2f2bb0b8d7d1f42.png

图7 一个由工具自动添加的花指令

通过这个我们可以发现它是通过压栈(push)来跳到程序的原入口点的,因此应用时只需要更改push后面的内容即可。为了方便以后的调用,我们在OllyDbg中先选中这段,然后单击右键,选择“二进制复制”,并将其粘贴到记事本中,这样就完成了的提取操作。

如果以后想应用这段,只需要复制我们保存在记事本中的信息,然后选中一块空白区域,单击右键,选择“二进制粘贴”,并将push指令部分更改为“push程序原入口地址”,最后使用peditor将入口点修改为开始的地址就行了。

这里再给大家介绍一款工具—怒剑狂花,它能够很好地支持自定义的添加。打开“怒剑狂花”后,依次选择“设置”>“自定义”,然后在弹出的窗口中单击“添加”按钮,便进入了“添加”的窗口,如图8所示。

90d7a53d7fb5c50f2a2b87ef83cf7497.png

图8 打开花指令添加窗口

在“指令名称”处填写要给取的名字,这里我填写的是"X"。下一步就是将我们刚才保存下来的代码复制进去,然后勾选“自动调整格式”,如图9所示。

ebc26571ea328e4ef697b719cd57d8ba.png

图9 添加自定义花指令

可以看到上面还有一个“跳转位置”没有填写,这是我们自定义的一个重要参数,它是用来控制应该向哪里跳转的。回到OllyDbg后,我们可以发现跳转处的的HEX数据为"68 61 63 01 01",而其上面则为"68 90 90 90 90",如图10所示。

da5e8bcd0f3b6d767cf3ac5cc4170932.png

图10 获取跳转特征信息

由此可知,在字符"68 61 63 01 01"里的"61 63 01 01"就是原程序入口地址的十六进制数据了,而其中的68代表的则是push。返回到“怒剑狂花”中,单击68后,可以看到窗口底部显示的信息为“选中的字符序号为:23”,如图11所示。

7c4c3941766af577a2c439cae0dbe42d.png

图11 查看显示序号

也就是说我们要在“跳转位置”处填写23,这样程序在添加时,当添加到23个字符后就会插入它获取的原程序入口,以保证程序可以前后连贯起来正常运行。掌握了这些,您以后就可以随意添加自己搜集到的了。

2、SEH异常的应用

SEH异常是一个比较复杂的概念,这里只介绍一下目前我们能用到的知识,以便于引领大家向更深层次迈进。

首先,静下心来读读MSDN对SHE异常给出的解释:“Windows 支持一种称为结构化异常处理的可靠的异常处理方法,此方法涉及与操作系统的协作,并且在编程语言中具有直接支持”。

“异常”是意外的或是使进程不能正常进行的事件,硬件和软件都可以检测出异常。硬件异常包括被零除和数值类型溢出。而软件异常指的是通过调用RaiseException函数检测到并发出信号通知系统的情况,以及由Windows检测到的特殊情况。

为了避免出现异常后程序崩溃,可以使用异常处理机制编写更可靠的代码,以确保资源(如内存块和文件)在发生意外终止事件时可正常关闭,还可以利用简洁的、不依靠goto语句或详细测试返回代码的结构化代码来处理具体问题(如内存不足)。

SEH异常也叫做“结构化异常处理(Structured Exception Handling)”,它其实是系统提供的一个服务,例如有时我们在执行程序时会出现一个错误提示框,请我们单击“发送报告”或“调试”或“关闭”按钮。在这之前的Windows版本也会弹出一个提示框,如果系统安装了微软的编译工具,那它就会引导你启用工具去调试程序的错误。

当系统检测到异常时,它马上会将发生异常的程序挂起,并交由系统特定的调试程序来处理,也就是说这时程序的执行流程已经转移到了系统上,而如果程序此时又运行起来的话,那么就会使程序的运行流程产生更大的迷惑性。

大家可以想象一下,假如杀毒软件正在跟踪程序的运行,而此时程序抛出了一个异常,其流程转移到了系统上,那么可想而知,杀毒软件肯定也会跟到系统里,而原程序此时就可以大摇大摆地继续完成自己的使命了。

当然,上面所举的例子并不十分准确,这里只是为了尽量使大家了解SEH异常。关于SEH异常在中的应用,暂且把它当成一个跳转使用就行了。假设我们现在有个已经加花的程序,那么只需要将的跳转替换为SEH异常代码就可以了。就以下面的SEH异常代码为例为大家演示一下。

0614f623bc1ad17dbef322b255f894ad.png

我们先使用OllyDbg打开已经加花的程序,发现程序入口处就是一段花指令,而用鼠标选中的那一行便是跳向程序真正入口的地址了,如图12所示。

f439e103e19b168c7404ffb7f6a5c43f.png

图12 找到花指令中的程序原入口地址

现在将其替换为上面的SEH异常代码,并将上面代码中的"********"改为原程序入口地址0x01016361。

最终的修改结果如图13所示,最后保存之。

ab001d306ecf538b6763ea8118a6b9f6.png

图13 修改后的情况返回搜狐,查看更多

责任编辑:

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

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

相关文章

走向统一的 .NET 旅程

这是微软第一次完全线上举办的Build大会,也是第一次完全属于开发者的大会。几乎所有的新产品都是属于开发者,开发者成为了唯一的主角。现在的微软比以往任何时候都贴近开发者,重视开发者的作用,为他们打造平台和工具。因为没有开发…

[PAT乙级]1039 到底买不买

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果…

Collecting Bugs POJ - 2096(基础概率dp+期望模板)

题意: 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n。 求他找到s个系统的bug,n种bug&#xff…

Service Mesh 高可用在企业级生产中的实践

Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播。本期为 Service Mesh Virtual Meetup#1 ,邀请了四位来自不同公司的嘉宾,从不同角度展开了 Service Mesh 的应用实践分享,分享涵盖来自陌陌和百度的 Servi…

sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...

入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验2020-12-04 16:00:21113点赞179收藏28评论创作立场声明:本文所测商品为自费购入。如参加张大妈家的活动获得,我会在文中点明。坚持独立的评价观点是笔者创作的基本底线&…

研发协同平台持续交付2.0架构演进

源宝导读:为了打通CI/CD环节,实现持续的端到端的交付能力,RDC平台提供了在线化的更新服务,随着业务量增长与场景的需要,我们对更新服务架构重新设计,实现了2.0版本。本文将介绍更新服务2.0的架构演进过程与…

[C++11]可调用对象包装器function

可调用对象包装器 std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执…

android应用窗口模式,[技巧]如何启用Android N开发者预览版中的“自由窗口”模式...

这里是Android N开发者预览版“自有窗口”模式的一些实际演示截图。对于已经参加了“Beta Program”的人们来说,通过OTA获取Android N Preview更新是最简单的。但如果你非要选择“困难模式”(命令行镜像刷新),则可能让设备无法再通过OTA的方式来安装未来…

LOOPS HDU - 3853(概率dp,期望)

题意: 有一个R*C的方格。一个人想从(1,1)走到(r,c)。在每个格子都有三种选择,向下,向右,或者原地不动。每个格子里的每个选择都有一定的概率。而每次移动都需要消耗2点的能量,问期望…

Sql Server之旅——第四站 你必须知道的非聚集索引扫描

非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了。。。这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一分析,或许…

[C++11]可调用对象绑定器

std::bind用来将可调用对象与其参数一起进行绑定。绑定后的结果可以使用std::function进行保存,并延迟调用到任何我们需要的时候。通俗来说,它主要有两个作用: 1.将可调用对象与其参数一起绑定成一个仿函数。 2.将多元(参数个数为n,n > …

电视android已停止运行是什么意思,智能电视提示应用停止运行怎么办?当贝市场三招解决...

智能电视提示应用停止运行怎么办?当贝市场三招解决2019年11月28日 17:53作者:网络编辑:王动分享智能电视使用久了之后,电视页面会提示我们应用停止运行,这是怎么回事?当贝小编针对这个问题,整理了一份解决教程,大家可以看看有没有什么帮助。…

重磅!2020年微软开发者大会落幕,.NET迎来新机遇!

两天前微软举行了首个线上Build大会,而开发者成为大会里唯一的主角。和所有技术公司一样,开发者对于微软来说,同样也越来越重要了。如同血肉相依的关系,谁也离不开谁。在这次大会上,开发者是最大的宠儿,成了…

番茄时间有感之关于在疫情期间我与ACM不得不说的故事

哼哼~首先声明,我不是来讲故事的,我来总结一下在疫情这段时间,在ACM训练过程中的自我情况的总结和反思,嘻嘻,我是一个标题党,如果是被标题骗进来哒,抱歉啦,有句话说的好,…

基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查

上一篇文章我们用Code-First的方式创建了博客所需的实体类&#xff0c;生成了数据库表&#xff0c;完成了对EF Core的封装。本篇说一下自定义仓储的实现方式&#xff0c;其实在abp框架中已经默认给我们实现了默认的通用(泛型)仓储&#xff0c;IRepository<TEntity, TKey>…

计算机操作系统第四章作业

计算机操作系统第四章作业 1.何为静态链接&#xff1f;静态链接时需要解决两个什么问题? 答&#xff1a;静态链接是指在程序运行之前&#xff0c;先将各自目标模块及它们所需的库函数&#xff0c;链接成一个完整的装入模块&#xff0c;以后不再拆开的链接方式。   将几个目…

走进WebApiClientCore的设计

WebApiClientWebApiClient是NCC开源社区的一个项目&#xff0c;是目前微服务里http接口调用的一把锋利尖刀&#xff0c;项目早期设计与开发的时候&#xff0c;是基于.netframework的&#xff0c;然后慢慢加入netstandard和netcoreapp多个框架的支持&#xff0c;设计能力出众&am…

Blazor WebAssembly 3.2 正式发布

5月 20日&#xff0c;微软 发布了 Blazor WebAssembly 3.2(https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-now-available/) 。Blazor 是 ASP.NET Core 中的一个新框架&#xff0c;支持使用 C#和 HTML 创建交互式 Web 应用程序。Blazor WebAssembly 使用基于…

温故知新:Docker基础知识知多少?

【云原生】| 作者/Edison Zhou这是恰童鞋骚年的第233篇原创文章记得之前曾经粗略的写过一篇Docker的基础及ASP.NET Core部署Docker示例的入门文章&#xff0c;但那个时候刚刚学习对Docker的认知还比较浅&#xff0c;现在重新来温故知新一下。本文预计阅读时间为10min。1容器的用…

[C++11]lambda表达式语法

代码如下: #include <iostream> using namespace std;void func(int x, int y) {int a;int b;[]() {int c a;//使用了外部变量&#xff0c;[]里面加个 int d x;}; }int main() {return 0; }lambda表达式的注意事项: 以上图片来自下面链接: https://subingwen.cn/cpp…