ring3下的注入dll

    技术2022-05-13  14

    注入DLL是个古老的技术,但是应用很广泛,特别在ring3下

     

    注入的方法通常是3种

     

    一.通过注册表键去写,这种方法的缺点是要等到系统重启后才能加载,

    优点就是能方便注入多个,某些恶意软件通过这个方式,注入大量的DLL

    有时候导致Explorer.exe的线程等待很长时间才能进入桌面

     

    二.通过消息钩子,消息钩子的原理是这样的,我从看雪上得知的,

    如果你设置一个消息钩子,每当某个进程处理消息的时候会检查是否存在

    钩子,如果存在,将试图把DLL加载进来处理钩子,这样,DLL就轻松进入的进程

    例子就是 ~WINDOW核心编程~;中的一个HOOK MESSAGEBOX的源码

     

    三.通过创建远程线程,CreateRemoteThread,有几点需要注意的,

    线程必须是目标内存里面的,所以必须要把线程CALL BACK函数写到

    目标,WriteProcessMemory,不过整个回调函数写到目标,工作量似乎有点大,可以把LoadLibrary,做为远程线程函数,

    要WriteProcessMemory就必须要找到一个内存区域来写,VirtualAllocEx可以用来申请

    到内存,注意申请的内存要是PAGE_EXECUTE_READWRITE,

     

    DWORD WINAPI ThreadProc(  LPVOID lpParameter   // thread data);

    HMODULE LoadLibrary(  LPCTSTR lpFileName   // file name of module);

    两段函数比较参数都是一个,所以做起来比较方便,

    首先要获取LoadLibrary的地址,然后再把要注入的DLL文件名注入

    到远程目标,因为要远程调用,所以注入的东西不能仅仅存在本来的进程

    连个字符串都要写到目标上,下面给出一个例子,注入DLL到扫雷里面

     HANDLE hProcess,hRemoteProcess; DWORD  dwProcessId; HWND hwnd = ::FindWindow("扫雷","扫雷"); if(hwnd==NULL) {  MessageBox("查找不到窗口");  return; }

     GetWindowThreadProcessId(hwnd,&dwProcessId) ;

     hProcess = OpenProcess(PROCESS_CREATE_THREAD |         PROCESS_QUERY_INFORMATION |          PROCESS_VM_OPERATION |          PROCESS_VM_WRITE |          PROCESS_VM_READ,FALSE,dwProcessId); if(hProcess==NULL) {  MessageBox("打开进程失败");  return; }

     LPVOID dwInfoAddr = OpenMemory(hProcess,4096);

     char dll_path[50] = "InjectDLL/0";

     LPTHREAD_START_ROUTINE addr_loadlib = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");  injectInfo.LoadLibFunc =addr_loadlib;

     if(!WriteProcessMemory(hProcess,dwInfoAddr,dll_path,sizeof(dll_path),NULL))  MessageBox("写内存失败");

     hRemoteProcess = CreateRemoteThread(  hProcess,                          // handle to process  NULL, // SD  0,                       // initial stack size  (LPTHREAD_START_ROUTINE)addr_loadlib,    // thread function  dwInfoAddr,                       // thread argument  0,     // creation option  NULL);                  // thread identifier if(hRemoteProcess == NULL)  MessageBox("创建远程线程失败"); 

    }

    LPVOID OpenMemory(HANDLE hProcess,DWORD dwSize){ LPVOID lpAddr; lpAddr = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(lpAddr == NULL) {  MessageBox(NULL,"开内存失败","title",MB_OK); } return lpAddr;}

     

    这样就完成注入的过程,

    最后~~~注意清理申请回来的内存


    最新回复(0)