免杀实验
免责声明
本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
加载器
加载器 + base64
cs 生成 Python shellcode x64
base64 加密 shellcode
添加到加载器,加载器的大致原理就是申请一块内存,将代码字节存入该内存,然后开始运行该内存储存的程序,并让该程序一直运行下去。
ctypes 库
python 的 ctypes 模块是内建,用来调用系统动态链接库函数的模块
使用 ctypes 库可以很方便地调用 C 语言的动态链接库,并可以向其传递参数。
读取shellcode
将 shellcode 生成后,使用 base64 编码,后面操作是将代码写入内存,所以需要将代码解码并转为字节类型
设置返回类型
我们需要用 VirtualAlloc 函数来申请内存,返回类型必须和系统位数相同
想在 64 位系统上运行,必须使用 restype 函数设置 VirtualAlloc 返回类型为 ctypes.c_unit64,否则默认的是 32 位
申请内存
调用 VirtualAlloc 函数,来申请一块动态内存区域,VirtualAlloc 函数原型和参数如下:
申请一块内存可读可写可执行
将 shellcode 载入内存
调用 RtlMoveMemory 函数,此函数从指定内存中复制内容至另一内存里。RtlMoveMemory 函数原型和参数如下:
从指定内存地址将内容复制到我们申请的内存中去,shellcode 字节多大就复制多大
创建进程
调用 CreateThread 将在主线程的基础上创建一个新线程, CreateThread 函数原型和参数如下:
创建一个线程从 shellcode 放置位置开始执行
等待线程结束
调用 WaitForSingleObject 函数用来检测线程的状态, WaitForSingleObject 函数原型和参数如下:
等待创建的线程运行结束
这里两个参数,一个是创建的线程,一个是等待时间
当线程退出时会给出一个信号,函数收到后会结束程序。
当时间设置为0或超过等待时间,程序也会结束,所以线程也会跟着结束。 正常的话我们创建的线程是需要一直运行的,所以将时间设为负数,等待时间将成为无限等待,程序就不会结束。