学c语言那些就可以做免杀。

Python012

学c语言那些就可以做免杀。,第1张

语言只是工具。打个比方,铁锹(C语言)是一种工具,你可以用它挖坑(做免杀),然而并不是你会使用铁锹(会使用C语言)了就一定能挖出坑来(做出免杀来),你得知道关于挖坑的诸多知识,这些知识是不同于怎样使用铁锹的知识的(C语言之外的知识,比如数据结构、算法、操作系统等)。

免杀,也就是反病毒(Anti Virus)与反间谍(Anti Spyware)的对立面,英文为Anti Anti- Virus(简写Virus AV),逐字翻译为“反-反病毒”,我们可以翻译为“反杀毒技术”。单从汉语“免杀”的字面意思来理解,可以将其看为一种能使病毒木马免于被杀毒软件查杀的技术。但是不得不客观地说,免杀技术的涉猎面非常广,您可以由此轻松转型为反汇编、逆向工程甚至系统漏洞的发掘等其他顶级黑客技术,由此可见免杀并不简单

您有没有过心爱的工具被杀毒软件KILL的经历;您有没有过辛辛苦苦整理出来的工具集被杀毒软件搞成面目全非而“义愤填膺”的时候;您有没有过好不容易拿到权限,上传的木马却被杀的痛心时刻?免杀,它能做的就是避免这些事情的发生!使杀毒软件成为摆设!当然,除此之外免杀技术带给我们更多的,将是思想的飞跃与技术的成长。

但是要想真正明白免杀能做什么,就要先明白免杀会涉及到什么。对于初学者来说,免杀只会涉及到一点基本的PE文件知识与一些免杀工具的使用,而对于高手来说,免杀甚至会涉及到Ring0(内核层)的程序编译技巧。所以免杀这门课程涵盖面还是相当宽泛的。

目前国内有关于介绍黑客免杀技术的书籍共有两本《黑客免杀入门》与《精通黑客免杀》。

《黑客免杀入门》为近期出版,但其介绍的内容更加详细,内容讲解更为透彻,更有深度。

《精通黑客免杀》较早出版,因而有关于免杀技术的介绍不是很详细,但其附带的光盘中附带了几百兆的操作录像,是不可多得的宝贵资源。

手工免杀分类:

1.文件免杀和查杀:不运行程序用杀毒软件进行对该程序的扫描,所得结果。

2.内存的免杀和查杀:判断的方法1>运行后,用杀毒软件的内存查杀功能.

2>用OD载入,用杀毒软件的内存查杀功能.

什么叫特征码:

1.含意:能识别一个程序是一个病毒的一段不大于64字节的特征串.

2.为了减少误报率,一般杀毒软件会提取多段特征串,这时,我们往往改一处就可达到

免杀效果,当然有些杀毒软件要同时改几处才能免杀.(这些方法以后详细介绍)

3.下面用一个示意图来具体来了解一下特征码的具体概念

特征码的定位与原理:

1.特征码的查找方法:文件中的特征码被我们填入的数据(比如0)替换了,那杀毒软

件就不会报警,以此确定特征码的位置

2.特征码定位器的工作原理:原文件中部分字节替换为0,然后生成新文件,再根据杀

毒软件来检测这些文件的结果判断特征码的位置

认识特征码定位与修改的工具:

1.CCL(特征码定位器)

2.OllyDbg (特征码的修改)

3.OC(用于计算从文件地址到内存地址的小工具)

4.UltaEdit-32(十六进制编辑器,用于特征码的手工准确定位或修改)

特征码修改方法:

特征码修改包括文件特征码修改和内存特征码修改,因为这二种特征码的修改方法

是通用的。所以就对目前流行的特征码修改方法作个总节。

方法一:直接修改特征码的十六进制法

1.修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制.

2.适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能

否正常使用.

方法二:修改字符串大小写法

1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了.

2.适用范围:特征码所对应的内容必需是字符串,否则不能成功.

方法三:等价替换法

1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令.

2.适用范围:特征码中必需有可以替换的汇编指令.比如JN,JNE 换成JMP等.

如果和我一样对汇编不懂的可以去查查8080汇编手册.

方法四:指令顺序调换法

1.修改方法:把具有特征码的代码顺序互换一下.

2.适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行

方法五:通用跳转法

1.修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行.

2.适用范围:没有什么条件,是通用的改法,强烈建议大家要掌握这种改法.

