一、工具介紹
使用工具: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、實作方案
- 修改道具y資料清單
- 實作模拟點選
完成秒殺遊戲
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
KIDofot