重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
上图是Golang官网FAQ的部分截图,看来关于Go不支持重载的这个问题困扰了很多从面向对象语言转到Go的开发者。官方在这里做出了解答。
创新互联-专业网站定制、快速模板网站建设、高性价比南开网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式南开网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖南开地区。费用合理售后完善,10多年实体公司更值得信赖。
在上面的回答中有这样一句话:
其意思是: 使用其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。
接下来又说: 在Go的类型系统中,仅按名称进行匹配并要求类型一致是一个简化的主要决定。
最后一句话: 关于操作员重载,似乎比绝对要求更方便。 同样,没有它,事情会变得更简单。
整个的解答非常漂亮、简洁。我们看完之后就会理解,Go语言的设计者之所以没有在Go中实现方法的重载,并没有复杂的理由,核心原则就是: 让Go保持足够的简单。 这也能看出来Go语言的设计者有着极大的选择和克制。
其实,笔者认为重载在本质上并没有很大的实际意义。只是表现力和表现形式上有一定的差别。明确某个上下文中的函数调用的关键就是函数签名,支持重载的语言中一般是函数名加函数参数构成函数签名。而Go中可以认为函数名就是签名。逻辑上没有太大的区别,就是把工作做在了台前 还是幕后的区别。
当然如果非要较真的话,我们或许可以在Go中声明方法的时候将参数写成 interface{} 或者 ... 切片的方式。在传进来参数的时候做一步校验,判断参数的类型和个数,然后分别处理之。
仁者见仁智者见智,大家有什么不同的理解欢迎一起沟通。
Go语言是谷歌2009发布的编程语言,这个语言发明的目的,就是为了在运行速度接近C/C++语言的基础上(注意是接近),降低开发者的门槛,减少开发难度。 Go语言,在功能上没有超过C/C++,适用者为没有C/C++经验的开发者,开发出接近C效率的程序。 对于已经熟练掌握C/C++的开发者来说,Go语言没有优势,还要重学语法,适应开发环境,明显是不符合效率的。
1、服务器编程:以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
2、分布式系统、数据库代理器、中间件:例如Etcd。
3、网络编程:这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
4、开发云平台:目前国外很多云平台在采用Go开发,我们所熟知的七牛云、华为云等等都有使用Go进行开发并且开源的成型的产品。
5、区块链:目前有一种说法,技术从业人员把Go语言称作为区块链行业的开发语言。如果大家学习区块链技术的话,就会发现现在有很多很多的区块链的系统和应用都是采用Go进行开发的,比如ehtereum是目前知名度最大的公链,再比如fabric是目前最知名的联盟链,两者都有go语言的版本,且go-ehtereum还是以太坊官方推荐的版本。
自1.0版发布以来,go语言引起了众多开发者的关注,并得到了广泛的应用。go语言简单、高效、并发的特点吸引了许多传统的语言开发人员,其数量也在不断增加。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等。
后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
一、主动免杀1. 修改字符特征:主动查找可能的特征码,包括木马文件修改注册表、生成新文件的名称与路径、注入的进程名等动作,也包括运行过程中可能出现或一定会出现的字符等文件特征。然后找出这些字符,并将其修改。2. 修改输入表:查找此文件的输入表函数名(API Name),并将其移位。3. 打乱文件结构:利用跳转(JMP),打乱文件原有结构。4. 修改入口点:将文件的入口点加1。5. 修改PE段:将PE段移动到空白位置二、被动免杀1. 修改特征码:用一些工具找出特征码并针对特征码做免杀处理。2. 用Vmprotect:使用Vmprotect加密区段。3. 文件加壳:可以用一些比较生僻的壳对木马文件进行保护。有的朋友看到这里有可能蒙了,PE、Vmprotect、入口点……这些都是什么意思啊?不要着急,下面我会一一介绍的,只要你看完这篇文章,就一定会成为免杀高手!怎么样?Go!3.实战演习1.)修改字符特征好,下面我们依然以一个病毒防御工作者的角度来考虑我们每一步应该做什么,然后在利用逆向思维分而治之。现在假如我们拿到一个木马样本灰鸽子,首先当然要分析它究竟有什么功能,怎样运行以及怎样保护自己等。其实这一步要求的专业知识是很多的,但考虑到我们的读者,我们暂且用一个比较简单易行的方法——运行木马AND查看此程序的帮助文档。我们打开RegSnap,新建一个快照,打开RegSnap后,点击[新建快照]按钮(如图1)。
在弹出的对话框中选择[生成所有项目的快照](如图2)。然后保存快照,现在已经将RegSnap配置好了,下面运行我们的木马程序(提醒:做免杀时,一定要记住养好随时备分的好习惯,以防止修改错误或是实验运行时破坏、删除木马)。木马运行完毕后,我们在按照上面的方法重新做一个快照并保存,然后按快捷键F5,在弹出的“比较快照”对话框中选择刚才保存的快照,在“第一个快照”中选择我们刚才第一次保存的快照,而“第二个快照”选择我们后保存的快照存档,很快结果就出来了(如图3)。
有的朋友对于使用RegSnap收集到的信息感到无力分析,抱怨收集到的东西太多,在这里我简单的介绍一下,首先应注意的是生成做对比的两个快照之间的时间要尽可能短,另外要排除带有OpenSaveMRU的注册表键值,还要排除有关*.rsnp文件的创建读写等操作记录。下面我们就将有用的信息提取出来,逐一分析。文件列表于 C:\WINDOWS\*.*新增文件木马.exe注册表报告新增主键HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\C:\Documents and Settings\A1Pass-admin\桌面\huigezi\复件 Server02.exe键值: 字符串: "复件 Server02"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\Class键值: 字符串: "LegacyDriver"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\ClassGUID键值: 字符串: "{8ECC055D-047F-11D1-A537-0000F8753ED1}"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_*6728*9A6C*670D*52A1\0000\Control\ActiveService键值: 字符串: "木马服务"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\木马服务\Description键值: 字符串: "灰鸽子服务端程序。远程监控管理."……这里我只摘录了部分关键性的木马动作记录,全部记录请见光盘。通过文件列表我们可以知道木马在WINDOW目录下生成了一个新文件,而通过注册表的监控信息我们也知道了木马是怎样将自己注册为系统服务并自动运行的。那么我们回到瑞星的研究分析室,看看那些大哥大姐们会怎么办……瑞星大哥:“最近这灰鸽子太猖狂啦!我们是不是应该多定义几套特征码?”瑞星大姐:“恩,不错!先在注册表那定义一套特征码在说吧。”A1Pass:“STOP!!”(只见画面突然定格,A1Pass将播放器最小化。)通过上面的对话,我们可以知道他们要将注册表的某个字符定义为特征码,从上面RegSnap分析出来的记录来看,他们的选择真的是太多了!那么他们究竟会用到哪些呢?其实,就做为一个黑客来讲,只要不影响服务端正常运行,就应该尽量多的改掉木马的所有字符,当然全部改变是不可能的,除非你自己编写木马。有的朋友要问了,除了注册表别的就不可以改了吗?答案当然是否定的,譬如生成新文件的名称与路径、注入的进程名等动作,这些我们可以利用WINDOWS对字母大小写不敏感的这一特点直接替换字母的大小写,而对于运行过程中可能出现或一定会出现的字符等我们可以直接将其替换成别的内容。下面我为大家演示一下怎样更改注入进程的名称。首先配置服务端,通过图4我们可以看出来灰鸽子的启动运行是需要“IEXPLORE.EXE”这个进程的,根据注册表的推理,我们可以认为其未加壳的服务端是应该存在“IEXPLORE.EXE”这一字符串的。既然如此,我们就先请出我们的第一把武器“WinHex”!
WinHex是一款极为出名16进制编辑器。得到 ZDNetSoftwareLibrary 五星级最高评价,拥有强大的系统效用。在这里,我们只用它来编辑文件,其余不做过多讨论。首先我们用WinHex打开我们的木马文件“Server.exe”,打开后如图5所示。
然后我们按[Ctrl]+[F]快捷键调出查找文本对话框,输入IEXPLORE.EXE后点击“是”(如图6)。
结果如图7所示。下面我们就对其进行大小写转换,用鼠标点击要更改的字母(例如I),然后在按键盘上的i,即可完成更改,就象使用WINDOWS的记事本一样。更改完毕后,按[Ctrl]+[S]快捷键保存即可。
就这么简单?对!就这么简单!其他的例如注册表、生成新文件的名称与路径等等都可以利用此方法更改。但是不幸的是,经过这样改后,还不足以对付例如金山、江民等品牌杀毒软件,要想对付这些杀毒软件的查杀,我们还需要对我们的木马进行进一步处理。下面,我们开始学习输入表函数(APIName)免杀!2.)修改输入表不知有的朋友是否知道,PE文件的正常运行是离不开其内部输入表函数的,而不同的程序,其内部输入表函数的名称与在文件中的位置是不一样的,所以输入表函数也成了病毒防御工作者制作特征码紧盯的地方之一。在我查出来的关于灰鸽子的特征码来看,“瑞星大哥”已经将其的一处输入表函数作为特征码了。所以掌握输入表函数免杀技巧对于新入门的朋友来说势在必行!
[PE文件小知识:PE文件是WINDOWS系统中特有的一种文件结构,它包括PE文件头、输入表与相关资源文件等等]经过我的测试,直接单独修改文件内部的输入表函数会导致程序运行不正常甚至崩溃!那就没有办法了吗?我可没那么容易认输!经过一翻苦战,终于让我在LordPE中找到了解决办法,同时FoBnN的文章也给了我非常大的启发……我们先打开LordPE,点击[PE编辑器]按钮,在弹出的对话框中选中木马文件,打开后点击[目录](如图8)。在点击导入表后面的[…](如图9)。在弹出的对话框中我们选择wininet.dll下的InternetOpenUrlA(如图10),有的朋友要问了,为什么非选择InternetOpenUrlA这个输入表函数呢?呵呵!那是因为这个输入表里有特征码哦,关于怎样确定特征码,我在后面会介绍,大家先别着急。
好的,关于LordPE就先停在这,下面我们就用WinHex来查找InternetOpenUrlA这个输入表函数的所在位置,并将其用0填充(操作方法:单击WinHex右面的16进制信息,输入0即可)(如图11、12)。
然后将其写到空白区域(既显示000000的区域),一定要从头开始写入,这样在以后计算地址时不容易出错,除此之外也要注意输入表函数的大小写不要搞错(如图13)。保存后我们在回到LordPE那里,在需要更改的InternetOpenUrlA输入表函数上单击右键,在弹出的菜单里选择“编辑”,将Thunk里的信息改成000B9D5E(如图14)即可。有的朋友要问了,刚才我们不是把那个输入表函数放到000B9D60那里了吗?到这怎么变成000B9D5E了?其实原理很简单,因为每个输入表函数前面都是有一个空格的,我们虽不用真正把那个空格加进去,但填写它的地址时一定要空出来,否则就会出错!而将000B9D60减去一个空格所占的位置,其地址正好为000B9D5E,还不十分明白的朋友在仔细看看图13,下面我们在回到LordPE,看看我们改过的输入表函数变成什么样了(如图15)?呵呵!那我们该怎么办呢?其实简单的很,只要在重新改一下输入表函数的名称就可以了(如图16)。有的时候因为我们所填写的地址为比较靠后的,例如我们现在改的这个000B9D5E,后面仅能容纳两个字节,所以更改输入表函数时只能键入两个字,对于这种情况我们可以先把Thunk里的信息改成如000B9D60这样的起始地址,改输入表函数名更改完毕后在将000B9D60改回原来的值(既000B9D5E),保存后即可成功,我们试一下看看(如图17)。经测验鸽子的各项功能均正常!在用瑞星查一下试试(如图18),结果当然不言而喻……
3.)修改特征码虽然到这我们免杀已经成功,但是为了学到更多的技术,为了让我们免杀的鸽子存活的更久,下面我在为大家介绍一下特征码的查找与修改技巧。特征码是杀毒软件的心脏,但同样也是我们的心脏!就看谁先找到对方地心脏,并能发出致命一击,谁就是胜利者!一提到查找特征码,就不得不说说MyCCL与CCL,这两个软件的名字相信留心过免杀技术的朋友不会陌生,但由于软件操作的傻瓜化,很多时候对于CCL的介绍只是一带而过,这可苦了入门的朋友!这一小节我就先介绍一下MyCCL的用法……我们先来认识一下MyCCL(如图19),根据这张图我们下面就来大体介绍一下MyCCL的应用方法。首先点击第1处选择文件,然后在第2处输入分块个数,分块个数越多,定位越精确,然而生成的速度同时也就越慢,生成的文件总体积也就越大,就象灰鸽子这么大的服务端,如果分块数为300的话,那么它生成文件的总体积将超过230M!所以在这里不建议填写太大的数字,一般象灰鸽子这样的服务端分块数填400个就足够了。生成完毕后会弹出个对话框提醒你去相应目录杀毒,图中所示为“E:\文章\极度免杀\鸽子\OUTPUT”文件夹,我们到那个文件夹下开始杀毒,查到病毒就让杀毒软件将其彻底删除,注意,这一点很重要!处理完毕后点击第3处的二次处理,在点击[生成]上面的[特征区间]按钮即可出现右面的对话框。下面我们在“区间设定”里右键单击特征码区间,在弹出的菜单中选择“复合精确定位此处特征”(如图20),然后重复上面的操作,直到你认为[单位长度]已经小到很方便更改的时候,特征码的定位就算结束了。好了,一口气说了这么多,不知道刚入门的朋友是否懂得一些MyCCL的用法了没有……但是上面我们定位的是文件特征码,还有内存特征码没有定义,这里我们要用到CCL的内存特征码定位功能,打开CCL后,我们依次选择[文件]→[特征码验测]→[内存特征码](如图21)。
在弹出的对话框中选择我们要进行免杀操作的木马,然后会进入“定位范围选择窗口”(如图22)。由图中可知,第一个CODE段的偏移量为00000400,也就是说我们可以用00000400做为起始位置,那么我么就在用户输入区的“起始位置”处填写00000400,下面的那个验测大小怎么填写呢?看到图22中画线的那个“当前文件大小”了吗?我们可以用WINDOWS系统自带的计算器进行计算,把计算器的“查看”菜单设置为科学型、十六进制、四字(如图23)。然后用当前文件大小的值减去起始值00000400,得到的结果为000B9A00,那么我们就在“验测大小”后填上000B9A00,然后点击“填加区段”按钮(如图24)。最后点击确定,在新弹出的对话框中点击运行,不过需要注意的是,在进行此步操作时一定要打开杀毒软件的所有功能。下面你要做的就是等待……然而光找特征码是不够的,我们还得学会怎样更改,而关于特征码地更改是非常有学问的!这里为了方便广大读者能学以致用,在此我只介绍部分理论知识,着重介绍实践操作,但是我想请大家注意,免杀的方法象你做完免杀的木马一样,都有生存时间,而过了这个时间,这种免杀方法就变的不在实用,或者免杀效果大打折扣!所以要想真正成为免杀高手,还的打牢基本功,不断创造出新的免杀方法,因为我们是在与杀毒软件厂商的专业技术人员“斗法”啊!关于需要注意的问题就先讲的这,下面我带大家先来了解一下目前更改特征码的办法。1. 大小写替换(只适用于文件免杀)适 用 于:出现可识别的英文字母或词组,并且确定其不是相关函数(如输入表函数)。操作方法:如咱们“实战演习”的第一节讲的一样,只须将大小写替换一下就可以了,例如特征码中出现了A,你只要将其替换为a即可。原 理:利用WINDOWS系统对大小写不敏感,而杀毒软件却对大小写非常敏感这一特性达到免杀目的。2. 用00填充适 用 于:几乎任何情况,但成功率不是非常高。操作方法:例如我们找到了一处特征码0009EE7F_00000005,那么根据这段特征码信息我们可以知道它的位置在0009EE7F,大小为5个字节,也就是0009EE7F-0009EE83这一段内容(如图25)。
一直跟着文章实践操作的朋友肯定有疑问,你是怎么找到那个地址的呢?而我怎么找不到呢?那是因为WinHex的默认偏移量为decimal模式,我们单击Offset栏将其改为16进制模式即可(如图26)。
然后我们有选择的一处处地用00填充(如图27)。记住要多试几次,80%的情况下你都能找到一处既能免杀又不影响程序正常运行的区域。对于定义出的内存特征码,只要将其内存地址用一个叫做《便宜量转换器》的小程序转换成16进制偏移量,然后在进行相应操作即可。原 理:由于PE文件的特殊格式以及程序编译语言等问题,使得生成目标代码的效率并不高,难免出现一些“垃圾信息”,而这些信息存在与否对与程序是否能正常运行并不起决定性的作用,而当木马的这部分“垃圾信息”被定义为特征码时,我们完全可以将其删除,而删除的方法就是用无任何意义的00将其替换。3. 跳到空白区域适 用 于:几乎任何情况,成功率比较高。操作方法:还是以特征码0009EE7F_00000005为例子,假如我们使用00填充的方法失败了那么不要多想,接下来马上试试OllyDbg,关于OllyDbg我就不多介绍了,它是非常棒而且非常专业的一个动态反汇编/调试工具,这里我们只用它来帮助我们进行免杀作业,首先应该做的就是将我们的16进制偏移量0009EE7F转换为内存地址,因为OllyDbg的工作原理是先将程序释放到内存空间里,然后才能进行相关作业…这里要用到的是一个叫做《便宜量转换器》的小程序,我们用其转换完毕后得到的内存地址为0049FA7F(如图28)。
下面我们用OllyDbg打开我们的木马服务端,首先找到一处空白区,并域记下这的地址004A24A5,然后找到我们刚转换过来的地址0049FA7F,先将以0049FA7F开始以下的这三行数据选定,然后单击右键选则[复制]→[到接剪贴板](如图29)。将其复制到本文文档里备用,然后在将这三行代码一一NOP掉(如图30)。最后右键点击0049FA7F,在弹出的对话框中选择汇编,并写入“jmp 004A24A5”这条汇编指令(如图31)。记住,在点击[汇编]按钮之前一定先把“使用 NOP 填充”前面的勾去掉。然后我们记下汇编后0049FA7F的下面那个地址0049FA84(仔细观察图31)。好,下面我们回到004A24A5这处刚才找到的空白地址(如图32)。
然后用刚才汇编的方法把在本文文档里备用的信息一句句地汇编进去,然后在将最后一句代码的下一行004A24AA处加入“jmp 0049FA84”这行代码(如图33)。然后单击右键→[复制到可执行文件]→[所有修改](如图34)。
在弹出的对话框中选择“全部复制”然后保存即可。而对于内存免杀就省去了内存地址转换这一步了。原 理:大家先看图35,由图中可知,正象此方法的名字“跳到空白区域”一样,这种方法的原理就是将原本含有特征码的信息转移到空白区域,并把原先位置的信息全部NOP掉,并在那里加一个跳转指令,让其跳到004A24A5处,也就是我们找到的空白区域,并把原来在0049FA84的信息移到这里,加完信息后在加一条指令让其在跳回去,以使程序连贯起来。
4. 上下互换适 用 于:几乎任何情况,成功率比较高。操作方法:先用OllyDbg载入木马程序,假定其特征码为0009EE7F_00000005,我们还是先用《偏移量转换器》将其转换为内存地址,上面我们已经知道0009EE7F对应的内存地址为0049FA7F,然后在OllyDbg中找到相应位置,利用上面“跳到空白区域”里介绍的修改方法将0049FA7F上下两句代码调换位置即可。而对于内存免杀就省去了内存地址转换这一步了。原 理:杀毒软件的特征码定位是严格按照相关偏移量于内存地址进行的,而其实我们的应用程序中的机器码执行顺序的先后在一般情况下是没有死规定的,所以我们只需将其上下互换,杀毒软件自然就不认识了。5.ADD与SUB 互换适 用 于:在内存特征码中出现ADD或 SUB指令的,成功率比较高。操作方法:用OllyDbg载入木马程序,假定其特征码所对应的地址中有ADD或SUB指令,例如00018A88:XXXXX 00000088 ADD ECX 10000000我们可以将ADD ECX 10000000这段机器码改为SUB ECX F0000000,更改完毕后保存为EXE文件即可。原 理:我们都知道1+1=2,我们也知道1-(-1)=2,上面就是利用了这个原理,其中ADD指令的就是加意思,而SUB则是减的意思。虽然被我们互换了一下,但是最终结果还是一样的,可是换完之后杀毒软件就不认识了。到这里,关于特征码的查找与修改就讲完了,但是除此之外呢?答案是还有许多!!下面我们就一起看看其他免杀方法。4.)其他免杀方法改文件头:这里所说的改文件头包括加头去头,文件加花。关于加头去头,我们还是用OllyDbg。用OllyDbg载入后,OllyDbg会自动停在入口点(如图36)。
我们将头三行机器码复制保存起来,然后找到空白区域,用汇编的方法一一将其写入(如图37)。然后在后面写入一条JMP指令,让其跳到初始入口点的第四行,相信一直仔细看本文的朋友一定明白其原理,如果忘了的话可以看上面修改特征码的第三种方法,原理与这差不多,修改完毕后如下所示:004A2A73 0000 add byte ptr ds:[eax],al004A2A75 0000 add byte ptr ds:[eax],al004A2A77 55 push ebp004A2A78 8BEC mov ebp,esp004A2A7A B9 04000000 mov ecx,4004A2A7F ^ E9 CCF3FFFF jmp Server.004A1E50004A2A84 0000 add byte ptr ds:[eax],al004A2A86 0000 add byte ptr ds:[eax],al004A2A88 0000 add byte ptr ds:[eax],al
上面的add byte ptr ds:[eax],al就是所谓的空白区域,我们看到改完后的头文件位于004A2A77,所以我们还要用PEditor改一下入口点,打开PEditor后载入文件,将入口点处的地址改为我们的新文件头地址004A2A77(如图38),保存后即可。
Go语言自亮相以来并没有展示一个明确的方向,Google员工将Go语言称为一个“试验性语言”,称其试图融合Python等动态语言的开发速度和C或C++等编译语言的性能和安全。一位Go语言的支持者概括而言Go语言如下:简单、快速、安全、并发、快乐编程、开源;但Go语言缺乏方向以及其“集大成者”的尝试很容易会导致其学猫不成学狗也不成,沦为四不像。尽管如此,编者仍然觉得Go语言有相当大的潜力:很多开发者对它感兴趣——不仅它的最初设计者阵容强大,而且在参与修改源代码的人群中也不乏大牛级人物。这很有可能帮助Go语言找到适合自己的方向,开拓系统编程的新方向。
升级系统。截止到2022年11月18日,博学谷go语言现已下架,原因是要对系统功能进行升级操作,具体上架时间待官方公告为准。博学谷于2016年7月正式创立,汇聚了黑马程序员11年的教学精华。