起因
很多文章都写到了分离免杀,采用的方法是将 shellcode 和 执行函数分离,开辟内存空间复制 shellcode,然后执行函数执行。改进版就是远程加载,让木马去下载存储在远程服务器的 shellcode。
昨天看 BackStab 代码的时候,它有一个将 ProcEXP.sys 放入资源文件,加载驱动前写入到磁盘的操作。这种操作其实就可以替代远程加载,只需要上传一个 exe 文件,在读取 shellcode 前先在当前目录释放一个 bin 文件,文件内容复制到开辟好的内存空间后再删除该文件,随后调用执行函数执行。
过程
加载资源
首先肯定是添加资源,随便添加什么资源,到时候再改就好了
在项目目录下新建一个 resources 文件夹,存上 MSF 或 CS 生成的 shellcode 文件:
打开 资源文件(.rc),用编辑方式打开:
修改资源文件
1 |
|
同样 resource.h 也应该修改
1 |
|
资源释放
释放资源有两步,首先要定位资源并得到资源的大小和内容,然后写入文件。
第一步需要用到 4 个 API:
1 |
|
这样就可以获得内存中资源数据的指针和资源大小。
第二步就是新建和写入文件
1 |
|
文件写入到内存并删除
将释放出来的文件写入到内存中,用的还是老方法,开辟内存空间后打开文件,用 ReadFile 读到开辟好的内存空间中
1 |
|
删除操作用的 DeleteFileW
1 |
|
执行
执行的方法就很多了,经典执行:
1 |
|
回调函数执行,参考:
1 |
|
结果
杀软1检测:
杀软2检测:
杀软3检测:
后续
更改远程连接的地址只需要在编译前替换 resources 文件夹下的 bin 文件即可。
这里用的是 msf 生成的默认 shellcode 文件,被杀软检测出具备 MSF 特征,只需要对这个 bin 做处理就可以了,还可以更换执行函数来绕过杀软的检测,根据查杀的情况不同修改。
代码地址:https://github.com/Ryze-T/Bypass_frames