连连看外挂制作 —— 无限时间(2)

标 题: 连连看外挂制作 —— 无限时间(2)
作 者:
Koma
时 间: 2009-12-11 08:10
链 接:
http://blog.csdn.net/wangningyu/archive/2009/12/11/4983620.aspx

 

本章节会介绍用远程线程,来锁定远程进程内存数值。你可以给它XX一个文件补丁来取消限制,因为这里实际上是SetTimer(NULL,1,2004) ,如果你熟悉crack,所以请安静的点击这里 离开......

 

1、准备工具:

     Visual C++6.0 、Cheat Engine5.4、FlexEdit

 

2、查找内存:

     打开连连看,最终可以锁定到下面的四个偏移地址:

连连看外挂制作 —— 无限时间(2)_第1张图片

 

     仍然按照上面的方法添加定时器来修改这三个地址的数值,始终未果... 用CE发现锁定一个偏移地址的数值,就会取消时间限制,而VirtualLock并没有提供句柄值,所以不能在本进程直接锁定远程进程的内存数值。

 

     于是想到了远程线程,我将代码注入到远程线程再修改进程内存数值、锁定内存,因为当该代码是在远程进程地址空间执行,所以你可以轻松地使用WriteProcessMemory、VirtualLock来修改锁定内存数值。既然思路有了,剩下的我想也不会太难吧!

 

3、代码实现

     如果上面看懂,下面这些代码理解起来应该也是比较容易的:

 

// Dll.cpp : Defines the entry point for the DLL application. // // 连连看外挂制作(2) —— 修改游戏剩余时间 // // by Koma 2009.12.10 23:05 // http://blog.csdn.net/wangningyu #include "stdafx.h" #include <windows.h> /************************************************************************/ /* 全局变量、全局函数 /************************************************************************/ BOOL g_bRet = NULL; // 锁定状态 DWORD _stdcall ThreadProc(LPVOID lParam); // 线程函数 /************************************************************************/ /* 函数说明:DllMain入口函数 /* 参 数:无 /* 返 回 值:成功返回TRUE,失败返回FALSE /* By:Koma 2009.12.12 23:30 /************************************************************************/ BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { DWORD dwThread; // 保存线程PID HANDLE hThread; // 保存线程句柄 switch(ul_reason_for_call) // 判断状态 { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: g_bRet = TRUE; // 启动线程、开始锁定内存数值 hThread = ::CreateThread(NULL,0,ThreadProc,(LPVOID)NULL,0,&dwThread); break; } return TRUE; } /************************************************************************/ /* 函数说明:线程函数 —— 修改时间限制、锁定内存 /* 参 数:无 /* 返 回 值:无 /* By:Koma 2009.12.12 23:55 /************************************************************************/ DWORD _stdcall ThreadProc(LPVOID lParam) { while(g_bRet) { DWORD dwPid; // 游戏进程PID HANDLE hLink; // 游戏进程句柄 int dwData = 10000; // 数值内容 BOOL bLocked; // 锁定状态 dwPid = GetCurrentProcessId(); // 获取远程进程PID、打开进程 hLink = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_TERMINATE | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,FALSE,dwPid); if(hLink) { // 修改游戏内存值 WriteProcessMemory(hLink,(LPVOID)0x00B0526C,&dwData,2,NULL); Sleep(10); } // 锁定内存地址 bLocked = VirtualLock((LPVOID)0x00B0526C,2); if(!bLocked) { MessageBox(NULL,"Error !",0,0); // 锁定失败则返回 return -1; } CloseHandle(hLink); } return 0; }

    下面是用来注入代码相关的代码:

void CLinkDlg::OnCancel() { // TODO: Add extra cleanup here HWND hWnd; HANDLE hLink; DWORD dwPid; char szPath[MAX_PATH] = "C://Project//Dll//Debug//Dll.dll"; hWnd = ::FindWindow(NULL,"水晶连连看"); if(hWnd == NULL) { MessageBox("水晶连连看没有运行!"); return; } // 获取进程PID、打开进程 GetWindowThreadProcessId(hWnd,&dwPid); hLink = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_TERMINATE | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,FALSE,dwPid); int nCb; HANDLE hThread; PTHREAD_START_ROUTINE pfnStartAddr; nCb = (1+lstrlen(szPath))*sizeof(char); char *RemoteFile = (char*)VirtualAllocEx(hLink,NULL,nCb,MEM_COMMIT,PAGE_READWRITE); WriteProcessMemory(hLink,RemoteFile,(LPVOID)szPath,nCb,NULL); // 获取函数地址、创建远程线程 pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA"); hThread = CreateRemoteThread(hLink,NULL,0,pfnStartAddr,RemoteFile,0,NULL); // 等待远程线程启动、关闭句柄 WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); VirtualFreeEx(hLink,RemoteFile,0,MEM_RELEASE); CloseHandle(hLink); }


4、运行效果

 

5、源码下载

     官盘下载:http://www.rayfile.com/files/4ba8ca63-e5f8-11de-936b-0014221b798a/

 

你可能感兴趣的:(thread,游戏,null,dll,Access,Path)