木马免杀的综合修改方法:

文件免杀方法:

1.加冷门壳

举例来说,如果说程序是一张烙饼,那壳就是包装袋,可以让你发现不了包装袋里的东西是什么。比较常见的壳一般容易被杀毒软件识别,所以加壳有时候会使用到生僻壳,就是不常用的壳。现在去买口香糖你会发现至少有两层包装,所以壳也可以加多重壳,让杀毒软件看不懂。如果你看到一个袋子上面写着干燥剂、有毒之类的字你也许就不会对他感兴趣了吧,这就是伪装壳,把一种壳伪装成其他壳,干扰杀毒软件正常的检测。

2.加花指令

加花是病毒免杀常用的手段,加花的原理就是通过添加加花指令(一些垃圾指令,类型加1减1之类的无用语句)让杀毒软件检测不到特征码,干扰杀毒软件正常的检测。加花以后,一些杀毒软件就检测不出来了,但是有些比较强的杀毒软件,像江民杀毒软件,病毒还是会被杀的。这可以算是“免杀”技术中最初级的阶段。

3.改程序入口点

4.改木马文件特征码的5种常用方法(参见“修改内存特征码”)

5.还有其它的几种免杀修改技巧

修改内存特征码:

1.直接修改特征码的十六进制法

2.修改字符串大小写法

3.等价替换法

4.指令顺序调换法

5.通用跳转法

以上文字网上都有,因而,我想说的是:

我学免杀,看你要在哪方面,通常这很难,你最少要精通一门编程语言,注意,是精通,因为这是工具,至于… …我转 梁肇新先生 在《编程高手箴言》中的话:

1.2.1 高手成长的六个阶段

程序员怎样才能达到编程的最高境界?最高境界绝对不是你去编两行代码,或者是几分钟能写几行代码,或者是用什么所谓的可视化工具产生最少的代码这些工作,这都不是真正的高手境界。即使是这样的高手,那也都是无知者的自封。

我认为,一个程序员的成长可分为如下六个阶段。

 第一阶段

此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。

 第二阶段

此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。

 第三阶段

此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。

 第四阶级

此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。

这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想转变不过来。

 第五阶级

此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。

 第六阶级

此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。

此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。

每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。

要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。

现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。

但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件。

1.2.2 初级程序员和高级程序员的区别

一般对于一个问题,初级程序员和高级程序员考虑这个问题的方法绝对是不同的。比如,在初级程序员阶段时,他会觉得VB也能做出应用来,且看起来也不错。

但到了中级程序员时,他可能就不会选择VB了,可能会用MFC,这时,也能做出效果不错的程序。

到高级程序员时,他绝对不是首先选择以上工具,VB也好,VC也好,这些都不是他考虑的问题。这时考虑的绝对是什么才是具有最快效率、最稳定性能的解决问题的方法。

程序员到达最高境界的时候,想的就是“我就是程序,程序就是我”。这时候我要做一个软件,不会有自己主观的思路,而是以机器的思路来考虑问题,也就是说,就是以程序的思考方式来思考程序,而不是以我去设计程序的方式去思考程序。这一点如果不到比较高的层次是不能明白的。

你设计程序不就是你思考问题,然后按自己的思路去做程序吗?

其实不是的。在我设计这个程序的时候,相当于我“钻”入这个程序里面去了。这时候没有我自己的任何思维,我的所有思维都是这个程序,它这步该怎么走,下步该怎么走,它可能会出现什么情况。我动这个部分的时候,别的部分是否要干扰,也许会动一发而牵全身,它们之间是怎么相互影响的?

也只有到达这个境界,你的程序才能真正地写好,绝对不是做个什么可视化。可视化本身就是“我去设计这个程序”,而真正的程序高手是“我就是程序”,这两种方法绝对是不同的。比如,我要用VB去设计一个程序,和我本身就是一个程序的思维方式,是不一样的。别人也许觉得操作系统很深奥,很复杂,其实,如果你到达高手状态,你就是操作系统,你就能做任何程序。

对待软件要有一个全面的分析方法,光说理论是没有用的。如果你没有经过第一、第二、第三、第四这四个阶段,则永远到达不了高境界。因为空中楼阁的理论没有用,而这些必须是一步一步地去做出来。

