簡單方法避開斷點 (3千字)

看雪資料發表於2003-03-02

簡單方法避開斷點

在日常破解當中,常用的方法很多,下斷點是常用方法之首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 了 !!

相關文章