您的位置:首页 > 其它

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

2009-12-11 08:04 197 查看
标 题:

连连看外挂制作 —— 无限时间(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、查找内存:



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



 

     仍然按照上面的方法添加定时器来修改这三个地址的数值,始终未果... 用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/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息