プラグインとクラックされたソフトウェアの理論と実践
1理論
1.1 異なるオペレーティング システムでの実行可能ファイル
- Windows【PE】
PE 形式 (Portable Executable) は、
Windows での主要な実行可能ファイル形式です。名前に騙されないでください。PE ファイルは Windows 上のファイルでなければなりません。
- Linux【エルフ】
Linuxシステムの実行可能ファイル(ELFファイル、Executable and Linkable Format、実行可能リンク形式)は、先頭がファイルヘッダであり、プログラムのレイアウトやファイル全体の属性などの情報を記述します。ファイルが実行可能であるか、静的または動的リンクであるか、エントリアドレスおよびその他の情報が含まれます。含まれるプログラムヘッダーは実行可能コードではないため、生成されたファイルは純粋なバイナリ実行可能ファイルではありません。プログラムヘッダーを含むこのファイルをメモリに読み込んだ後、 、プログラムヘッダーからエントリアドレスを読み取り、実行のためにエントリアドレスにジャンプします。
- マック【マッハオー】
Mach-O は、Mach Object file format の略で、実行可能ファイル、オブジェクト コード、ダイナミック ライブラリ、コア ダンプに使用されるファイル フォーマットです。a.out 形式の代替として、Mach-O は拡張性を高め、シンボル テーブル内の情報へのアクセス速度を向上させます。
1.2 Windows でのソフトウェアクラッキングに関する知識
◼ Windowsプラットフォームソフトウェアのクラッキングに必要な知識
ファイル形式:PEファイル
アセンブリ言語:x86、x64アセンブリ
ツール:Ollydbg
Windows API
◼ よく使用される OD ショートカット キー
F2: ブレークポイントの切り替え
F9: プログラムの実行
F7: ステップイン
F8: ステップオーバー
Ctrl + G: コードの検索
1.3 梱包と開梱
-
ソフトウェアクラッキングに関する一般的なアイデア
-
パッケージ化した後にソフトウェアをクラッキングするためのアイデア (通常のソフトウェアの上に追加のレイヤー)
1.4 プラグインの性質
プラグインには 2 つの一般的な方法があります。
-
メモリ内のデータを変更する
-
メモリ内のコードを変更する
OD ソフトウェアを使用してアセンブリ コードを変更し、新しい .exe ファイルとして再保存します。
其实,数据和代码并没有本质区别,在内存中都是0和1
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 チーターエンジン
メモリ内の数値変化を検出するために使用されます
2.5 一般的な手順
ここに
植物大战僵尸
例があります
- Visual Studio を開いて MFC プロジェクトを作成します (Java のスイングに似ています)
- 自定义log宏,简化打印
- 事件注册(手动、自动)
- 绑定变量(手动、自动)
- 单选框状态读取(勾选、不勾选)
- Plants vs. Zombies の実行ファイル (.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;
}