学习目标:
动态定位基址
编写相关函数
编写特征码定位函数ScanFeatureCode
//1把特征码转换成全大写
//2读取游戏字节数组数据
//3转换成十六进制字串
//4十六进制 字串比较 找到则返回地址 未找到返回0
DWORD ScanFeatureCode(HANDLE hProcess,//进程句柄
IN OUT char* szpFeatureCode,
DWORD ndStartAddress,
DWORD ndEndAddress
);
作业:优化算法 提升函数速度;
//www.yjxsoft.com QQ150330575
//时间:2014.11月
//函数名:ScanFeatureCode 功能:特征定位
//1把特征码转换成全大写
//2读取游戏字节数组数据
//3转换成十六进制字串
//4十六进制 字串比较 找到则返回地址 未找到返回0
#define PAGESIZE 0x1024 //每次读取的大小 1KB
DWORD ScanFeatureCode(HANDLE hProcess,//进程句柄
IN OUT char* szpFeatureCode,
DWORD ndStartAddress,
DWORD ndEndAddress
)
{
//如果存在小写字母 则全转大写
HexStrToBigCase(szpFeatureCode);
DWORD ndLenHexCode=strlen(szpFeatureCode);//0xAF
BYTE *nbDataBuf=new BYTE[PAGESIZE+ndLenHexCode/2+2];//每次要读取的缓冲区大小
DWORD ndByReadSize=0;//实际读取缓冲区大小
for (DWORD ndCurAddr=ndStartAddress;ndCurAddr<ndEndAddress-ndLenHexCode/2;ndCurAddr=ndCurAddr+PAGESIZE)
{
ReadProcessMemory(hProcess,(LPVOID)ndCurAddr,(LPVOID)nbDataBuf,PAGESIZE+ndLenHexCode/2+2,&ndByReadSize);
//nbDataBuf 逐字节比较数据
for (DWORD i=0;i<PAGESIZE;i++)
{
char szpTempHex[256]="";
BytesToHexStr(&nbDataBuf,ndLenHexCode/2,szpTempHex);
if (HexStrCmp(szpFeatureCode,szpTempHex)!=FALSE)
{
return ndCurAddr+i;//
}
}
}
return NULL;
}
如有转载请注明:转自郁金香技术论坛
交流群:29817979