`

在重启过程中替换windows保护的系统文件

    博客分类:
  • VC
阅读更多

在重启过程中替换windows保护的系统文件 

作者:ClassyK 日期:2006-01-25


这最先缘起写一个3721的卸载软件,当时把系统文件都删除了,可是搜索依然会定位到3721,譬如当我在地址栏输入"好的"然后按回车,网页先定位去microsoft的搜索引擎,可是很快,被3721的引擎给替换了。变成了如下地址hxxp://cns.3721.com/cns.dll?coagent=dh&fw=dh&name=%BA%C3%B5%C4&pid=1000026&cnspid=401742_1006


在网上查阅了一下资料,这问题的引起在于广东电信将http://auto.search.msn.com重定位到hxxp://cns.3721.com,估计是跟3721有合作协议吧。现在的问题,让我们把系统里原来的搜索引擎替换为google,后来检查发现,原来的搜索引擎竟然是固化在一个系统文件shdoclc.dll里头,这文件被explorer使用。要替换此地址,唯有修改文件了。


但是修改远没想象中那么简单,最开始用了MoveFileEx,希望能在重启时替换此文件,但这函数只能应付普通的文件,对被windows保护的文件无能为力。只能另开道路了。在网上找了好多的资料,虽然有些是关于无提示替换系统文件的,但是都不够满意,或者实现非常复杂。我要做的,是安安静静的替换掉此文件。


最后灵机一动,答案就出来了。临时替换掉windows shell,这个文件通常就是explorer了。可以通过注册表获得当前的shell是啥。(不过我下面的代码,并没有这样去考虑这么多。)


附各部分代码如下(只适用于win 2000/XP/2003,不适合win9x):


//C++代码 替换系统文件、Shell

void CRemove3721Dlg::ReplaceSystemFile(void)   
{   
	CString strShdoclc = "\\shdoclc.dll";  // 要被替换的文件名   
	WCHAR wszSearch[]= L"http://auto.search.msn.com/response.asp?MT=%1&srch=%2&prov=%3&utf8";  //原搜索引擎   
	WCHAR wszReplace[]= L"http://www.google.com/search?inlang=zh-CN&q=%1&lr=lang_zh-CN"; //替换后的引擎   
	
	char szWindows[MAX_PATH];   
	GetWindowsDirectory( szWindows, sizeof szWindows);   
	
	CString strTempPath = szWindows;   
	strTempPath += "\\TEMP";  // 通常指向C:\windows\Temp  ,不使用GetTempPath得到的路径,为movefileex作准备  // MoveFileEx在重启时的替换只能是同分区(同一卷)的文件!   
	
	char szSystem[MAX_PATH];   
	GetSystemDirectory( szSystem, sizeof szSystem);   
	
	CString strSystemDll = szSystem;   
	strSystemDll += strShdoclc;   
	
	// --------- 拷贝shdoclc.dll到临时目录   
	char szTempFile1[MAX_PATH];   
	GetTempFileName( strTempPath, "_@", 0, szTempFile1);   
	CopyFile( strSystemDll, szTempFile1, FALSE); 	
	//CopyFile( strSystemDll, "C:\\shdoclc.dll.bak", TRUE);  //备份,如果已存在,就不再替换   

	// --------- 创建文件映像   
	HANDLE hProFile = CreateFile( szTempFile1, GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   
	HANDLE hFileMap = CreateFileMapping( hProFile, NULL, PAGE_READWRITE, 0, 0, 0);   
	if( hFileMap == NULL || hFileMap == INVALID_HANDLE_VALUE)   
	{   
		MessageBox( "CreateFileMapping Error", 0, MB_OK|MB_ICONERROR);   
		return;   
	}   
	LPVOID lpBuf = MapViewOfFile( hFileMap, FILE_MAP_WRITE, 0, 0, 0);   
	
	// --------- 查找   
	DWORD dwLength = GetFileSize( hProFile, 0) / 2;   
	wchar_t *wpFind = NULL;   
	for( DWORD i=0; i<dwLength; i++)   
	{   
		wpFind = wcsstr(&((WCHAR*)lpBuf)[i], wszSearch);   
		if( wpFind != 0) break;   
	}   
	if( wpFind == 0)  //查找失败... 原文件已经被修改过   
	{   
		UnmapViewOfFile( lpBuf);   
		CloseHandle( hFileMap);   
		CloseHandle( hProFile);   
		return;   
	}   
	
	// ---------- 替换   
	wcscpy( wpFind, wszReplace);   
	UnmapViewOfFile( lpBuf);   
	CloseHandle( hFileMap);   
	CloseHandle( hProFile);   
	
	// 获取windows文件保护目录   // 以下获取各目录极为重要,如果漏掉将被windows替换回来   
	CString strSFCDll = szSystem;   
	strSFCDll += "\\dllcache";   
	strSFCDll += strShdoclc;   
	
	// 获取servicepack备份目录   
	char szSP[MAX_PATH]; memset( szSP, 0, sizeof szSP);   
	DWORD dwTemp1 = REG_SZ; DWORD dwTemp2= sizeof szSP;   
	SHGetValue( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup", "ServicePackSourcePath",   
		&dwTemp1, szSP, &dwTemp2);   
	CString strSPDll = szSP;   
	if( strSPDll.GetLength() != 0)   
	{   
		strSPDll += "\\i386";   
		strSPDll += strShdoclc;   
	}

	// OK,现在这种方法不需要关闭文件保护,因为我们在文件保护前就替换了文件   
	// 建立bat文件, 此文件用于替换文件   
	CString strBat = strTempPath;   
	strBat += "\\_@replace.bat";   
	CFile fBat( strBat, CFile::modeCreate | CFile::modeWrite);   
	CString strBuf;   
	strBuf.Format( "Copy %s %s /y\n", szTempFile1, strSystemDll);   
	fBat.Write( strBuf, strBuf.GetLength());   
	strBuf.Format( "Copy %s %s /y\n", szTempFile1, strSFCDll);   
	fBat.Write( strBuf, strBuf.GetLength());   
	if( strSPDll.GetLength() != 0)   
	{   
		strBuf.Format( "Copy %s %s /y\n", szTempFile1, strSPDll);   
		fBat.Write( strBuf, strBuf.GetLength());   
	}   
	strBuf.Format( "Del %s \n", szTempFile1);   
	fBat.Write( strBuf, strBuf.GetLength());   
	strBuf.Format( "Del %s \n", strBat);   
	fBat.Write( strBuf, strBuf.GetLength());   
	fBat.Close();   
	
	// 用自身去替换系统shell,将bat文件名作参数传入   
	// 这里没有去获取原来的shell,并非完美   
	char szModule[MAX_PATH];   
	GetModuleFileName( NULL, szModule, MAX_PATH);   
	strcat( szModule, " ");   
	strcat( szModule, strBat);   
	SHSetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "Shell", REG_SZ,   
		szModule, strlen( szModule));   
} 
 


//接下来要做的就是重启系统,这段代码没什么可提的了

//C++代码 <重启系统: 如果只是替换此文件,只需要注销即可>

void CRemove3721Dlg::RestartMyComputer(void)  
{  
	HANDLE hToken;   
	TOKEN_PRIVILEGES tkp;  

	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);  
	LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);   
	tkp.PrivilegeCount = 1;  
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);   

	ExitWindowsEx(EWX_REBOOT, 0);  
}  

  


//现在,让我们看看启动的时候做些什么

//C++代码 <重启过程中完成文件替换>

BOOL CRemove3721App::InitInstance()  
{  
	InitCommonControls();  
	CWinApp::InitInstance();  
	AfxEnableControlContainer();  

	//========== 以上是向导生成的代码 =========== 
	int nArgs;  
	LPWSTR *szArg = CommandLineToArgvW( GetCommandLineW(), &nArgs);  
	if( nArgs == 2)  
	{  
		CString  strBat(szArg[1]);  //利用构造函数完成unicode到multibyte的转换  
		GlobalFree(szArg);  
		
		//创建一个自定义desktop,防止出现dos窗口  
		LPSTR lpDeskName = "ClassyK_Replace_Windows_File";  // 随便给一个名字  
		HDESK hDesk = CreateDesktop( lpDeskName, NULL, NULL, 0, GENERIC_ALL, NULL);  
		
		//以下启动开始创建的bat文件来进行替换 
		STARTUPINFO si;  
		PROCESS_INFORMATION pi;  
		ZeroMemory( &si, sizeof(si) );  
		si.lpDesktop = lpDeskName;  
		si.wShowWindow = SW_HIDE;  
		si.dwFlags = STARTF_USESHOWWINDOW;  
		si.cb = sizeof(si);  
		ZeroMemory( &pi, sizeof(pi) );  
		CreateProcess( NULL, strBat.GetBuffer(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);  
		WaitForSingleObject( pi.hProcess, INFINITE ); // 等待进程完成,否则可能因为shdoclc.dll正使用而无法完成替换。  
		CloseDesktop( hDesk);  
		CloseHandle( pi.hProcess );  
		CloseHandle( pi.hThread );  
		
		// 重置shell为explorer  
		CString strShell = "Explorer.exe";  
		SHSetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "Shell", REG_SZ,   
			strShell, strShell.GetLength()); 
		
		// 运行原来的windows shell  
		WinExec( strShell, SW_SHOW); 
		return FALSE;   // 直接返回,退出本程序。 
	} 

	//========== 以下是向导生成的代码 ===========  
	CRemove3721Dlg dlg;  
	m_pMainWnd = &dlg;  
	INT_PTR nResponse = dlg.DoModal();  
	if (nResponse == IDOK)  
	{  
	}  
	else if (nResponse == IDCANCEL)  
	{  
	}  
	return FALSE;  
}
 


分享到:
评论

相关推荐

    系统文件替换工具Replacer

    在日常的计算机操作中,我们有时需要更改系统文件,例如替换正在使用的字体,以实现个性化设置或者解决某些软件兼容性问题。然而,直接替换系统文件往往面临诸多挑战,如文件正在使用无法替换、权限限制等。这时,一...

    Windows文件替换工具

    Windows文件替换工具设计的目标就是解决这个问题,它能够帮助用户绕过系统的保护机制,安全地替换那些通常无法直接修改的系统文件。在进行替换操作之前,用户必须对即将进行的操作有充分的理解,因为不正确的文件...

    Replacer.替换系统文件

    标题“Replacer....替换系统文件”是一款针对高级用户的工具,它提供了在保护系统稳定性的前提下,方便用户进行系统文件替换的手段。在使用这款工具时,用户需谨慎行事,遵循最佳实践,以确保系统的安全和稳定。

    Git闪退的替换文件-null.sys文件

    在给定的场景中,问题集中在“Git闪退”上,而解决方案是替换C:\Windows\System32\drivers\下的null.sys文件。 null.sys是一个系统文件,它在Windows操作系统中扮演着基础驱动的角色,主要负责处理与NULL设备相关的...

    windows文件保护”故障解决方法

    ### Windows文件保护故障解决方法详解 #### 一、概述 Windows 文件保护(Windows File Protection,简称 WFP 或 SFC)是微软操作系统中的一个重要组件,它主要用于保护系统文件免受未经授权的更改。当某些应用程序...

    XP系统系统盘Windows/system32/config/System文件丢失或损坏修复

    在使用Windows XP操作系统的过程中,可能会遇到系统文件丢失或损坏的问题,特别是重要的系统文件如`Windows/system32/config/System`。这个文件是Windows注册表的重要组成部分,存储了系统的基本配置信息,包括用户...

    替换使用中的文件.rar

    在IT领域,替换正在使用中的文件是一个常见的操作需求,但通常操作系统为了保护数据的完整性,不允许直接修改正在被其他程序占用的文件。然而,通过一些特定的方法和技术,我们可以实现这一目标。下面将详细介绍如何...

    WINDOWS默认系统声音文件

    在Windows操作系统中,系统声音是用户与电脑交互过程中的一个重要组成部分。它们涵盖了各种操作的反馈,比如开机、关机、错误提示、警告信息等。当你点击鼠标、打开或关闭程序时,这些声音会提供一种直观的听觉体验...

    Windows服务监控重启

    在IT管理领域,Windows服务是操作系统的核心组成部分,它们在后台执行特定的任务,为应用程序和系统提供支持。"Windows服务监控重启"是一个针对Windows服务管理的重要主题,尤其对于系统的稳定性和可靠性至关重要。...

    在Win2000 XP上安静地替换正在使用的系统文件.RAR

    在Windows 2000和XP操作系统中,替换正在被系统使用的文件是一项具有挑战性的任务,因为这些文件通常被系统进程占用,无法直接进行修改或替换。然而,有些情况下,如更新驱动程序、修复系统错误或者安装补丁,可能...

    使用系统文件检查器修复windows7系统文件出处:曲径通幽.rar

    在Windows 7操作系统中,有时由于病毒攻击、不正确的软件卸载或系统更新失败等原因,可能会导致系统文件损坏。在这种情况下,系统文件检查器(System File Checker,简称SFC)是一个非常有用的工具,它可以扫描并...

    Windows 7 替换 开机登陆界面

    总的来说,替换Windows 7的开机登录界面是一个既有趣又需谨慎的过程。在享受个性化的同时,也要注意系统的稳定性和安全性。通过以上步骤,你应该能够成功地改变你的开机登录界面,展示出与众不同的风格。

    去掉“Windows文件保护”提示框

    在使用Windows XP操作系统的过程中,用户可能会遇到一个常见的问题,即在尝试修改或替换系统文件时,系统会弹出“Windows文件保护”提示框,告知用户文件被保护,并阻止进行进一步的操作。这对于需要对系统文件进行...

    如何修复“Windows/System32/Config/System中文件丢失或损坏”故障

    当遇到“Windows/System32/Config/System中文件丢失或损坏”的问题时,这通常是由于注册表关键部分受损导致计算机无法正常启动。以下是一系列详细步骤来解决这个问题: 首先,尝试简单的方法:重启计算机并按F8键...

Global site tag (gtag.js) - Google Analytics