一个高级程序员应该具备开放性思维,从里到外的所有的知识都能了解。然后,看到世界最新技术就能马上掌握,马上了解。实际上,技术到达最高的境界后,是没有分别的。任何东西都是相通的,只要你到达这个境界以后,什么问题一看就能明白,一看就能抓住最核心的问题,最根本的根本,而不会被其他的枝叶或表象所迷惑,做到这一步后才算比较成功。

从程序员本身来说,如果它到达这一步以后,他就已经形成了开阔的思维。他有这种开放性思维的话,他就能做战略决策,这对他将来做任何事情都有好处。事实上,会做程序后,就会有一种分析问题的方法,学会怎么样把问题的表象剖开,看到它的本质。这时你碰到任何具体的问题,只要给点时间,都能轻而易举地解决。实际上,对开发计算机软件来说,没有什么做不了的软件,所有的软件都能做,只是看你有没有时间,有没有耐心,有没有资金做支撑。

这几年,尤其是这两三年,估计到2005年前,中国软件这个行业里面大的软件公司就能形成。现在就已经在形成,例如用友,它上市后,地位就更加稳固了。其他大的软件企业会在这几年内迅速长大。这时候,包括流通渠道、经销商的渠道也会迅速长大。也就是说,到2005年以后,中国软件这个行业的门槛比现在还要高很多,与美国不会有太大的差别。此时,中国软件才真正体现出它的威力来。如果你是这些威力中的一员,就已经很厉害了。

入门最基本的方法就是从C语言入手。如果以前学过BASIC语言的话,那么从C语言入手是非常容易的。我就经历了一个过程,根本不觉得这中间有太大的难度。其实,C语言本身和BASIC没有什么两样。BASIC每个所谓的命令在C语言里面都可以做成一个函数来实现,那么你就能用那个命令组合成整个程序。从这个角度来看,BASIC和C语言没有本质的差别。C语言就是入门的正确方法,没有其他。

现在的C语言本身就包含了嵌入汇编,使学习汇编语言的时候更加方便。你可以忽略掉纯汇编里面的很多操作。也许有人觉得这个方法太慢了。但要知道,工欲善其事,必先利其器,要想成功,没有一个艰苦的过程是不可能的,所以一开始的时候就要有耐心。如果你准备花5年的时间成为高手,那我敢说,你根本不用等到5年,你只要有这个耐心就足够了,你可能2年~3年内就能达到目标。但如果你想在一年时间内就成为高手,即使5年后,你还是成不了高手。

入门和积累是很重要的。事实上,到达高手的境界以后,不管什么语言不语言的,其实都根本不用去学,只要拿过来看两天,就全部精通。如果你没有入门,即使去书店找n本书,天天背它,你也不会成为高手。

所有的语言只是很花哨的表面东西。高手马上就能透过它的表象而看到它的本质。这样才是真正的高手。他不需要再去学什么Java,或者其他什么语言。当他真正要写个Java程序的时候,只要把Java程序拿过来看一看,瞄一瞄书,就全都清楚了。如果这时他学VB就更容易了,我想他不用一天的时间,就能学会。到达高手的境界以后,所有的事物都是触类旁通的。

当你成为C语言的高手,那么就你很容易进入到操作系统的平台里面去;当你进入到操作系统的平台里去实际做程序时,就会懂得进行调试;当你懂得调试的时候,你就会发现能轻而易举地了解整个平台的架构。这时候,计算机基本上一切都在你的掌握之中了,没有什么东西能逃得出你的手掌心。

上面只是针对程序的角度说明,另外一点也很重要,即好的程序员必须具备开放性思维,也就是思考问题的方法。程序员,尤其现在很多的程序员,都被误导从MFC入手,这就很容易形成一种封闭式的思维模式。这也是微软希望很多人只能学点表面的东西,不致成为高手,所以他大力推荐MFC之类的工具,但也真有很多人愿意去上他的当,最后真正迷失方向。说他做不了程序吧,他也能做程序,但是如果那个程序复杂一点,出现问题时,问题出在哪里就搞不清楚了,反正是不清楚。如果你真正有一种开放性的思维,在你能够成为高级程序员的时候,对MFC这些是不屑一顾的,MFC、VB根本不会在考虑的范围之内。

