外挂、破解軟體理論與實戰
1 理論
1.1 不同作業系統下的可執行檔案
- Windows【PE】
PE 格式,可移植可執行格式(Portable Executable),
是 Windows 下的主要可執行檔案格式。别被名字迷惑了,PE 檔案必須是 Windows 下的檔案。
- Linux【ELF】
在Linux系統的可執行檔案(ELF檔案,Executable and Linkable Format,可執行連結格式)中,開頭是一個檔案頭,用來描述程式的布局,整個檔案的屬性等資訊,包括檔案是否可執行、靜态還是動态連結及入口位址等資訊;生成的檔案不是純碎的二進制可執行檔案了,因為包含的程式頭不是可執行代碼;将這種包含程式頭的檔案讀入到記憶體後,從程式頭中讀取入口位址,跳轉到入口位址執行;
- Mac【Mach-O】
Mach-O為Mach Object檔案格式的縮寫,它是一種用于可執行檔案,目标代碼,動态庫,核心轉儲的檔案格式。作為a.out格式的替代,Mach-O提供了更強的擴充性,并提升了符号表中資訊的通路速度。
1.2 Windows下軟體破解知識
◼ Windows平台軟體破解必備知識
檔案格式:PE檔案
彙編語言:x86、x64彙編
工具:Ollydbg
Windows API
◼ OD常用快捷鍵
F2:切換斷點
F9:運作程式
F7:Step Into
F8:Step Over
Ctrl + G:搜尋代碼
1.3 加殼與脫殼
- 一般的軟體破解思路
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰 - 加殼後的軟體破解思路(在普通軟體上多了一層)
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
1.4 外挂的本質
常見的外挂有2種做法:
- 修改記憶體中的資料
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰 - 修改記憶體中的代碼
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
通過OD軟體修改彙編代碼,然後重新儲存為新的.exe檔案
2 實戰步驟
軟體位址:
連結:https://pan.baidu.com/s/1pIogCuXPR87p91og09zZZQ?pwd=zj8k
提取碼:zj8k
2.1 環境準備
visual studio 2022:c++桌面開發(MFC)、visual studio擴充開發
擴充開發:
2.2 OD彙編(Ollydbg)
将.exe檔案轉化為彙編
2.4 cheaterEngines
用于檢測記憶體中數值變化
2.5 大體步驟
此處以 植物大戰僵屍
為例
- 打開visual studio,建立MFC項目(類似于java中的swing)
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
- 自定義log宏,簡化列印
- 事件注冊(手動、自動)
- 綁定變量(手動、自動)
- 單選框狀态讀取(勾選、不勾選)
- 将植物大戰僵屍的運作檔案(.exe檔案)拖動到OD中,觀察彙編
- 修改彙編邏輯
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
前後修改盡量不動位元組數,比如:前面一行代碼占位元組,我們修改後的代碼占2位元組,
那麼我們就需要使用NOP填充,相當于是空,當cpu執行到nop時,會直接跳過,nop
隻起到一個占用位置的作用
思路:
①秒殺僵屍:直接用僵屍的原有血量 - 僵屍的血量
②無限陽光:陽光存在一個struct中,通過位址找到值,然後使用API修改記憶體中的值
- 導出破解後的exe檔案
外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
- 使用spy++查找視窗
windows外挂桌面開發可能需要擷取到運作檔案的句柄(ID),然後控制
4. 修改visual studio中的代碼【部分】
秒殺僵屍、無限陽光
// 用來監控遊戲的線程
DWORD monitorThreadFunc(LPVOID lpThreadParameter) {
while (1) {
// 獲得植物大戰僵屍視窗的句柄
HWND windowHandle = FindWindow(CString("MainWindow"), CString("植物大戰僵屍中文版"));
if (windowHandle == NULL) {
g_dlg->m_bnKill.SetCheck(FALSE);
g_dlg->m_bnSun.SetCheck(FALSE);
g_dlg->m_bnKill.EnableWindow(FALSE);
g_dlg->m_bnSun.EnableWindow(FALSE);
g_processHandle = NULL;
} else if (g_processHandle == NULL) {
g_dlg->m_bnKill.EnableWindow(TRUE);
g_dlg->m_bnSun.EnableWindow(TRUE);
// 獲得植物大戰僵屍的程序ID
DWORD processPid;
GetWindowThreadProcessId(windowHandle, &processPid);
// 獲得植物大戰僵屍的程序句柄
g_processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processPid);
}
if (g_dlg->m_bnSun.GetCheck()) { // 需要無限陽光
DWORD value = 9990;
WriteMemory(&value, sizeof(value), 0x6A9EC0, 0x320, 0x8, 0x0, 0x8, 0x144, 0x2c, 0x5560, -1);
}
// 休息睡眠
Sleep(1000);
}
return NULL;
}