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

bp lstrcmpW。JNZ 指令(機器碼 0x75)。#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 範例程式