VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 4685|回复: 6

[技术文章] VC实现DLL注入之DLL卸载

[复制链接]
Miss丿小沫 发表于 2016-7-15 08:01:20 | 显示全部楼层 |阅读模式
这一章接上一章【DLL注入篇】,主要讲一下DLL注入更加一般化,DLL卸载,原理和DLL注入一样的。
还是我【Miss丿小沫】,废话不多说,上教程!

这就是成品图(自行忽略APIHOOK,这是下来讲解的),
进程名和DLL文件路径,就可以注入了。

--------------------------------------------------------------------------------
先来看第一个函数:
  1. //由进程名获取PID
  2. DWORD CCodeInjectDlg::FindPID(CString strProcessName)
  3. {
  4.         PROCESSENTRY32 PE;

  5.         //获取系统快照
  6.         HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
  7.         //遍历进程列表获取指定PID
  8.         PE.dwSize = sizeof(PROCESSENTRY32);
  9.         Process32First(hSnapshot,&PE);
  10.         do
  11.         {
  12.                 if(strProcessName == PE.szExeFile)
  13.                 {
  14.                         CloseHandle(hSnapshot);
  15.                         return PE.th32ProcessID;
  16.                 }

  17.         } while(Process32Next(hSnapshot,&PE));

  18.         return -1;
  19. }
复制代码

实现由进程名获取PID。需要包含头文件tlhelp32.h
CreateToolhelp32Snapshot()用来获取系统快照,第一个参数指定要获取什么,第二个就是要获取谁的快照,输入一个PID,NULL就是所有了。(具体参见MSDN)
PE一定要初始化dwSize
然后使用Process32First()和Process32Next()循环进程列表,一旦发现szExeFile是我们的目标进程名,就获取PID。
--------------------------------------------------------------------------------
下面是卸载DLL函数:
  1. void CCodeInjectDlg::OnButtonUninstall()
  2. {
  3.         //卸载DLL
  4.         MODULEENTRY32 MOD;
  5.         BOOL bFound = FALSE;
  6.         LPTHREAD_START_ROUTINE pThread = NULL;
  7.         CString strMod;

  8.         //获取notepad.exe加载的所有DLL
  9.         HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID);
  10.         Module32First(hSnapshot,&MOD);
  11.         do
  12.         {
  13.                 strMod.Format("%s",MOD.szModule);
  14.                 if(strMod == "MyDLL.dll")
  15.                 {
  16.                         bFound = TRUE;
  17.                         break ;
  18.                 }
  19.         }while (Module32Next(hSnapshot,&MOD));

  20.         if(bFound == FALSE)
  21.         {
  22.                 AfxMessageBox("There is not DLL!");
  23.                 CloseHandle(hSnapshot);
  24.                 return ;
  25.         }
  26.         //同理注入DLL,调用FreeLibrary()卸载DLL
  27.         //获取目标进程句柄
  28.         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);
  29.         //获取FreeLibrary()地址
  30.         HMODULE hMod = GetModuleHandle("kernel32.dll");
  31.         pThread = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"FreeLibrary");
  32.         //调用远程Thread
  33.         HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pThread,MOD.modBaseAddr,0,NULL);

  34.         WaitForSingleObject(hThread,INFINITE);
  35.         CloseHandle(hThread);
  36.         CloseHandle(hProcess);
  37.         CloseHandle(hSnapshot);
  38. }
复制代码


首先同样是使用CreateToolhelp32Snapshot()获取指定进程的DLL列表,第一个参数指定为TH32CS_SNAPMODULE,第二个参数即是目标进程的PID
同理使用Module32First()和Module32Next()循环DLL列表,发现我们指定的DLL后,保存信息在MODULEENTRY32结构体中
获取进程句柄,获取FreeLibrary()地址
调用CreateRemoteThread()来执行FreeLibrary()
CreateRemoteThread()中线程地址为FreeLibrary()地址(pThread),参数传指定DLL的地址(MOD.modBaseAddr)
--------------------------------------------------------------------------------
DLL卸载就完成了,
这里还要了解一个引用计数的概念,
简单来说,就是调用一次LoadLibrary() 引用计数就+1,调用一次FreeLibrary(),引用计数就-1,当引用计数为0时,才算卸载
我们可以做个小测试:

上回说到,DllMain()里面弹出MessageBox
我们点击Install,它会弹出对话框

这时,我们不卸载DLL,继续点击Install,发现,他不在弹出对话框
这时我们点击UnInstall后再点击Install,发现还是不弹出对话框
我们连续点击两次UnInstall后,再点击Install,发现又弹出了对话框
这里 就应该明白了引用计数这个概念了吧!
--------------------------------------------------------------------------------
【Miss丿小沫】
下回 APIHOOK 再见!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

评分

参与人数 1威望 +2 驿站币 +2 贡献 +2 热心值 +2 收起 理由
Syc + 2 + 2 + 2 + 2 很给力!

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

密码错误 发表于 2016-8-25 15:05:50 | 显示全部楼层
没源码啊

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

yi421405945 发表于 2016-8-30 20:53:13 | 显示全部楼层
这个注入只能卸载自己注入的DLL,其它的DLL卸载不了?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

 楼主| Miss丿小沫 发表于 2016-8-31 14:52:15 | 显示全部楼层
yi421405945 发表于 2016-8-30 20:53
这个注入只能卸载自己注入的DLL,其它的DLL卸载不了?

那就要看别的DLL有没有保护了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

eagle1103 发表于 2017-2-11 23:30:13 | 显示全部楼层
编程不严谨,FindPID这个函数就有内存泄漏

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

hzdb110 发表于 2017-3-28 08:59:31 | 显示全部楼层
新人++,学习学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

runfog 发表于 2017-5-2 08:36:28 | 显示全部楼层
DLL注入更加一般化,DLL卸载,原理和DLL注入一样

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站

本版积分规则

展开

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-12-14 04:27

Powered by Discuz!

© 2009-2017 cctry.com

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