二进制与免杀

前言

        各位小伙伴大家好,我又回来了,不知大家的新年过得可还快乐,一转眼又要迎来元宵佳节,作者在这里提前祝大家元宵节快乐。

        这篇文章呢,是完成上篇文章对大家的承诺,来讲解一下二进制方面的知识,二进制层面对于我们安全人员来讲最重要的一个作用就是免杀了,因此这里将其与免杀结合进行讲解,话不多说我们直接开始。

1.二进制

1.1什么是二进制

        顾名思义,二进制就是0和1,它与十进制0-9一样,就是数据的一种表现形式,因为计算机底层采用了二进制作为一切的根本,这才赋予了它特殊的意义,这就好比我们日常习惯中的数学都是使用十进制来进行计算,因此十进制对于我们一般人来讲,就有了特殊的意义。

1.2计算机底层如何实现二进制

        二进制最明显的特征就是其有两种状态,即0和1,那么我们只要能够在物理层面设计出一个能够表示两种状态的设备,就可以完成对二进制的表示。因此我们现代的计算机就通过高低电平来表示这两种状态,以此计算机中我们日常使用的各式各样的复杂功能的根源就被定下了基调(就好比细胞之于生物,生物形态千奇百怪,但是追其根源都是由细胞组成)。

        吐槽:我时常会想,在计算机没有诞生之前,这个行业的开创者更应该是个生物学家才合理。

        主存和辅存(即内存和磁盘)是我们大众耳熟能详的名字,我们计算机的内存就是通过高低电平的方式表示二进制的两种状态,而磁盘则采用磁场切割磁感线的两种方式来表示二进制的两种状态。高低电平表示的二进制有一个缺陷,就是每过一定时间就需要为其充一次电,否则数据就会随着电流的流失而消失,这也是为什么我们内存中的数据会随着计算机的重启(断电)而丢失的原因(比如你没来得及保存的文档,就是因为它们临时存储在内存中,还没有写入硬盘所导致)。而对于磁盘来说,其依托于磁场,并不受到电流的影响,因此可以长期存储。(对于更底层的细节,感兴趣的小伙伴可以去学习一下计算机组成原理中的栅极电容和双稳态触发器)

1.3芯片(CPU)架构

        讲到这里想必大家对二进制已经有了一个基本的认识,那么我们平时的代码是如何和二进制产生联系的呢?这就是由架构规定的指令集来实现。

        想必有小伙伴疑惑什么是架构,我们日常耳熟能详的架构有两种:x86架构(Intel公司研发)和ARM架构(苹果公司研发)。我们最常用的Windows系统和Linux系统就是基于x86架构进行设计的(这也是我们买的Windows系统电脑的处理器总是Intel的原因),而苹果系统则是根据ARM架构进行设计的。我们知道计算机最底层就是由CPU(这货就是我们国内被卡了很久脖子的芯片,也是计算机的核心部件之一)对无数个0和1的门电路进行操作,而架构的指令集就规定了我们的编程语言应该转换成怎样的二进制形式。

1.3程序的前世今生

        相信很多小伙伴看到这里已经有点似懂非懂了,计算机本身就是十分抽象的,理解不了也没关系,作者这里通过一个例子带你理解我们写出来的一个程序的一生。

1.3.1理论说明

       以qq为例,程序最初是由我们的程序员使用一门或多门编程语言编写成为一个个代码文件,然后他们使用对应编程语言的编译器对代码进行编译,就成为我们可以直接使用可执行文件(也就成为了我们日常使用的qq),我们只需要双击就可以打开并使用qq的功能。抛开细节不谈,其实这一过程所做的工作就是将我们的代码转换为二进制指令,使得其能在硬件层面被cpu执行。

        这也很好的解释了我们电脑上的qq为什么不能以记事本的形式打开,即便强行读取也是乱码的原因,因为他们当中存放的是二进制指令,并不是文本数据,因此它们并不遵守Unicode编码,自然也就无法识别。

1.3.2实例说明

        这里还是以做饭为例,假设我们人就是计算机,程序员编写代码的过程,就可以看作我们将一个个菜洗好切好的过程;编程语言的编译器就好比我们的自动煮饭煲,它会帮助我们把我们加进去的菜进行烹饪。烹饪好之后我们人就可以直接食用(类比到程序可以直接在电脑上执行)。

        补充:我的第一篇文章中,谈到过编程鄙视链的一个重要原因在于对底层的操作是否还需要程序员自己来完成。类比到这个案例中,就好比我的菜是我一步一步自己加料把控火候做出来的;而你的菜虽然跟我的味道一样好,但你只不过是将所有菜直接扔到锅中,启动自动烹饪功能自动做出来的。站在这个角度想想,如果吃饭的人评价你俩的厨艺一样好,你内心会不会感到不平衡呢,是不是瞬间豁然开郎?

 

2.免杀

2.1什么是免杀

        顾名思义,免杀就是使电脑病毒不被杀毒软件杀死,这是我们黑客重要的一门必修课,因为即便是最没有安全意识的人,电脑上也会自带Windows系统的Windows defined杀毒软件,想要上传木马病毒,免杀的意义可想而知。

2.2杀毒软件的原理

        只有懂得杀毒软件的杀毒原理,才能更好的做免杀,想必各位大黑客都认同我的这个观点吧。这里讲解一下杀毒软件最常用的两个杀毒原理:特征识别和行为分析。

2.2.1特征识别

        顾名思义,就是我们上传的病毒文件会被杀毒软件进行读取,然后与其保存的病毒样本库进行比对,如果相似度达到一定程度,就会被当作病毒干掉。因此大家可以看出,杀毒软件在特征识别方面的能力,十分依赖于其特征库是否足够多。

2.2.2行为分析

        通过特征识别,杀毒软件无法确定是否是病毒的时候,就会将我们的恶意代码上传到其部署的虚拟沙箱环境进行执行,对我们上传的病毒进行执行,动态分析它是否在搞事情。可以看出,这个方法就比单纯的特征识别要高端的多,因为想要实现这一功能,本身就需要投入大量的精力研发。根据作者自己对杀软的测试,360是一定具备这个能力的,免费的火绒则不具备这个能力。

2.3免杀姿势(区区杀软安能阻拦吾等脚步)

        这里讲解一下前面提到的两种杀毒原理的绕过思路。

2.3.1特征码识别免杀

        经过前面的讲解,大家会发现特征码识别就好比一个傻傻的正则匹配一样,只要在其特征库中无法找到能够匹配的病毒样本,那么就无法识别出程序是否是病毒。

        基于这一特性,那么加密自然就成了对特征码识别杀毒的通杀技巧,因为我们实现恶意功能的代码基本不会有太大变化,因此很容易被识别特征。但是对于加密而言,则情况完全不同,即便所有人都使用一个加密方式,那么由于密钥的不同,同一个代码加密后的结果也是天差地别;密钥的数量自然是数不清的,因此特征码识别的库也是永远都完善不了的,因此数据加密对于这个检测而言就是通杀。(这里注意,有些杀毒软件会识别程序中的解密函数,尝试将密钥代入解密代码再与特征库进行比对,因此也需要对解密函数做一定程度的混淆来保证其能稳过)

        说到这里,我想各位也能明白为什么网上公开的免杀工具都免杀不了,因为用的人多了自然也会被杀毒软件公司的安全人员注意到,只要将其加入特征库就可以直接将其干掉。因此并不是那些大佬写的加密算法不够好,而是特征固定且被加入了特征库。因此我们自己写的免杀一般不愿意给别用,就是为了避免被作为典型入库,因此一般都是自写自用。

        当然除了加密之外,还有一个最常用的方式就是无文件落地(也就是所谓的内存马的一种方式),这种方式我们就没有在程序中写入恶意代码,而是通过远程加载的方式实现,自然就谈不上符合特征库了。

2.3.2行为分析免杀

        我们知道行为分析会动态执行我们的代码,看我们在做什么,因此免杀起来难度更高,但其实仍有很多方法解决,这里提两点:

        沙箱逃逸(反虚拟机):前面我们介绍了360会将我们的病毒放到虚拟机中运行并分析行为,那么我们就可以在我们的病毒中加入一个检测当前所在的运行环境的程序,一旦识别目前在虚拟机中,就执行错误的逻辑或者直接终止程序,那么自然而然就无法被动态分析。

        密码病毒:我们还可以对我们的病毒设置一个密码,在让其进行反向连接执行命令之前,先要输入一个密码进行认证,好比ssh服务的实现,那么虚拟机自然不知道这个密码,也就无法执行到恶意的逻辑,自然也无法识别是否是病毒。

2.3.3综述

        这里对于免杀的知识就讲解这么多,我始终相信授人以鱼不如授人以渔,因此这里也就不给大家再展示过什么杀软了,只要你能掌握我所讲解的这几种技术,就足够你通杀市面上所有的免费杀软了(付费的没条件测试),如360、火绒、金山卫士、Windows Denfined等(作者亲测有效)。

2.4病毒分析为什么需要懂汇编

        我们拿到的病毒样本,基本都是已经被编译成二进制指令的可执行文件,二进制指令和汇编代码是一一对应的,因此基本可以保证程序功能完整的同时进行反汇编。至于其它高级语言如c、python和java等。虽然也可以将汇编代码尝试转换成对应语言的代码,但是由于这些代码很多时候并没有提供对底层细节的一些控制或者环境的一些问题,因此转换后的代码极易缺失和出错。因此需要懂汇编(一般情况下可以转换为c语言进行分析,其它语言就不推荐)。

3.学习的心路历程

3.1概述

        由于我的文章基本都是圈内好友在看,并且大家对我也很支持,我发表的每一篇文章都有你们的点赞和收藏,这也是我创作的一个重要动力,在这里再次感谢大家的支持!!!

        很多圈内的朋友都很好奇我是怎么学习的,为什么成长速度这么快,他们记得我只是一个普普通通应届毕业生,初入此道的小白,当初为了寻求一份普普通通的渗透测试工作,都四处碰壁。短短几个月的时间为什么就能发生天翻地覆的变化。在这里我就跟大家讲解一下我在安全行业学习经历,也希望能够对你们有所帮助。

3.2学习经历

3.2.1始源之刻

        在"很久很久"以前,我第一次听说渗透测试这个行业,当时什么也不懂只是听说这个行业发展好,而且干的事情和黑客是一样的,我相信每一个计算机专业的朋友,一定都对黑客充满了向往,我自然也不例外,更何况它的发展前景还好,于是毫不犹豫的决定进入。

3.2.2痛苦之始

        由于最初什么也不懂,只是听说网络安全与网络息息相关,因此想要学好网络安全就要先学好网络。于是果断用自己大学时期攒的一笔生活费报名了计算机网络知识的培训,还考取了华为的高级网络认证,但到学完网络知识以后,我发现它与安全仍然有着很大的差距,甚至可以说仍是天壤之别,现在回想真的想破口大骂,编程都比网络更接近网络安全,并且成功转入网安之后的上限也更高,路也更好走(如果我的文章能被还对此懵懵懂懂又想入行的小白看到,请千万不要走错了路)。当时摆在我面前的只有两条路:从事网络相关工作或自学安全。然而我这人天生性格从不将就,说要怎样就要怎样,因此选择了后者,这也为后面的痛苦时光奠定了基调.....

3.2.3艰难时光

3.2.3.1路线选择之难

        经历过网安学习的小伙伴们一定都知道,网安最大的一个难点就是不知道要学什么或者说是好像什么都需要学。由于彼时的我没有任何从事安全行业的朋友,一开始就到处加群,期望能够获取指点,但是最终并没有一个人愿意为我指路,哪怕仅仅只是几句建议或提醒的话语都没能得到,这让我对网安这个圈子的包容程度有了基本的见解。当时既迷茫又痛苦,但唯独没想过放弃,于是我最终做出了选择:既然不知道要学什么,那就什么都学,这就是我最后的解决方案。

