如何替换系统DLL??
替换正在使用中的DLL,据MSDN说,WIN 9X下可以使用WININIT.INI,WIN NT下则使用
MoveFileEx()函数,但是我在WIN 2000下使用MoveFileEx()函数来替换wsock32.dll时
仍然替换不成功,该如何解决这个问题?希望各位不吝赐教,谢谢!
问题点数:20、回复次数:13Top
1 楼FamelStudio(Famel)回复于 2001-05-23 10:16:00 得分 0
Windows 2000有系统文件保护功能,它在硬盘上保留重要的系统文件的备份。当程序替换了某个系统文件后,Windows 2000会自动使用备份的文件来恢复。你可以在系统的日志中看到。另外Windows 2000有最新的Winsock dll,没有必要替换。Top
2 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 10:28:00 得分 0
实际上,我是想替换DLL来拦截其中的API调用,不知是否有办法实现?Top
3 楼alphagx(alpha)回复于 2001-05-23 10:31:00 得分 0
非常关注!!!Top
4 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 10:33:00 得分 0
如果要在WIN NT/2000下HOOK API需要什么手段?请大虾介绍一下Top
5 楼noho(生了一个胖儿子)回复于 2001-05-23 10:33:00 得分 0
Start Registry Editor (Regedt32.exe).
Locate the following key in the Windows NT registry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
Create a new value using the following information:
Value name: PendingFileRenameOperations Data type : REG_MULTI_SZ Value data: \??\c:\temp\win32k.sys !\??\c:\winnt\system32\win32k.sys
Note that the value data is typed on two separate lines.
Quit Registry Editor.
Restart the computer.
Top
6 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 10:37:00 得分 0
MoveFileEx()也可以做相同的事情,但是REBOOT后操作实际上没有实现,在问题下,
上述的注册过后,真正执行是在什么时候?也就是说,在系统启动到什么地方的时候
执行?当时确定是任何DLL都没有加载么?Top
7 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 10:46:00 得分 0
没有启动任何网络应用程序,为什么 WSOCK32.DLL 仍然是正在被系统使用当中,
它到底是在什么时候加载的呢?会不会在处理注册表中PendingFileRenameOperations
定义的操作之前呢?Top
8 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 10:55:00 得分 0
好痛苦哦!没有人能够帮助我.....555555Top
9 楼verybigbug(等待中)回复于 2001-05-23 11:02:00 得分 0
拦截API调用有很多种方法,为什么要用这种最不推荐的方法呢?
《核心编程》中写了最少8种。
Top
10 楼Kevin_qing()回复于 2001-05-23 11:02:00 得分 0
注意win2000是有dll cache的,search一下,wsock2.dll可能不止一个
另外winsock的dll也不止一个。
有ws2_32.dll winsock.dllTop
11 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 11:08:00 得分 0
《核心编程》是什么?一本书么?那些方法能适用于NT架构吗?我个人的感觉是,HOOK API
要牵扯到修改其它进程的执行代码,还有许多特权方面的问题,NT限制很严格不知道实现起来
会不会太过于复杂?Top
12 楼ahzhuo(好好编程,天天向上)回复于 2001-05-23 11:22:00 得分 0
唉,问了一早上都没找到问题的答案,真失望......Top
13 楼verybigbug(等待中)回复于 2001-05-23 11:24:00 得分 20
《Windows核心编程》
修改特权有很多函数。--你首先有Admin的特权。
我想你在用监视自己的机器的API时有Admin权限应该不过分吧!
如果监视别人的机器,我是不赞成。
比如,一般访问Service就不可以,用下面的代码就可以啦。
dwAccess = PROCESS_ALL_ACCESS;
// dwProcessId为希望监视的程序的ID
hProcess = OpenProcess(dwAccess, FALSE, dwProcessId);
if(!hProcess)
{
SECURITY_DESCRIPTOR sd;
EnableDebugPrivilege(TRUE);
hProcess = OpenProcess(dwAccess, FALSE, dwProcessId);
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION,&sd);
EnableDebugPrivilege(FALSE);
}
EnableDebugPrivilege(BOOL fEnable)
{
HANDLE hProcess;
HANDLE hToken;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
if(hProcess)
{
if(OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
}
CloseHandle(hProcess);
}
}
Top




