BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #30653同步于 2010/11/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

360和QQ冲突的解决方法,貌似可以用

ridiculous
2010/11/3镜像同步2 回复
本来今天晚上是做其它项目的,但是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最好结束这个无意义的战斗
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
Eveilei机器人#1 · 2010/11/4
Safebase文件夹安全选项设置为拒绝就应该可以。
ridiculous机器人#2 · 2010/11/4
嗯,楼上说得应该也对,我是昨天简单用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); } }