安全矩阵

 找回密码
 立即注册
搜索
查看: 430|回复: 0

DLL远程线程注入初尝试

[复制链接]

189

主题

191

帖子

903

积分

高级会员

Rank: 4

积分
903
发表于 2023-1-23 22:32:50 | 显示全部楼层 |阅读模式


DLL远程线程注入初尝试 (qq.com)
DLL注入前提条件

1.windows在动态链接库的使用时在各个进程中的虚拟地址是相同的,所以注入器中的kernel32.dll地址可以当做要被注入的进程的地址用。

2.有相关的权限,注入器的权限要能打开目标权限,以及分配内存和写入内存。


DLL注入的相关步骤

1.打开要注入的进程。
2.给进程分配虚拟内存 VirtualAllocEx。
3.给分配的内存写入要注入的DLL目录。
4.找到 kernel32.dll 模块的里面的LoadLibrary函数的地址。
5.用CreatRemoTethread给目标进程注入dll。
6.关闭目标进程的句柄。


实验过程

实验工具:

自己编写的注入器,和自己编译的一个简单的DLL文件,x64dbg,win10记事本

实验流程:

1、先打开记事本。

2、然后拿x64dbg附加进程,然后在LoadLibrary函数打下断点,可以在x64dbg的符号表中查找。
编辑

3、运行注入器。
编辑

4、查看注入过程。
编辑
通过查看日志,可以发现线程已经被注入了。
并且rip停到了我们设置断点的位置。
编辑
并且可以看到rcx寄存器中地址存放的地址就是我们写入的地址(这里因为笔者嫌弃麻烦,直接把DLL文件放到了与记事本的同一目录下,所以输入 填写dll文件的名字就好了)。
转存失败重新上传取消
我们会发现在这个call 指令(f8)运行时rip就会立马跳转去,并且会显示出我们注入成功的,但是没看太明rip跳出去的地方是干什么的,因为我在messagebox下了断点也没有断下来,并且窗口直接跳出。
编辑
编辑

注入器和dll文件代码解析

DLL文件代码,IDE: VS2019
  1. BOOL APIENTRY DllMain( HMODULE hModule,
  2.                        DWORD  ul_reason_for_call,
  3.                        LPVOID lpReserved
  4.                      )
  5. {
  6.     switch (ul_reason_for_call)
  7.     {
  8.     case DLL_PROCESS_ATTACH:

  9.         OutputDebugString(L"DLL Inject Sucess");
  10.         MessageBox(NULL, L"dll sucess", L"dll sucess", MB_OK);
  11.         break;//加载DLL时运行d
  12.     case DLL_THREAD_ATTACH: //释放DLL运行的
  13.         OutputDebugString(L"DLL free Sucess");
  14.         MessageBox(NULL, L"dll free", L"dll free", MB_OK);
  15.         break;//加载DLL时运行d
  16.     case DLL_THREAD_DETACH:
  17.     case DLL_PROCESS_DETACH:
  18.         break;
  19.     }
  20.     return TRUE;
  21. }
复制代码

注入器

  1. #include<stdio.h>
  2. #include<Windows.h>
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6. BOOL CreateRemoteDllInjectDll(DWORD dwProcessId, char *pdllname);
  7. int main() {
  8.     DWORD dwProcessId;
  9.     char DLLName[20]; //需要输入的DLL文件名字
  10.     cout << "Pleace input DLLfile name :" << endl;
  11.     cin >> DLLName;
  12.     cout << "Pleace input PRocessID :" << endl;
  13.     cin >> dwProcessId;
  14.     CreateRemoteDllInjectDll(dwProcessId,DLLName);

  15.     return 0;

  16. }
  17. /**
  18. 1.打开要注入的进程
  19. 2.给进程分配虚拟内存 VirtualAllocEx
  20. 3.给分配的内存写入要注入的DLL目录
  21. 4.找到 kernel32.dll 模块的里面的LoadLibrary函数的地址
  22. 5.用CreatRemoTethread给目标进程注入dll
  23. 6.关闭目标进程的句柄
  24. **/
  25. BOOL CreateRemoteDllInjectDll(DWORD dwProcessId, char *pdllname) {
  26.     HANDLE hProcess = NULL;
  27.     LPVOID pDLLAddr =NULL;\
  28.     HMODULE hker=NULL;
  29.     FARPROC pFunProcAddr =NULL;
  30.     DWORD dwsize=0;
  31.     hker = GetModuleHandleA("kernel32.dll"); //得到kernel32.dll进程中的地址
  32.     if( NULL == hker) {
  33.         puts("GetModuleHandle kernel32.dll  is error");
  34.         return false;
  35.     }

  36.     hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessId);//打开要注入的进程
  37.     if( NULL == hProcess) { // 检查打开进程是否成功
  38.         puts("OpenProcess is error");
  39.         return false;
  40.     }
  41.     dwsize = strlen(pdllname)+1; //DLL文件目录的长度
  42.     pDLLAddr  = VirtualAllocEx(hProcess,NULL,dwsize,MEM_COMMIT,PAGE_READWRITE );
  43.     //申请的内存空间,并且地址保存在pDLLAddr目录中
  44.     if(pDLLAddr == NULL) {  //检查
  45.         puts("VirtualAllocEx is error");
  46.         return false;
  47.     }
  48.     if(!WriteProcessMemory(hProcess,pDLLAddr,pdllname,dwsize,NULL)) {//把所需要的注入的dll文件目录字符注入给目标进程
  49.         puts("WriteProcessMemory is error");
  50.         return false;
  51.     }
  52.     pFunProcAddr = GetProcAddress(hker,"LoadLibraryA"); //得到loadlibrarya函数的地址
  53.     if(pFunProcAddr == NULL) {
  54.         puts("Get LoadLibraryA is error");
  55.         return false;

  56.     }
  57.     HANDLE hRemotehandle =  CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)(pFunProcAddr),pDLLAddr,0,NULL); //创造远程线程
  58.     if(!hRemotehandle) {
  59.         puts(" CreateRemoteThread is error");
  60.         return false;
  61.     WaitForSingleObject(hRemotehandle, INFINITE);
  62.     CloseHandle(hRemotehandle);//关闭句柄
  63.     CloseHandle(hProcess);
  64.     return 0;

  65.     }

  66. }
复制代码


回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 05:25 , Processed in 0.014786 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表