首页
社区
课程
招聘
[求助]如何卸载Dll
发表于: 2010-12-3 11:36 13631

[求助]如何卸载Dll

2010-12-3 11:36
13631
我用PE工具修改的

给一个EXE,加入了一个Dll

程序运行起来后,观察dll的确被加载了,但是 我想卸载掉,为什么卸载不掉呢(用的是KernelDetive)

有没有什么好方法 谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
FreeLibrary
CreateRemoteThread
VirtualAllocEx
WriteProcessMemory
2010-12-3 11:56
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
.版本 2

.子程序 卸载DLL, , , 9-6
.参数 进程ID, 整数型
.参数 DLL全路径, 文本型
.局部变量 进程句柄, 整数型
.局部变量 路径长度, 整数型
.局部变量 返回地址, 整数型
.局部变量 temp, 整数型
.局部变量 模块句柄1, 整数型
.局部变量 远程线程1, 整数型
.局部变量 模块句柄2, 整数型
.局部变量 远程线程2, 整数型
.局部变量 退出代码, 整数型
.局部变量 打开线程, 整数型

进程句柄 = 打开进程 (2035711, 0, 进程ID)
.如果 (进程句柄 = 0)
    信息框 (“无法获取进程句柄”, #警告图标, “错误”)
.否则
    ' 返回 (假)
.如果结束
路径长度 = 取文本长度 (DLL全路径) + 1  ' dll的全路径名的长度,待会分配内存要用到的
返回地址 = VirtualAllocEx (进程句柄, 0, 路径长度, 4096, 4)  ' 向宿主进程分配内存,返回一个指针
' #MEM_COMMIT=4096, #PAGE_READWRITE=4
' VirtualAllocEx (进程, 0, 文本长度, 4096, 4)
写内存数据 (进程句柄, 返回地址, 到字节集 (DLL全路径), 路径长度, temp)
模块句柄1 = GetProcAddress (GetModuleHandle (“Kernel32”), “GetModuleHandleA”)  ' 获取GetModuleHandleA函数地址
远程线程1 = CreateRemoteThread (进程句柄, 0, 0, 模块句柄1, 返回地址, 0, 0)
.如果真 (远程线程1 = 0)
    CloseHandle (进程句柄)
    信息框 (“在目标进程创建远程线程失败”, #警告图标, “错误”)
    ' 返回 (假)
.如果真结束
API_WaitForSingleObject (远程线程1, -1)  ' -1表示等待时间为无限时间
API_取中止线程退出代码 (远程线程1, 退出代码)  ' 获得GetModuleHandle的返回值

API_VirtualFreeEx (进程句柄, 返回地址, 路径长度, 4096)  ' 释放目标进程中申请的空间
CloseHandle (远程线程1)

模块句柄2 = GetProcAddress (GetModuleHandle (“Kernel32”), “FreeLibraryAndExitThread”)
远程线程2 = CreateRemoteThread (进程句柄, 0, 0, 模块句柄2, 退出代码, 0, 0)
' 使目标进程调用FreeLibraryAndExit,卸载DLL,实际也可以用FreeLibrary,但是我发现前者好一点
API_WaitForSingleObject (远程线程2, -1)  ' -1表示等待时间为无限时间  等待FreeLibraryAndExitThread执行完毕
CloseHandle (远程线程2)
CloseHandle (进程句柄)

------------------------------------------------------------------------------
大部分上面都解释了。主要就是分配一个内存调用 FreeLibraryAndExitThread 让dll自己安全退出
这个函数比较安全一点
2010-12-3 12:49
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4
.版本 2

.DLL命令 VirtualAllocEx, 整数型, "kernel32", "VirtualAllocEx", , 卸载dll
    .参数 hProcess, 整数型
    .参数 lpAddress, 整数型
    .参数 dwSize, 整数型
    .参数 flAllocationType, 整数型
    .参数 flProtect, 整数型
.版本 2

.DLL命令 GetProcAddress, 整数型
    .参数 hModule, 整数型
    .参数 lpProcName, 文本型

.版本 2

.DLL命令 CreateRemoteThread, 整数型, "kernel32", "CreateRemoteThread", , 卸载dll
    .参数 hProcess, 整数型
    .参数 lpThreadAttributes, 整数型
    .参数 dwStackSize, 整数型
    .参数 lpStartAddress, 整数型
    .参数 lpParameter, 整数型
    .参数 dwCreationFlags, 整数型
    .参数 lpThreadId, 整数型
.版本 2

.DLL命令 CloseHandle, , , "CloseHandle", , 关闭一个内核对象
    .参数 ProcessHandle, 整数型, , 对象句柄

.版本 2

.DLL命令 API_WaitForSingleObject, 整数型, "kernel32", "WaitForSingleObject", , 监测一个对象 卸载dll
    .参数 hHandle, 整数型
    .参数 dwMilliseconds, 整数型

.版本 2

.DLL命令 API_取中止线程退出代码, 整数型, "kernel32", "GetExitCodeThread", , 获取一个已中止线程的退出代码  非零表示成功,零表示失败。会设置GetLastError 卸载dll
    .参数 线程句柄, 整数型, , 想获取退出代码的一个线程的句柄
    .参数 退出代码, 整数型, 传址, 用于装载线程退出代码的一个长整数变量。如线程尚未中断,则设为常数STILL_ACTIVE;

.版本 2

.DLL命令 API_VirtualFreeEx, 整数型, "kernel32.dll", "VirtualFreeEx", , 卸载dll
    .参数 hProcess, 整数型
    .参数 lpAddress, 整数型
    .参数 dwSize, 整数型, 传址
    .参数 dwFreeType, 整数型

.版本 2

.DLL命令 CloseHandle, , , "CloseHandle", , 关闭一个内核对象
    .参数 ProcessHandle, 整数型, , 对象句柄
.版本 2

.DLL命令 GetModuleHandle, 整数型, "kernel32", "GetModuleHandleA", , 卸载dll
    .参数 lpModuleName, 文本型
2010-12-3 12:54
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哥们, 易语言的 我看不懂,不过谢谢你了

FreeLibrary
CreateRemoteThread
VirtualAllocEx
WriteProcessMemory

这几个API可以吗?

(用的是KernelDetive)都卸载不掉啊
2010-12-3 13:49
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6
自己安装下 (易5。11至于正版盗版自己选 支持正版)
或者自己翻译下
过程很详细了
调用的api参数全部都有
你用delphi7。0写个
还不是切菜的功夫啊

内核级别保护的话先 干掉内核
要保证没驱动干扰
否则不行的 没有操作权限
2010-12-3 13:59
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
xture(一个内核查看工具)好象是这个名字 直接可以卸载的 一般都可以
我手工弄过
2010-12-3 14:05
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼上的哥们,xtrue 我还真的没有搜到?能不能在想想,谢谢了
2010-12-3 16:12
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
XueTr  是这样写的,谢谢了
2010-12-3 16:12
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
呵呵我都忘记了
抱歉
不过编程实现很简单的
而且做个小工具
可以实现指定进程 指定dll卸载
2010-12-3 16:21
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个工具 还真的很好用,而且也能卸载掉,可是  是怎么卸载的呢?

能不能讨论下?谢谢了
2010-12-3 16:27
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
12
首先定位到进程
枚举进程时,仅需要使用以下三个函数:
CreateToolhelp32Snapshot()、Process32First() 和 Process32Next()。

然后 可以用pid 或者进程名 得到 要操作的进程句柄
然后通过
这个句柄 枚举所有的线程
Thread32First和Thread32Next枚举线程信息(一个数组 里面保存所有线程的信息)
里面就有dll信息 包括路径 线程id等
然后你可以通过线程名 或者线程路径 线程id
的判定条件来定位dll (是否存在)

然后打开进程
分配一块 内存通过远程线程或者其他的办法 来调用一个api来卸载
后面是需要关闭句柄等后续操作
我也是菜鸟一个看别人的代码之后 总结的
2010-12-3 17:27
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
FreeLibrary
2010-12-3 17:33
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是的,就是你们说的

http://topic.csdn.net/u/20100603/12/d7454d10-e646-4801-b261-792215de4842.html
你们看看这个代码
不行啊,到底什么原因

还有可以看看这个地方的代码

http://bbs.pediy.com/showthread.php?p=496021

我自己都写测试程序,都不可以,到底什么地方出了原因呢?
2010-12-3 17:41
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
卸载不掉啊,烦死了,哎呀
2010-12-3 17:56
0
雪    币: 6092
活跃值: (699)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
16
http://topic.csdn.net/u/20100603/12/d7454d10-e646-4801-b261-792215de4842.html
GetProcAddress(GetModuleHandle(_T("Kernel32")), "FreeLibrary");
不一定可以的 而且 权限不一定够
http://bbs.pediy.com/showthread.php?p=496021

NtUnmapViewOfSection = (XXXNtUnmapViewOfSection)GetProcAddress( GetModuleHandle("你要卸载的dll文件"), "NtUnmapViewOfSection" );

提权  进程提升到调试权限
查看下驱动
2010-12-3 18:40
0
雪    币: 242
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
注意GetLastErro

各种卸...
2010-12-3 20:33
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
楼主好像是想远程卸载,这样的话不太容易GetLastError
2010-12-3 21:09
0
游客
登录 | 注册 方可回帖
返回
//