ring3下的注入dll

注入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;
}

 

这样就完成注入的过程,

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值