簡單方法避開斷點
在日常破解當中,常用的方法很多,下斷點是常用方法之首x,如果程式可避開某指定斷點的話,
可減少被破解的機會.
所槎系,就是在程式裡放上 INT 3 程式碼 0xCC ,但楹臥詰髟過程中我們看不見0xCC
呢 ?? 原來調器在下斷點r把對應的字元先保全下來,放上
0xCC ,等中斷r再原,這
0xCC 就看不見了.H上是這的 ? 好,下面用 MessageBoxA 槔,表明上面所講,
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
typedef void (WINAPI *SPMESSAGEBOXA) (HWND, LPCTSTR, LPCTSTR, UINT);
SPMESSAGEBOXA SPMessageBoxA;
void OtherMessageBox(HWND, LPCTSTR, LPCTSTR,
UINT);
_TCHAR lpBuf[40];
_TCHAR lpBufA[40];
int
WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{
int Icon = MB_ICONINFORMATION;
const PSTR szCaption = "This never break even break-point
was set ! ";
const PSTR szText = lpBuf;
const
PSTR szTargetAPI = "MessageBoxA";
HMODULE hUser32 = GetModuleHandle("user32");
SPMessageBoxA = (SPMESSAGEBOXA)GetProcAddress(hUser32,
szTargetAPI);
wsprintf(lpBufA, "%s", "This can Break
!");
sprintf(lpBuf, "Code byte was %8X", *(PULONG)SPMessageBoxA);
SPMessageBoxA(0, lpBuf,lpBufA, MB_ICONINFORMATION);
if (*(PUCHAR)SPMessageBoxA == 0xcc)
wsprintf(lpBuf, "%s", "Break point was set !");
else
wsprintf(lpBuf, "%s", "No Break point
set !");
OtherMessageBox(0, szText, szCaption, Icon);
return 1;
}
void OtherMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType
)
{
__asm
{
inc SPMessageBoxA
push dword ptr uType
push dword ptr lpCaption
push
dword ptr lpText
push 0
call MsgJmpBox
jmp end
MsgJmpBox:
push ebp
jmp SPMessageBoxA
end:
}
}
這程式是先取到 MessageBoxA
在系統中的地址(用GetModuleHandle 和 GetProcAddress)
之後把地址加一,推相對資料入stack,然後跳到加了一的地址去,因調器把0xCC放在未加一的位置上,
這就避過了斷點,十分簡單
在未加斷點r,當第一個MessageBox 出r(正常的呼叫方法),它會表示
MessageBox
這涵數的頭四byte 51EC8B55 第二個 MessgaeBox 是經過淼,不會斷在 BPX MessageBoxA
上.
當下了斷點後,\行這程式,Softice會出,你會看到下面程式碼.
注意頭四個byte是 558BEC51,
MessageBoxA:
55
PUSH EBP
8BEC MOV
EBP, ESP
51
PUSH ECX
833D9894E67700 CMP dword ptr [offset32 .data:77E69498],
00000000
0F85C4050100 JNE/JNZ
L77E49283
L77E38CBF: 6A00
PUSH 00000000
FF7514
PUSH dword ptr [EBP+00000014]
FF7510 PUSH
dword ptr [EBP+00000010]
FF750C
PUSH dword ptr [EBP+0000000C]
FF7508 PUSH
dword ptr [EBP+00000008]
E804000000
CALL MessageBoxExA
C9 LEAVE
C21000 RET 0010
跟著按F5,MessageBox 出,但表示 51EC8BCC ,這就^明瞭上面的f法了.
再把第一個 MessageBox
關閉,第二個 MessageBox R上彈出,沒有中斷 !!
在這例子中,最多可加上四個byte,但在跳之前也應把跳開的位元都堆到stack去
如加四的話
push ebp
mov ebp, esp
push
ecx
jmp SPMessageBoxA
要破解這方法也是十分簡單,o要下 bpx messageboxa+4 一切就 OK 了 !!