首页
社区
课程
招聘
[旧帖] [讨论]qq连连看无法用CE读取内存问题 0.00雪花
发表于: 2011-9-13 12:49 2418

[旧帖] [讨论]qq连连看无法用CE读取内存问题 0.00雪花

2011-9-13 12:49
2418
我一打开CE附加到QQ连连看,连连看就报错。
后来知道它貌似是写保护了,用工具过了NTOpenProcess.
OK~~,CE可以附加到连连看了,
可是我扫描了几次内存,又报错了,于是明白它还hook了别的函数,
于是怀疑NtReadProcessMemory 和 NtWriteProcessMemory被改了。
所以 ……又要继续学习驱动了。
这里我想问问各位前辈或者曾经和我遇到相同问题的同学,
学习驱动过保护除了郁金香的教程,还有更系统更全面的书籍或者教程吗?
麻烦推荐一些~~谢谢~~~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不怎么会,帮顶。。。
2011-9-13 16:39
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个真的比较高深
2011-9-16 11:59
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
同样地问题困扰我。。。。,求解
2011-9-16 14:09
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我刚才试了下用CE6.0中文版报错了
但是用以前不知道在哪下的的CE5.5的英文版,可以正常加载
2011-9-16 17:51
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你那不叫学驱动 兄弟。你那是学工具 套别人技术。
灭线程、恢复函数
2011-9-16 18:17
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这样就可以的,慢慢来,在看些教程,开始都是套别人技术,等多了就理解了
2011-12-25 17:44
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
等待中,学习中
2011-12-25 19:52
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还真不是很了解!谁帮帮忙
2011-12-25 20:13
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
用VS 编译这下面的代码就OK了

#include "stdafx.h"
#include "windows.h"
#include "TlHelp32.h"
const TCHAR QQ_GAME[] = _T("QQGame.exe");
const TCHAR QQ_THREAD_DLL[] = _T("TenSLX.dll");

typedef   enum   _THREADINFOCLASS   {
  ThreadBasicInformation,
  ThreadTimes,
  ThreadPriority,
  ThreadBasePriority,
  ThreadAffinityMask,
  ThreadImpersonationToken,
  ThreadDescriptorTableEntry,
  ThreadEnableAlignmentFaultFixup,
  ThreadEventPair_Reusable,
  ThreadQuerySetWin32StartAddress,
  ThreadZeroTlsCell,
  ThreadPerformanceCount,
  ThreadAmILastThread,
  ThreadIdealProcessor,
  ThreadPriorityBoost,
  ThreadSetTlsArrayAddress,
  ThreadIsIoPending,
  ThreadHideFromDebugger,
  ThreadBreakOnTermination,
  MaxThreadInfoClass
}   THREADINFOCLASS;

typedef LONG (__stdcall *_pfnZwQueryInformationThread) (
  IN   HANDLE   ThreadHandle,
  IN   THREADINFOCLASS   ThreadInformationClass,
  OUT   PVOID   ThreadInformation,
  IN   ULONG   ThreadInformationLength,
  OUT   PULONG   ReturnLength   OPTIONAL
  );

HANDLE m_GameProcessHandle;
//记录QQ_THREAD_DLL信息
BYTE  * m_pmodBaseAddr;
DWORD   m_dwmodBaseSize;
_pfnZwQueryInformationThread m_pfnZwQueryInformationThread;

BOOL StartPatch();//PATCHQQ主函数
DWORD EnablePrivilege (LPCTSTR name);//提权函数
BOOL ListProcessModules(DWORD dwPID);//枚举指定进程的模块
BOOL ListProcessThreads( DWORD dwOwnerPID);//枚举指定进程创建的线程,并结束掉QQ保护线程
PVOID ShowThreadInfo(DWORD tid);//获取线程的起始地址

int _tmain(int argc, _TCHAR* argv[])
{
  m_pfnZwQueryInformationThread =(_pfnZwQueryInformationThread)\
    GetProcAddress   (LoadLibrary(_T("ntdll.dll")),"ZwQueryInformationThread");

  if (StartPatch())
  {
    printf("可以CE附加QQ游戏大厅了\n");
  }
  else
    printf("失败!\n");
  return 0;
}

