天天看點

外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰

外挂、破解軟體理論與實戰

1 理論

1.1 不同作業系統下的可執行檔案

  1. Windows【PE】

PE 格式,可移植可執行格式(Portable Executable),

是 Windows 下的主要可執行檔案格式。别被名字迷惑了,PE 檔案必須是 Windows 下的檔案。

  1. Linux【ELF】
在Linux系統的可執行檔案(ELF檔案,Executable and Linkable Format,可執行連結格式)中,開頭是一個檔案頭,用來描述程式的布局,整個檔案的屬性等資訊,包括檔案是否可執行、靜态還是動态連結及入口位址等資訊;生成的檔案不是純碎的二進制可執行檔案了,因為包含的程式頭不是可執行代碼;将這種包含程式頭的檔案讀入到記憶體後,從程式頭中讀取入口位址,跳轉到入口位址執行;
  1. 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 大體步驟

此處以

植物大戰僵屍

為例
  1. 打開visual studio,建立MFC項目(類似于java中的swing)
    外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
- 自定義log宏,簡化列印
- 事件注冊(手動、自動)
- 綁定變量(手動、自動)
- 單選框狀态讀取(勾選、不勾選)
           
  1. 将植物大戰僵屍的運作檔案(.exe檔案)拖動到OD中,觀察彙編
  • 修改彙編邏輯
    外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
前後修改盡量不動位元組數,比如:前面一行代碼占位元組,我們修改後的代碼占2位元組,
那麼我們就需要使用NOP填充,相當于是空,當cpu執行到nop時,會直接跳過,nop
隻起到一個占用位置的作用
           

思路:

①秒殺僵屍:直接用僵屍的原有血量 - 僵屍的血量
②無限陽光:陽光存在一個struct中,通過位址找到值,然後使用API修改記憶體中的值
           
  • 導出破解後的exe檔案
    外挂、破解軟體理論與實戰外挂、破解軟體理論與實戰
  1. 使用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;
}
           

繼續閱讀