首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

軟體破解實戰:檔案補丁與記憶體補丁技術詳解

     編輯:關於C語言

破解目標程式邏輯

目標程式驗證帳號密碼,核心判斷邏輯為 lstrcmpW 比對加密後密碼,若相等則成功。破解點在於將條件跳轉 JNZ (0x75) 改為 JZ (0x74),反轉判斷結果。

目標程式介面

方法一:檔案補丁

  1. 使用 OD 附加程式,下斷點 bp lstrcmpW。
  2. 執行至斷點,觀察呼叫後的 JNZ 指令(機器碼 0x75)。
  3. 將該位址對應的檔案偏移處 0x75 改為 0x74(JZ)。

檔案補丁自動化程式

#include <Windows.h>
#include <iostream>

int main(int argc, char **argv) {
    if (argc != 2) { std::cout << "Usage: patch.exe target.exe"; return -1; }
    
    DWORD dwFileOffset = 0x1234; // OD 中取得的 VA 轉 FileOffset
    BYTE bCode;
    HANDLE hFile = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    
    SetFilePointer(hFile, dwFileOffset, NULL, FILE_BEGIN);
    ReadFile(hFile, &bCode, 1, &dwReadNum, NULL); // 驗證原始碼 0x75
    bCode = 0x74; // JZ
    SetFilePointer(hFile, dwFileOffset, NULL, FILE_BEGIN);
    WriteFile(hFile, &bCode, 1, &dwWriteNum, NULL);
    CloseHandle(hFile);
    WinExec(argv[1], SW_SHOW);
    return 0;
}

方法二:記憶體補丁

原理相同,但直接操作執行中進程記憶體,無需 VA→FileOffset 轉換。

// 建立暫停狀態進程
CreateProcess(target, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);

// 讀取/寫入遠端記憶體
ReadProcessMemory(pi.hProcess, (LPVOID)dwVAddress, &bCode, 1, &dwReadNum);
bCode = 0x74;
WriteProcessMemory(pi.hProcess, (LPVOID)dwVAddress, &bCode, 1, &dwWriteNum);

// 恢復執行緒執行
ResumeThread(pi.hThread);

目標程式下載:CrackMe 範例程式

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved