网上下载的小游戏,试试看能不能让飞机自己躲子弹
看pe结构是一个固定基址不是变址这样就不用算偏移了
先是更具屏幕显示字符串找到打印函数
的位置
一步步向上看他的逻辑处理 堆栈返回地址 猜测用了bitblt 函数
找到关键判断
接着找子弹的地址 关键跳上面一个函数就是判断是否在子弹范围 里面肯定有子弹和飞机的x,y 坐标
发现他对 子弹坐标就行了加密 x,y 左移6位 减4 00409010 就是子弹地址 x,y 大小4位 int 00409010+4 是y坐标
x<320 y<240
找到飞机地址
飞机高宽都是 16
具体就是
40A554 飞机y轴 40A558 飞机x轴 40a540 子弹数量 i 00409010 子弹地址 ((arr+16*i)>>6)-4 00402fee 无敌 0f改e9 无敌
00402FEE 0F 84 F8 03 00 00 原先
00402FEE E9 F9 03 00 00 90 改后 无敌
int main() { //找class 类名返回窗口句柄 HWND hGameClass = FindWindow("wcTKKN", NULL); DWORD dwPID; RECT rc; GetClientRect(hGameClass, &rc); int nWidht = rc.right - rc.left; int nHeight = rc.bottom - rc.top; //返回进程号 GetWindowThreadProcessId(hGameClass, &dwPID); //返回进程句柄 HANDLE hGame = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID); //读地址数据 SIZE_T dwBytes; char szBuff[2]; //读多少个字节 //ReadProcessMemory(hGame, (LPVOID)0x00403616, szBuff, 1, &dwBytes); while (true) { int x = rand() % 300; int y = rand() % 220; if (x>256) { szBuff[1] =0x01; } szBuff[0] = (char)x; //更改飞机x坐标 WriteProcessMemory(hGame, (LPVOID)0x0040A558, szBuff, sizeof(szBuff), &dwBytes); szBuff[0] = (char)x; szBuff[1] = 0x00; //更改飞机y坐标 WriteProcessMemory(hGame, (LPVOID)0x0040A554, szBuff, sizeof(szBuff), &dwBytes); //创建矩形 范围 Sleep(300); } CloseHandle(hGame); system("pause"); }
后面就是把 320x240 范围的点 都去 从0 枚举304 0-224 找每一个点附近去匹配矩阵中是否有点 没有就跳过去 躲避子弹 比较简单的逻辑就不写了 大概就是这样