能力值:
( 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自己安全退出
这个函数比较安全一点
|
能力值:
( 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, 文本型
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
哥们, 易语言的 我看不懂,不过谢谢你了
FreeLibrary
CreateRemoteThread
VirtualAllocEx
WriteProcessMemory
这几个API可以吗?
(用的是KernelDetive)都卸载不掉啊
|
能力值:
( LV4,RANK:45 )
|
-
-
6 楼
自己安装下 (易5。11至于正版盗版自己选 支持正版)
或者自己翻译下
过程很详细了
调用的api参数全部都有
你用delphi7。0写个
还不是切菜的功夫啊
内核级别保护的话先 干掉内核
要保证没驱动干扰
否则不行的 没有操作权限
|
能力值:
( LV4,RANK:45 )
|
-
-
12 楼
首先定位到进程
枚举进程时,仅需要使用以下三个函数:
CreateToolhelp32Snapshot()、Process32First() 和 Process32Next()。
然后 可以用pid 或者进程名 得到 要操作的进程句柄
然后通过
这个句柄 枚举所有的线程
Thread32First和Thread32Next枚举线程信息(一个数组 里面保存所有线程的信息)
里面就有dll信息 包括路径 线程id等
然后你可以通过线程名 或者线程路径 线程id
的判定条件来定位dll (是否存在)
然后打开进程
分配一块 内存通过远程线程或者其他的办法 来调用一个api来卸载
后面是需要关闭句柄等后续操作
我也是菜鸟一个看别人的代码之后 总结的
|
能力值:
( 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
我自己都写测试程序,都不可以,到底什么地方出了原因呢?
|
能力值:
( 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" );
提权 进程提升到调试权限
查看下驱动
|