天天看點

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

一、工具介紹

使用工具:Ollydbg,PEID,ImpREC,Cheat Engine,火絨劍

實作功能:除去廣告,遊戲秒殺。

二、除去廣告

1、初始判斷

點選開始遊戲,彈出視窗,點選繼續,彈出遊戲界面。

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

檢視火絨劍程序資訊,發現了建立了兩個程序,為以下建立關系。

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

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

直接運作kyodai.exe,程式奔潰。

直接運作qqllk.ocx(需修改字尾名),可運作。判斷qqllk.ocx 對了kyodai.exe進行某些操作。

2、脫殼

對qqllk.ocx(需修改字尾名)進行資訊檢視

通過PEID 可以看出,程式加了ASPack殼

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

通過ESP定律,OD插件OllyDump,ImpREC, 脫除

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

脫除效果:

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

3、去廣告

在脫殼後程式下API斷點:CreateProcessA

檢視堆棧資訊,發現kyodai.exe程序在建立時被挂起

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

ctrl+F8自動步過,發現進行了一系列的循環操作,猜測在修改kyodai.exe的程序資料

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

下API斷點:ResumeThread

發現程序恢複後遊戲啟動

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

可推斷qqllk.ocx程序 建立 kyodai.exe程序并挂起

再對 kyodai.exe程序 進行了資料解密恢複

接着恢複程序運作遊戲

恢複程序時,OD附加kyodai.exe程序,在OEP下斷,并dump程序,完成去廣告。

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

4、總結:

一共建立了三個程序,分别對應qqllk.exe -> qqllk.ocx -> kyodai.exe 程式。

kyodai.exe 程式資料被加密,需要qqllk.ocx程序解密恢複運作。

三、秒殺遊戲

1、初始判斷

通過連連看的試玩,猜測存儲地圖圖示元素,是個地圖數組

存儲道具清單元素,是個道具資料清單

目标:得到雷的類型資料,

得到道具清單位置,

修改道具資料清單

實作模拟點選

完成秒殺

2、目标逐漸完成

雷資料類型:

猜測地圖數組需要随機初始化,在OD下API斷點:rand

在斷下來的地方,進行回溯逆向分析,

找到地圖數組

随機初始化數組後,得到雷的資料類型。

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

随機初始化後地圖數組

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

道具清單:

用CE附加程序,找到道具清單的雷數 資料位址,

進而鎖定道具資料清單

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

模拟點選坐标:

通過回調函數,下右鍵點選 消息斷點LBUTTONDOWN,擷取坐标。

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

 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種方案:

在道具資料清單 下硬體寫入斷點,回溯分析到 道具判斷的地方。

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】
QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

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);

}

 ////完成      

五、效果

完成除去廣告,秒殺遊戲

QQ連連看 逆向分析外挂制作報告【脫殼ASPPack】【模拟點選】【内聯HOOK】

個人總結:我比較喜歡内聯HOOK

附件:

 QQ連連看外挂.exe

KIDofot