QQ连连看 逆向分析外挂制作报告【脱壳ASPPack】【模拟点击】【内联HOOK】

谁说胖子不能爱 提交于 2020-04-28 22:06:16

一、工具介绍

使用工具:Ollydbg,PEID,ImpREC,Cheat Engine,火绒剑

实现功能:除去广告,游戏秒杀。

   

二、除去广告

1、初始判断

点击开始游戏,弹出窗口,点击继续,弹出游戏界面。

   

   

   

查看火绒剑进程信息,发现了创建了两个进程,为以下创建关系。

qqllk.exe -> qqllk.ocx -> kyodai.exe

   

直接运行kyodai.exe,程序奔溃。

直接运行qqllk.ocx(需修改后缀名),可运行。判断qqllk.ocx 对了kyodai.exe进行某些操作。

   

2、脱壳

   

对qqllk.ocx(需修改后缀名)进行信息查看

通过PEID 可以看出,程序加了ASPack壳

   

   

通过ESP定律,OD插件OllyDump,ImpREC, 脱除

   

   

脱除效果:

   

   

   

3、去广告

在脱壳后程序下API断点:CreateProcessA

查看堆栈信息,发现kyodai.exe进程在创建时被挂起

 

   

ctrl+F8自动步过,发现进行了一系列的循环操作,猜测在修改kyodai.exe的进程数据

   

   

下API断点:ResumeThread

发现进程恢复后游戏启动

   

   

可推断qqllk.ocx进程 创建 kyodai.exe进程并挂起

再对 kyodai.exe进程 进行了数据解密恢复

接着恢复进程运行游戏

   

恢复进程时,OD附加kyodai.exe进程,在OEP下断,并dump进程,完成去广告。

   

   

4、总结

一共创建了三个进程,分别对应qqllk.exe -> qqllk.ocx -> kyodai.exe 程序。

kyodai.exe 程序数据被加密,需要qqllk.ocx进程解密恢复运行。

   

三、秒杀游戏

1初始判断

通过连连看的试玩,猜测存储地图图标元素,是个地图数组

存储道具列表元素,是个道具数据列表

   

目标:得到雷的类型数据,

得到道具列表位置,

修改道具数据列表

实现模拟点击

完成秒杀

2、目标逐步完成

雷数据类型:

猜测地图数组需要随机初始化,在OD下API断点:rand

在断下来的地方,进行回溯逆向分析,

找到地图数组

   

随机初始化数组后,得到雷的数据类型。

   

   

随机初始化后地图数组

   

   

道具列表:

用CE附加进程,找到道具列表的雷数 数据地址,

进而锁定道具数据列表

   

   

   

   

模拟点击坐标:

通过回调函数,下右键点击 消息断点LBUTTONDOWN,获取坐标。

 

 3、实现方案

  1. 修改道具y数据列表
  2. 实现模拟点击

    完成秒杀游戏

     

    4、功能代码

    //实现代码:
    
    //找到进程
    
    HANDLE ReProcess = 0;
    
    PROCESSENTRY32 pe32;
    
    pe32.dwSize = sizeof(pe32);
    
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    BOOL bMore = ::Process32First(hProcessSnap, &pe32);
    
       
    
    //多字节转宽字节
    
    WCHAR proname[10] = {};
    
    MultiByteToWideChar(CP_ACP, MB_COMPOSITE, "kyodai.exe", 10, proname, 10);
    
     
    
    while (bMore)
    
    {
    
    if (wcscmp(pe32.szExeFile, proname) == 0)
    
    {
    
    ReProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
    
    break;
    
    }
    
    bMore = Process32Next(hProcessSnap, &pe32);
    
    }
    
     
    
    HANDLE process;
    
    process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 0xeb4);
    
       
    
    ////修改堆数据
    
     
    
    //修改雷类型
    
    BYTE leitype = 0xF4;
    
    SIZE_T num = 0;
    
    WriteProcessMemory(ReProcess, (LPVOID)0x12ac7d, &leitype, 1, &num);
    
       
    
    //修改雷数
    
    BYTE leishu = 0x99;
    
    SIZE_T shu = 0;
    
    WriteProcessMemory(ReProcess, (LPVOID)0x12ac7e, &leishu, 1, &shu);
    
       
    
    HWND window = FindWindowA(NULL, "QQ连连看");
    
       
    
    //发送模拟点击
    
    for (int i = 0; i < 100; i++)
    
    {
    
    Sleep(50);
    
    PostMessage(window, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(681, 200));
    
    printf("发送%d次\n", i);
    
    }
    
    ////完成

     

        

    四、附加:升级提升

    1、缺陷改进

    可见地图数组 和 道具数据列表 是堆空间,一旦重启电脑 或 更换电脑,数据地址将变化,外挂代码失效。

    两种决解方案:1. Hook往道具列表赋值的指令,获取寄存器的值,从而实时获取堆空间地址。

    2.修改往道具列表赋值的指令,实现按自己的意愿修改道具列表

       

    这里采用第2种方案:

     

    在道具数据列表 下硬件写入断点,回溯分析到 道具判断的地方。

       

       

       

    2、改进功能代码

    //实现代码:
    
    //找到进程
    
    HANDLE ReProcess = 0;
    
    PROCESSENTRY32 pe32;
    
    pe32.dwSize = sizeof(pe32);
    
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    BOOL bMore = ::Process32First(hProcessSnap, &pe32);
    
       
    
    //多字节转宽字节
    
    WCHAR proname[10] = {};
    
    MultiByteToWideChar(CP_ACP, MB_COMPOSITE, "kyodai.exe", 10, proname, 10);
    
       
    
    while (bMore)
    
    {
    
    if (wcscmp(pe32.szExeFile, proname) == 0)
    
    {
    
    ReProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
    
    break;
    
    }
    
    bMore = Process32Next(hProcessSnap, &pe32);
    
    }
    
       
    
    //修改指令
    
    DWORD attibute;
    
       
    
    VirtualProtectEx(ReProcess, (LPVOID)0x0041de2e, 0x7, PAGE_READWRITE, &attibute);
    
       
    
    //cmp bl,0x0
    
    BYTE OPecode1[] = { '\x66', '\xc7', '\x40', '\x01', '\xf4', '\x99' ,'\x90' };
    
    DWORD num;
    
       
    
    WriteProcessMemory(ReProcess, (LPVOID)0x0041de2e, OPecode1, 7, &num);
    
       
    
    VirtualProtectEx(ReProcess, (LPVOID)0x0041de2e, 0x7, attibute, &attibute);
    
       
    
    CloseHandle(ReProcess); 
    
       
    
    HWND window = FindWindowA(NULL, "QQ连连看");
    
       
    
    //发送模拟点击消息
    
    for (int i = 0; i < 100; i++)
    
    {
    
    Sleep(50);
    
    PostMessage(window, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(681, 200));
    
    printf("发送%d次\n", i);
    
    }
    
     ////完成

     

       

    五、效果

    完成除去广告,秒杀游戏

     

     

    个人总结:我比较喜欢内联HOOK

    附件:

     QQ连连看外挂.exe

    KID

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!