事实上很多人,包括外面很多公司里面工资挺高的人,可能一个月能拿五、六万的这些人,他们的思维也不一定能达到很高的境界。但是,他确实做了很多的事情,已经有很好的积累了。但要上升到更高的境界上,就要有正确的思维方法。这就是为什么比尔•盖茨说,他招人的时候宁愿招一个学物理,而不是学编程的。学物理的人会有非常非常广的思维,他考虑的小到粒子,大到宇宙,思维空间非常广阔,这样,他思考问题的时候,就会很有深度。

有人研究物理研究得比较深的时候,他能针对某个问题一直深入进去。很多写程序的人只会注意到这行代码或那行代码,则比较起来则显得肤浅。所以,编程的时候也要深入进去,把你的爱好、你的所有思维都放进去,努力做到物我合一的境界。

1.3.1 规范的格式是入门的基础

以前所有的C语言的书中,不太重视格式的问题,写的程序像一堆堆的垃圾一样。这也导致了现在的很多程序员的程序中有很多是废码、垃圾代码,这和那些入门的书非常有关系。因为这些书从不强调代码规范,而真正的商业程序绝对是规范的。你写的程序和他写的程序应该格式大致相同,否则谁也看不懂。如果写出来的代码大家都看不懂,那绝对是垃圾。如果把那些垃圾“翻”半天,勉强才能把里面“金子”找出来,那这样的程序不如不要,还不如重新写过,这样,思路还会更清楚一点。这是入门首先要注意的事情,即规范的格式是入门的基础。

1. 成对编码

正确的程序设计思路是成对编码,先写上面的大括号,然后马上写下面的大括号。这样一个函数体就已经形成了。它没有任何问题。然后,比如你要写个for循环,这时候先申明一个变量I,再写这个for循环。写上面的大括号,马上写下面的大括号,然后再在中间插一二行代码。插这段代码后,如果你又要用到新变量,则再在头上添加新的变量,然后再让它进行工作。这就是一种成对编码。

这样,当你用到一个内存的时候,写一个分配函数分配一块内存,马上就接着写释放这块内存的代码。然后你再在中间插上你要用这个内存做什么。这是正确的快速的编程方法。否则,你去查或调试代码都无从下手。针对这个程序来说,如果用成对编码,则它任何时候都是可以调试的,不需要你整个程序都写完后才能进行调试。

它是任何时候都可以编译调试的,甚至你写了两个大括号,中间什么也没有,它是空的时,你都可以进行调试。你写了第一个for循环,它也可以进行调试,当你又写了一个分配内存、释放内存以后,它还可以进行调试。它可以编译运行,里面可以放断点,这就是成对编码。

成对编码就涉及到代码规范的问题。为什么我说上面一个大括号,下面一个大括号,而不说成是前面一个大括号,后面一个大括号呢?如果是一般C语言的书,则它绝对说是后面加个大括号,回过头前面加个大括号。事实上,这就是垃圾程序的写法。正确的思路是写完行给它回车,给它大括号独立的一行,下面大括号也是独立的一行,而且这两个大括号跟那个for单词中间错开一个TAB。

代码一定不能乱,一定要格式非常清楚,这点使你写的程序我能读,我写的程序你也能读,不需要再去习惯彼此的不同写法。

而且结合成对编码思维,这时候你去读一个程序的时候,你会发现,你读程序的方法变了。以前读程序的时候,你可以先去读它的变量是什么,然后再读第一行、第二行,读到最后一个大括号,这是一种读程序的方法。现在就不一样了,现在读程序的时候就养成了一种习惯,就是分块阅读程序,很明显两个大括号之间就是一块代码。

那么写出一个程序后,你要读这个程序是干什么的,只要看这个大括号和那个大括号之间的部分就可以了,不需要再去读其他的代码是干什么的。比如,你从Linux中或网上下载了一个“烂”程序后,该怎么去阅读它?最好的方法是先把程序所有的格式都整理好,先别去读它。把所有的格式按照这种规范化的方法,把它的括号全部整理好。这时候你再读那个程序,只要半分钟就读懂了,但是你可能要整理一个小时。但如果不这样做,你可能读两个小时都读不清楚该程序。

这点绝对不会有人告诉你,现在没有人去讲解这方面的技巧。这也是我写了那么多的程序,才总结出来的。一开始的时候,我也像那些教科书所教导那样写,后面放个大括号,前面放个大括号,甚至括号连括号,一连四个括号,每个括号对哪个最后都找不清楚。编译告诉你好像少了一个括号,于是找呀,找呀,上面找,下面找,而这个程序又很大,只有一个函数,上面在上屏,下面在下屏,最后翻来翻去也翻不出。

所以我就想,大括号之间要互相对应,即使不在一个屏幕内,也能很容易地看到它,因为只要光标落在这个大括号里面,往上去找,即能找到它头上的那个与此对正的,而且这些代码是在一起的。这一层代码和下一层代码是互相隔开的,我只要读这层代码,下面那一层代码就不需要了。

比如,它有n个for循环的时候,我只想看某一个for循环,这时我只要对正大括号,它的光标往上走,一下就能找到了。如果按照教科书那样写的话,你要读呀,读呀,要把所有的代码,把所有的for

循环都读一遍,才可能找到你要的东西。这就是成对编码和规范化的方法(详细叙述请参考代码规范一章)。

在软件没有形成行业,程序等同于软件的时候,那时候程序很容易体现出价值来。只要得到代码,就相当于得到这个软件。但现在就不同了。现在的程序都不是几行,你写出的程序,如果又没有注释,格式又很乱,你拿过来给我,我还得花很长的时间才能读得清楚,那这样的程序的代码有价值吗?

我经常听到一些程序员在外面兜销代码,很多是学校的学生,尤其那些素质比较差的研究生,和老师做了一个项目后,他拿出来到外面到处去卖,但是他最后可能卖出去吗?最后可能还是没卖出去,因为那个程序很庞大。如果某个公司买了这个程序以后,该公司还得招一个人去读这个程序,当这个人读懂以后,他又离职了,那公司买这个代码干嘛?2. 代码的注释

代码本身体现不出价值来,有价值的代码一定是不仅格式非常规范,而且还要有很详细的设计思路和注释,这个是很重要的。首先要养成这种习惯,教科书里面很少讲为什么要做注释,注释应该怎么注。有些人爱在哪儿下注释就在哪儿下注释,甚至在语句中间也加,中间也可弄两个斜杠放两个花括号写点注释。

注释格式是非常重要的,但很少有人去注意它。现在的程序如果没有注释,则基本上是没法用的,也就跟你拿一个可执行程序没什么两样,你拿过来还不能随便改,你改了后编出来的程序绝对不能用。所以,程序如果没有详细的注释,别人就算拿到了代码也没有用,体现不出它的价值来。

Linux是个操作系统,很厉害呀!其实那些程序你拿回来,耐心地去读它,会发现,它里面乱得很,那个内核程序除了作者自己能读懂外,别人可能要花很长的时间才能读懂。Apache的作者对自己Apache那套代码是很清楚,但换一个做浏览器的人去读,也会很困难。一般人只把代码复制下来后,打个BUILD命令看看能不能正确地编译,最后能正确编译的程序就是好的,如果不能正确编译的程序就删掉吧,再下载一个,因为他没有正确的对待代码的那种思维,而只是认为那代码本身才有很大的价值,不用关心有没有注释。

如果代码没有注释和规范,是没有价值的,这也是现在为什么很多的个人跑去卖源程序的时候,很多的公司都不要。我们不是说没有技术,任何程序都能做,只是时间的问题,而且像视频中有的技术,比那些卖代码的技术还要深得多。真正要做一个有价值的程序,开发程序的思维就很重要,这种思维的具体体现就在注释及规范的代码本身。

1.3.2 调试的重要性

调试是很重要的一个部分。所有的程序都是调试出来的,不是写出来的。讲怎么去调试,实际上就是讲一种解决问题的思路。所有的程序写出来后一定是有问题的,既然有问题,就一定会有一个解决问题的思路。解决问题的方法就是调试的方法。

用VB或者是MFC做出来的程序,先运行一遍看看什么地方有问题,如果发现有问题,重新改一改,然后又重新运行。这种方法是还没有入门的调试方法,即是看直接的表象。这种方法既浪费时间,又不能消除隐患。

调试是很重要的内容,如果要进入高深境界,调试是除了了解设计程序、平台以外,一个非常重要的难关。如果要成为高级程序员,就必须过这一关。如果不懂调试,则永远成不了高手。在学习调试的过程中,对汇编语言、体系结构会有进一步的了解。

你可能觉得我把调试的作用说得言过其实了,举例子说明一下吧。请把以下的C程序改写成汇编代码:

int i

extern int In[],Out[]

for(i=0i<100i++)

{

Out[i]*=In[i]

}

