首页
社区
课程
招聘
[原创]淫戏植物大战僵尸篇之给游戏添加检测(一)
发表于: 2017-12-27 18:23 8424

[原创]淫戏植物大战僵尸篇之给游戏添加检测(一)

2017-12-27 18:23
8424







(1).查找适合的劫持对象


劫持Dll为:Version.dll  路径为红色的为程序运行再加载进来DLL的,网上这个dll的劫持源码也很多


(2). 加载系统原DLL:



(3).转发导出函数:


(4).加载检测模块:

劫持注入大概原理就是这样,这里推荐一款工具:AheadLib  因为懒我也用的工具生成的劫持代码

https://bbs.pediy.com/thread-196111.htm

(1).寻找信息提示CALL



可以看到鼠标焦点离开游戏窗口时弹出这个信息提示,我们OD搜索字符串: Click to resume game




找到字符串后双击进入,可以看到压入字符串常量的CALL都同一个,我们猜想应该是格式化字符串的。



上面是格式化函数,那下面 call eax 就一定是提示Call了 




可以看到ecx 为游戏基址的值,下面开始重载这个函数


判断是否进入游戏很简单 ,判断游戏基址的值是否为NULL即可


 

  • 劫持注入检测DLL
  • 封装消息提示CALL
  • 初始化检测
  • 应用Crc检测及实现简单的数据校验

(一) .为什么要采用劫持注入?

(二) .封装什么提示函数?

(三) .检测为什么要初始化?

(四) .Crc校验的原理和数据校验的原理是什么?



为什么要采用劫持注入?

  1. 劫持注入更为简单方便,不用控制注入的时机。
  2. 劫持注入可以更根底的应用各种检测,不用担心没有权限。
  3. 方便采集和备份原始数据



封装什么提示函数?



  1. 有防必有攻,弹出消息框可以更为显著的对抗检测    Ps:不然直接退出岂不很猥琐 (/手动滑稽)
  2. 寻找到游戏提示的消息框封装成函数方便调用 (强迫症患者的需要,不然直接MessageBox() 也行)
  3. Patch掉鼠标焦点移动到游戏窗口外出现的暂停窗口



检测为什么要初始化?



  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 编写劫持注入代码

  1. 劫持注入更为简单方便,不用控制注入的时机。
  2. 劫持注入可以更根底的应用各种检测,不用担心没有权限。
  3. 方便采集和备份原始数据



封装什么提示函数?



  1. 有防必有攻,弹出消息框可以更为显著的对抗检测    Ps:不然直接退出岂不很猥琐 (/手动滑稽)
  2. 寻找到游戏提示的消息框封装成函数方便调用 (强迫症患者的需要,不然直接MessageBox() 也行)
  3. Patch掉鼠标焦点移动到游戏窗口外出现的暂停窗口



检测为什么要初始化?



  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 编写劫持注入代码



封装什么提示函数?



  1. 有防必有攻,弹出消息框可以更为显著的对抗检测    Ps:不然直接退出岂不很猥琐 (/手动滑稽)
  2. 寻找到游戏提示的消息框封装成函数方便调用 (强迫症患者的需要,不然直接MessageBox() 也行)
  3. Patch掉鼠标焦点移动到游戏窗口外出现的暂停窗口



检测为什么要初始化?



  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 编写劫持注入代码

  1. 有防必有攻,弹出消息框可以更为显著的对抗检测    Ps:不然直接退出岂不很猥琐 (/手动滑稽)
  2. 寻找到游戏提示的消息框封装成函数方便调用 (强迫症患者的需要,不然直接MessageBox() 也行)
  3. Patch掉鼠标焦点移动到游戏窗口外出现的暂停窗口



检测为什么要初始化?



  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 编写劫持注入代码



检测为什么要初始化?



  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 编写劫持注入代码

  1. 采集和备份原数据
  2. 判断各类数据是否初始化以便于开启检测



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现



Crc校验的原理和数据校验的原理是什么?



  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  1. Crc检测也称 “循环冗余校验“   ,这里我们采用的是Crc32 
  2. 采集主模块镜像Crc校验值对于原数据,不想等则非法内存
  3. 数据校验的对象为阳光值 ,判断值是否为非法数据和对比短时间差阳光的变化值

三 .收集数据和实现

  • 寻找及封装PvzMessageBox() 消息提示函数

//格式化函数 Data[4]=Text Data[0x14]=len
char * Check::PvzFormatText(char* Data, LPCTSTR lpFormat, size_t strlen)
{
	strcpy(&Data[4], lpFormat);
	Data[0x14] = strlen;
	Data[0x18] = 0xF;
	return Data;

	//__try{
	//	ZeroMemory(MessageData, sizeof(char*));
	//	__asm{
	//		lea ecx, MessageData
	//			mov dword ptr[ecx + 0x18], 0xF
	//			mov edi, strlen
	//			push edi
	//			lea edi, lpFormat
	//			mov edi, [edi]
	//			push edi
	//			mov eax, CallFormat
	//			call eax
	//	}
	//}
	//__except (0){
	//	return NULL;
	//}

	//Asm

}