3.2.3.2知识入门之难

        由于我的选择是看到什么相关的就都进行学习,因此没有一个循序渐进的过程,因此我最开始的学习可以说是步履维艰,那段时间经常出现课程中的一句话我需要反复去听十几遍,一个十几分钟的视频我却需要花费两个小时才能将其消化。日复一日,我把自己关在卧室中学习,数个月的时间基本没有与人交流,在刚结束的那段时间我甚至跟人说话都变得不利索,丧失了一点语言表达能力。不过结果同样令人欣喜,经过这段时间学习,我获得了两个重要的能力,其一是自己对web渗透有了充分的理解,能够对网站做一个基本的渗透测试(感谢小迪),算是达到了这个行业的入行门槛。其二也是我觉得最重要的一点,由于这段时间遇到了太多的难题,并且都是依靠自己解决,我养成了极强的独立思考能力以及独自解决问题的能力(文章中之所以能为大家举出这么多通俗易懂的例子,都是我在学习时不断尝试理解那些抽象知识时往现实世界中的类比),同时也养成了持续学习的良好习惯。

3.2.4初见曙光

        经过那段艰难的学习时光,我发现自己逐渐建立起了自己的知识体系,并且能对自己目前缺乏的能力,以及需要进一步学习的知识做出一个基本的判断,于是后来就又学习了python编程,java、c语言以及8086版本的汇编语言,于是具备了对javaweb开发网站特点的基本认识,能够使用python编写一些简单的渗透测试工具以及poc和exp,汇编和c则停留在懂语法能看懂的层面。然后就是不断地面试,最终拿到了现在的工作,说到这里真的非常感谢我现在的上级,在这极差的就业环境下,是他给了我这个应届毕业生能够生存并且在此行业继续发展的机会。

3.2.5野蛮生长

        在最开始的工作中,我发现目标站点基本都是对数据进行加密再传参的,但是彼时的我对加密只是一知半解,对浏览器工作原理和js等前端脚本更是一窍不通。于是下定决心学习js逆向,后来经过各种资料查阅明晰了学习路线,于是在js逆向的领域走了下去(如上篇文章就是一个典型的js逆向实战),那时的我虽然具备了一定程度的js逆向能力,但是对于二进制和操作系统等等底层也是一脸懵圈。于是在工作之余,又抽时间将计算机底层的几个门类:操作系统、计算机组成原理、C语言、汇编语言都进行了深入学习。除此之外还学习了shell编程等等很多数不清的门类。好了,接下来我就要开挂了,注意看。

3.2.6初显锋芒

        在学完了所有这些知识之后,我发现自己对计算机的每个层面都有了深刻的认识,从那以后我不再是一个一句话需要看很多遍才能理解的新人,而是看大部分知识都至少开1.5倍速甚至边打盹边看也仍能将其理解的入门者。此时的我就已经掌握了大量在新人看来比较高端的技术,如本篇文章的免杀,以及之前的逆向,随时随地手搓渗透工具和辅助脚本,能随意大谈计算机任意一个层面知识的能力等等,但在我看来,只觉得它们也没有多么神秘,更谈不上高端大气上档次,也只是普普通通知识的一部分而已。

3.2.7今日之我

        到了今天,我对整个计算机底层和基础,以及对安全方面都有了较为深刻的认识。如今再看新的一些之前没有接触到的黑客技术,很多时候甚至能够仅看个开头就能大概猜到其原理及实现思路,甚至还经常觉得作者实现有瑕疵或讲解的有问题,怎样可以做的更好。b站是一个学习的殿堂,至今为止,我在b站的学习视频时长超过了1500个小时,总结了将近70w字的笔记,每篇笔记复习的次数不低于10次,因此才给我的圈内朋友一种我不会忘的假象,它们见证了我的成长,承载了我的底蕴,塑造了我对自身的技术自信。虽然我仍是新人,还有很多没有掌握的知识,但是基础的牢固和学习能力的加强,让我对未来的进阶学习也充满了信心,让我们一起加油,使明日之我远远超越今日之我。

3.3学习建议

        经过我自身的学习经历,我认为学习底层知识是非常有必要的,它能为你建立起对整个计算机体系的理解,让你拥有计算机的思维,对于后续的学习起到事半功倍的效果。俗话说得好,地基不牢,地动山摇;地基牢固,千年不倒。

        将我最喜欢的两句话送给大家:

        慢即是快,越是着急的时候,越要沉得下心提升自己。---自己编的

        流水不争先,争的是滔滔不绝。----《价值》张磊

4.结语

        最后祝大家都能在各自所在的领域中熠熠生辉,成为各自行业中的佼佼者。我们青山不改,绿水长流,有缘再见。

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值