我发现90%的人写出来的汇编代码可能是不正常的或有错误的。要么是不了解32位汇编,要么是不循环,要么只有循环没有处理等。这是为什么呢?因为就算是一段小小的代码,如果没有经过调试,也可能错误百出。

如果你是初级一点的程序员,则如果程序出了问题,也不知道原因所在。怎么回事呀?我就是搞不清楚。要搞清楚首先要调试,这就涉及到调试的问题。比如说,放到一个文件里面的,它出错了,我查程序看了n遍,它就是没有任何问题,这时候该怎么办呢?这时的解决方法就是调试,调试能使得一个程序正常地运转起来。如果对于程序员来说写这个程序可能只用了一天的时间,但是调试可能会花他二三天的时间。一个程序绝对是调试出来的,不是编出来的。如果说哪个系统是编出来的,那它肯定会有很多性能方面的问题,包括可能有不可预测的各种各样的问题。

程序出现问题的话,要能考虑到各种各样可能的情况,绝对没有任何臆测。比如,有可能完全是编译器的错误,也有可能因你程序里面增加了什么,而对程序产生干扰,甚至还有一种可能是你的指针基本就没有给它赋值,指向了别的地方,把别的东西破坏了。这些情况太多了。还有一种常见的错误,即MFC里面很常见的一种设计思维,就是任何一个东西,只管创建,不管释放、销毁。这种思路是现在很多程序员做的程序没用几下就会死机的原因。这绝对是错误的设计思路,而MFC让你这么做,就是让你永远成不了高手,你写的程序永远不可能稳定。

一.入口点加1免杀法:

1.用到工具PEditor

2.特点:非常简单实用,但有时还会被卡巴查杀]

3.操作要点:用PEditor打开无壳木马程序,把原入口点加1即可

【二.变化入口地址免杀法:】

1.用到工具:OllyDbg,PEditor

2.特点:操作也比较容易,而且免杀效果比入口点加1点要佳.

3.操作要点:用OD载入无壳的木马程序,把入口点的前二句移到零区域去执行,然后

又跳回到入口点的下面第三句继续执行.最后用PEditor把入口点改成零区域的地址

【三.加花指令法免杀法:】

1.用到工具:OllyDbg,PEditor

2.特点:免杀通用性非常好,加了花指令后,就基本达到大量杀毒软件的免杀.

3.操作要点:用OD打开无壳的木马程序,找到零区域,把我们准备好的花指令填进去

填好后又跳回到入口点,保存好后,再用PEditor把入口点改成零区域处填入花指令的着地址.

【四.加壳或加伪装壳免杀法:】

1.用到工具:一些冷门壳,或加伪装壳的工具,比如木马彩衣等.

2.特点:操作简单化,但免杀的时间不长,可能很快被杀,也很难躲过卡巴的追杀

3.操作要点:为了达到更好的免杀效果可采用多重加壳,或加了壳后在加伪装壳的免杀效果更佳

【五.打乱壳的头文件或壳中加花免杀法:】

1.用到工具:秘密行动 ,UPX加壳工具.

2.特点:操作也是傻瓜化,免杀效果也正当不错,特别对卡巴的免杀效果非常好

3.操作要点:首先一定要把没加过壳的木马程序用UPX加层壳,然后用秘密行动这款

工具中的SCramble功能进行把UPX壳的头文件打乱,从而达到免杀效果.

【六.修改文件特征码免杀法:】

1.用到工具:特征码定位器,OllyDbg

2.特点:操作较复杂,要定位修改一系列过程,而且只针对每种杀毒软件的免杀,要达

到多种杀毒软件的免杀,必需修改各种杀毒软件的特征码.但免杀效果好

[特征码修改方法]

特征码修改包括文件特征码修改和内存特征码修改,因为这二种特征码的修改方

法是通用的。所以就对目前流行的特征码修改方法作个总节。

[方法一:直接修改特征码的十六进制法]

1.修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制.

2.适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能否正常使用.

[方法二:修改字符串大小写法]

1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了.

2.适用范围:特征码所对应的内容必需是字符串,否则不能成功.

[方法三:等价替换法]

1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令.

2.适用范围:特征码中必需有可以替换的汇编指令.比如JN,JNE 换成JMP等.如果和我一样对汇编不懂的可以去查查8080汇编手册.

[方法四:指令顺序调换法]

1.修改方法:把具有特征码的代码顺序互换一下.