BOOL StartPatch()
{
  if(0!=EnablePrivilege (SE_DEBUG_NAME))  
  {
    return FALSE;  
  }
  HANDLE hProcessSnap;
  PROCESSENTRY32 pe32;

  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    return FALSE;
  }

  pe32.dwSize = sizeof( PROCESSENTRY32 );

  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    CloseHandle( hProcessSnap );
    return FALSE;
  }

  BOOL bStartGame = FALSE;
  do
  {
    if (_tcscmp(pe32.szExeFile, QQ_GAME) == 0)
    {
      bStartGame = TRUE;
      m_GameProcessHandle = OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION,\
        FALSE, pe32.th32ProcessID);
      if (m_GameProcessHandle == NULL)
      {
        return FALSE;
      }
      for (int i=0; i<5;i++)
      {
        if (!ListProcessModules(pe32.th32ProcessID))
        {
          return FALSE;
        }

      }
      if (!ListProcessThreads(pe32.th32ProcessID))
      {
        return FALSE;
      }
    }

  } while( Process32Next( hProcessSnap, &pe32 ) );

  if (!bStartGame)
  {
    MessageBox(NULL,_T("运行QQ大厅后才能使用"),_T("提示"),MB_OK);
    return FALSE;
  }
  CloseHandle( hProcessSnap );
  return TRUE;
}
DWORD EnablePrivilege (LPCTSTR name)  
{  
  HANDLE hToken;  
  BOOL rv;  
  //设置结构   
  TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };  
  // 查找权限值   
  LookupPrivilegeValue (  
    0,  
    name,  
    &priv.Privileges[0].Luid  
    );  
  // 打开本进程Token   
  OpenProcessToken(  
    GetCurrentProcess (),  
    TOKEN_ADJUST_PRIVILEGES,  
    &hToken  
    );  
  // 提权   
  AdjustTokenPrivileges (  
    hToken,  
    FALSE,  
    &priv,  
    sizeof priv,  
    0,  
    0  
    );  
  // 返回值,错误信息,如果操作成功,则应为ERROR_SUCCESS,为O   
  rv = GetLastError();  
  // 关闭Token   
  CloseHandle (hToken);  
  return rv;  
}  
BOOL ListProcessModules(DWORD dwPID)
{
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
  MODULEENTRY32 me32;

  hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
  if( hModuleSnap == INVALID_HANDLE_VALUE )
  {
    return( FALSE );
  }

  me32.dwSize = sizeof( MODULEENTRY32 );
  if( !Module32First( hModuleSnap, &me32 ) )
  {
    CloseHandle( hModuleSnap );
    return( FALSE );
  }
  do
  {
    if (_tcscmp(me32.szModule, QQ_THREAD_DLL) == 0)
    {
      m_pmodBaseAddr = me32.modBaseAddr;
      m_dwmodBaseSize = me32.modBaseSize;

    }

  }while( Module32Next( hModuleSnap, &me32 ));

  CloseHandle( hModuleSnap );
  return( TRUE );

}
BOOL ListProcessThreads( DWORD dwOwnerPID)
{
  HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
  THREADENTRY32 te32;
  PVOID addr;

  hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
  if( hThreadSnap == INVALID_HANDLE_VALUE )
    return( FALSE );

  te32.dwSize = sizeof(THREADENTRY32 );

  if( !Thread32First( hThreadSnap, &te32 ) )
  {
    CloseHandle( hThreadSnap );
    return( FALSE );
  }

  do
  {
    if( te32.th32OwnerProcessID == dwOwnerPID )
    {
      addr = ShowThreadInfo(te32.th32ThreadID);
      if(((DWORD)addr>(DWORD)m_pmodBaseAddr)&&((DWORD)addr<\
        ((DWORD)m_pmodBaseAddr+(DWORD)m_dwmodBaseSize)))
      {

        HANDLE oth=OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);
        //关闭这个线程
        TerminateThread(oth, 0);
      }
    }
  } while( Thread32Next(hThreadSnap, &te32 ) );

  CloseHandle( hThreadSnap );
  return( TRUE );
}
PVOID ShowThreadInfo(DWORD tid)
{

  PVOID                    startaddr;
  HANDLE                   thread;     
  //thread = m_pfnOpenThread_ex(THREAD_ALL_ACCESS,FALSE,tid);
  thread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid);
  if   (thread   ==   NULL)
    return   FALSE;

  m_pfnZwQueryInformationThread(thread,
    ThreadQuerySetWin32StartAddress,   
    &startaddr,   
    sizeof(startaddr),   
    NULL);

  CloseHandle   (thread);
  return   startaddr;
}
2012-7-11 17:15
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
高深,先顶再说!
2012-7-12 15:43
0
游客
登录 | 注册 方可回帖
返回
//