返回信息流本来今天晚上是做其它项目的,但是360和QQ实在是太让人揪心了,于是我还是决定先解决这个问题再说,哎~担心明天项目验收啊
首先说操作和原理吧,估计如果要编程的话,一个晚上可能有点悬,何况还有其它事情,如果明天没有解决方案我再来编程,Sorry!!!
1、准备工作:我是XP环境SP2、SP3,我下了个ARK软件XueTr.exe
2、先启动QQ.exe,但是最好不要是有自动登录的,然后输入密码前,用XueTr查一次用户钩子,还原NtMapViewOfSection和ZwMapViewOfSection,这是两个Native API函数,对于加载的模块有检查,所以格外小心,虽然目前不清楚宿主是谁,但是最好还原。
3、进入XueTr的文件功能,在“C:\Documents and Settings\Administrator\Application Data\Tencent\QQ\SafeBase\”这个目录中选择强制删除并且阻止,注意必须阻止,因为如果你只是删除,QQ启动后会自动恢复,我感觉这就是检查到你电脑有360的一个地方
注意:对于编程实现的同学说一下,利用DuplicateHandle的方法,建立一个同名空文件把句柄拷贝到一个远程进程即可,这就是网上说的“文件占坑”,简单方便。
4、这个时候你可以启动QQ了
其实关键就是2个:第一最好在QQ启动前,把QQ内有360XX的模块卸载掉,把模块映射函数补丁去掉;第二就是一定不能让SafeBase下面的玩意起死回生,不然就完了。
PS:Vista和Win7我有空再看,明天项目验收,我要加油了。顺便祝愿360和QQ最好结束这个无意义的战斗
这是一条镜像帖。来源:北邮人论坛 / security / #30653同步于 2010/11/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
360和QQ冲突的解决方法,貌似可以用
ridiculous
2010/11/3镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
嗯,楼上说得应该也对,我是昨天简单用OD发现的。早上起来时间紧张了点,临时写了个DEMO,先凑合吧:
#include <stdio.h>
#include <windows.h>
// 删除文件并“文件占坑”的方法
BOOL OccupyAndDeleteFileW(LPCWSTR lpFileName);
// 提升进程权限(可能仅限于XP用户,其他同学试试吧)
void RaiseToDebugPrivilege();
int main(int argc, char* argv[])
{
WCHAR wszFileName[MAX_PATH] = {0};
//那个SAFEBASE目录下所有的都这么清理下最好,这里以tseh.dat为例子
ExpandEnvironmentStringsW(L"%APPDATA%\\Tencent\\QQ\\SafeBase\\tseh.dat", (LPWSTR)&wszFileName, MAX_PATH);
OccupyAndDeleteFileW(wszFileName);
return 0;
}
BOOL OccupyAndDeleteFileW( LPCWSTR lpFileName )
{
BOOL bRet;
// 该操作需要高权限
RaiseToDebugPrivilege();
// 4为SYSTEM进程号
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);
if ( hProcess == NULL )
{
return FALSE;
}
// 先删除原始文件
SetFileAttributesW(lpFileName,FILE_ATTRIBUTE_NORMAL);
DeleteFileW(lpFileName);
// 然后创建新文件
HANDLE hFile;
HANDLE hTargetHandle;
hFile = CreateFileW(lpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
CloseHandle( hProcess );
return FALSE;
}
// 拷贝新文件句柄,从己进程拷贝到系统进程中
bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
CloseHandle( hProcess );
return bRet;
}
void RaiseToDebugPrivilege()
{
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}
}