2.适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行

[方法五:通用跳转法]

1.修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行.

2.适用范围:没有什么条件,是通用的改法,强烈建议大家要掌握这种改法.

木马免杀的综合修改方法

文件免杀方法:1.加冷门壳 2.加花指令 3.改程序入口点 4.改木马文件特征码的5种常用方法

5.还有其它的几种免杀修改技巧

【七.内存免杀方法:】

修改内存特征码:

方法1>直接修改特征码的十六进制法

方法2>修改字符串大小写法

方法3>等价替换法

方法4>指令顺序调换法

方法5>通用跳转法

壳入口修改法

1.用到工具:压缩壳 OD

2.特点:操作简单 免杀效果好

3.操作步骤:首先给木马加压缩壳 然后用OD载入,在入口处的前15句中NOP掉某些代码或者等价代换某些代码

【八.输入表免杀方法:】

[一,移位法]

1 首先用lordpe打开,目录,导入表找到你要改的函数。比如说CommandLineA

2 记下未改前函数的thunkvalue 举例:00062922

3 将要修改的文件用winhex等16进制形式打开,然后找到该函数的地址,比如说00062988

4 将该函数用00填充,移动到新地址如00070000

5 保存

6 将保存后的文件用lordpe打开,打开计算器,选择16进制,00062988-00062922+00070000,计算结果修改为新的thunkvalue。保存

注:公式->内存地址=RAV+RAV基址 ,RAV基地址可以在LORDPE中看到.输入表函数名前有两个空格所以RAV的地址要减去2

[二,修改字符法]

今天定位Drat2.9卡巴特征码,是在输入表上!(这时句废话,现在卡巴基本都杀输入表)

[特征] 00025175_00000001 ZwUnmapViewOfSection 他的特征码位置是函数后面的那个00

(这个函数我在开始移动过位置,原始DAT文件的特征码是0002516A_00000001,同样是函数后面的那个00)

我开始是选择C32移动位置,LordPE修改输入表,但是不行,后来试过OD指针移位,还是不行!CALL改JMP都不行

我发现LordPE可以修改函数名称!便用C32将ZwUnmapViewOfSection函数后面加了个字符b(你可以随意加字符)

由于LordPE读取输入表函数是从ThunkValue开始,一直到这个连续的字符串后的00处!

由于在ZwUnmapViewOfSection函数后加了个字符b,现在LordPE读取的此处函数为ZwUnmapViewOfSectionb

此时将ZwUnmapViewOfSectionb函数后面的那个b删除!保存下文件,这时就免杀了!

这样一修改,在文件00025175处的16进制代码不是00,而是62,所以卡巴就过了,而用lardPE修改后函数后,文件的输入表的函数还是ZwUnmapViewOfSection,生成服务端可以运行!

【免杀经验:】

1.加区,加花后,再加密,可以比较容易过卡巴----如加密工具vmprotect

脱壳过的木马---加花指令,或加区加花---加密---加压缩壳---再加区加花指令

2.单单加免杀花指令已经不能过卡巴,一定要配合加花后在加压缩壳,才能起到免杀卡巴的效果.

vmprotect加密----再加花-----可过卡巴:

3.加双层花指令免杀法----免卡巴

4.加密---007内存免----加压 ---免卡巴或内存.

5.双层加密(maskpE)---加压 ----可过卡巴.

6.maskpe加密---asppack加壳 ---改入口点加1---可过卡巴

7.加密maskpe----加花或加区加花(用工具)-----加压缩壳---免卡巴

8.北斗对黑防鸽子可加压二次,再压其它压缩壳.以达免杀.

9.加过北斗壳,向上拉滚开鼠标50多次,有一段空代码,可以加花,转移.

10.去头转移入口点---加花----加密(vmprotect) ----加压缩==过所有杀毒

11.对付卡巴,加免杀花指令.花指令对瑞星表面查杀一般无效,一般加压缩壳.

12.对付瑞星表面: 有些黑软,加区,加花后被瑞星表面杀,可以这样:先加压过瑞星表面,然后加免杀花指令,过卡巴.

13.过瑞星表面的查杀方法: 1.加北斗内存免杀压缩壳 2.加过瑞星表面的专用加密工具. 3.用maskPE加密工具加密 源码免杀,要求楼主必须会编程语言,如C语言,E语言等。可以载入IDA中调试,通过修改源码语句。