//信息提示CALL
int Check::PvzMessageBox(LPCTSTR lpCaption, LPCTSTR lpText, LPCTSTR lpButton)
{

	DWORD dwButton = (DWORD)PvzFormatText(PvzMessageData.szButton, lpButton, strlen(lpButton));
	DWORD dwText = (DWORD)PvzFormatText(PvzMessageData.szText, lpText, strlen(lpText));
	DWORD dwCaption = (DWORD)PvzFormatText(PvzMessageData.szCaption, lpCaption, strlen(lpCaption));
	__try{
		__asm{
			push 3
				mov eax, [dwButton]
				push eax
				mov eax, [dwText]
				push eax
				mov eax, [dwCaption]
				push eax
				push 1
				push 0x13
				mov ecx,GameBase
				mov ecx, [ecx]
				mov eax, [ecx]
				mov eax, [eax + 0x120]
				call eax
		}
		//delete[] TmpData;
	}
	__except (0){

	}
	return true;
}


(2).Patch 掉暂停窗口
 
BOOL Check::PatchPauseWnd()
{
	DWORD PatchAddr = 0x00452720;    //
	BYTE  OldData[1] = { 0x56 };		//push esi
	BYTE  PatchData[1] = { 0xC3 };   //ret
	BYTE  bufRead[1] = { 0 }; 
	BOOL  bIsPatched = FALSE;       //是否已找到目标并完成修改
	DWORD dwOldProtect;
	HANDLE hProcess = GetCurrentProcess();
	if (this->bInit)//如果已初始化就还原
	{
		VirtualProtect((LPVOID)PatchAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
		WriteProcessMemory(hProcess, (LPVOID)PatchAddr, &OldData, sizeof(OldData), NULL);
		bIsPatched = TRUE;
		VirtualProtect((LPVOID)PatchAddr, sizeof(DWORD), dwOldProtect, &dwOldProtect);
	} 
	else
	{
		while (!bIsPatched)
		{
			VirtualProtect((LPVOID)PatchAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
			ReadProcessMemory(hProcess, (LPVOID)PatchAddr, (LPVOID)bufRead, sizeof(bufRead), NULL);
			if (memcmp(bufRead, OldData, sizeof(OldData)) == 0)
			{
				WriteProcessMemory(hProcess, (LPVOID)PatchAddr, &PatchData, sizeof(PatchData), NULL);
				bIsPatched = TRUE;
			}
			VirtualProtect((LPVOID)PatchAddr, sizeof(DWORD), dwOldProtect, &dwOldProtect);
		}
	}
	return bIsPatched;

	//00452720    56              push esi
	//	00452721    8BF1            mov esi, ecx
	//	00452723    80BE 15090000 0 > cmp byte ptr ds : [esi + 0x915], 0x0
	//	0045272A    75 0F           jnz short PlantsVs.0045273B
	//	0045272C    E8 9FFFFFFF     call PlantsVs.004526D0
	//	00452731    84C0            test al, al
	//	00452733    74 06           je short PlantsVs.0045273B
	//	00452735    56              push esi
	//	00452736    E8 750F0000     call PlantsVs.004536B0
	//	0045273B    5E              pop esi; 7FFE0010
	//	0045273C    C3              retn
}

  • 初始化数据

(1).判断是否已进入游戏

(1).判断是否已进入游戏

判断是否进入游戏很简单 ,判断游戏基址的值是否为NULL即可


(2).获取主模块镜像Begin地址及长度

(2).获取主模块镜像Begin地址及长度


(3).初始化Crc表及保存Crc原始校验值

(3).初始化Crc表及保存Crc原始校验值


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 545
活跃值: (247)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
mark,前排支持
2017-12-27 19:03
0
雪    币: 7129
活跃值: (4070)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
曾经用过劫持Version.dll,发现有的系统不会加载这个DLL,还有能加载,但会导致程序无响应或死机.
不同的系统此DLL的导出函数也可能不同,不知大家有没有好的办法对付这些问题?
2017-12-27 22:50
0
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
chinarenjf 曾经用过劫持Version.dll,发现有的系统不会加载这个DLL,还有能加载,但会导致程序无响应或死机. 不同的系统此DLL的导出函数也可能不同,不知大家有没有好的办法对付这些问题?
低版本的API在高版本上都是可以调用的,所以你在win  xp或者win7上可以运行的程序导出函数在win10上也同样存在,或者你可以参考这个帖子
https://bbs.pediy.com/thread-216348.htm
2017-12-28 12:57
0
雪    币: 7129
活跃值: (4070)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习下...
2017-12-28 22:32
0
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
熟悉的Aheadlib
2018-1-3 20:58
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
chinarenjf 曾经用过劫持Version.dll,发现有的系统不会加载这个DLL,还有能加载,但会导致程序无响应或死机. 不同的系统此DLL的导出函数也可能不同,不知大家有没有好的办法对付这些问题?
有的是wow6目录下的,不一样
2018-2-13 04:42
0
雪    币: 161
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在游戏目录下找到一个dll添加导入表呢
2018-2-19 19:38
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
内存查看器楼主哪里下到的?
2018-6-7 10:01
0
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
petersonhz 内存查看器楼主哪里下到的?
www.cheatengine.org
2018-6-7 10:39
0
雪    币: 1380
活跃值: (116)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
小板凳学习
2018-6-7 10:48
0
游客
登录 | 注册 方可回帖
返回
//