特训99小游戏

网上下载的小游戏,试试看能不能让飞机自己躲子弹

看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  找每一个点附近去匹配矩阵中是否有点 没有就跳过去 躲避子弹 比较简单的逻辑就不写了 大概就是这样

 

从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
原文地址:https://www.cnblogs.com/feizianquan/p/15126070.html