Програмно bpx SIce

Тема в разделе "WASM.ASSEMBLER", создана пользователем Peshuha, 27 авг 2005.

  1. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Дико извиняюсь если уже обсуждалось

    Но все-ьаки как программно добавить BPX для Soft Ice?



    (Ессестно 0xCC не в счет)



    Спасибо
     
  2. dotblizz

    dotblizz New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    4
    антиотладочные приемы



    2.2)Magic Numbers

    Это backdoor переходящий от версии к версии. Numega, видимо, специально его оставляет:

    в ах номер функции

    -AX = 0910h (Display string in SIce windows)

    -AX = 0911h (Execute SIce commands -command is displayed is ds:dx)

    -AX = 0912h (Get breakpoint infos)

    -AX = 0913h (Set Sice breakpoints)

    -AX = 0914h (Remove SIce breakoints)

    mov si, 4647

    mov di, 4a4d

    int 3

    Защита? Все как обычно bpint 3 и меняем цифры в si или di.



    Еще наш взгляд может радовать вот такое:

    mov ax, 0911

    mov dx,@'HBOOT'

    mov si, 4647

    mov di, 4a4d

    int 3

    Т.е. перезагрузка...





    Т.е. тебе, видимо так:

    .data

    str db "bpx 402000",0



    .code

    ............

    mov ax, 0911

    mov dx, addr str

    mov si, 4647

    mov di, 4a4d

    int 3

    ............
     
  3. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Чё-то не получается:



    int main(int argc, char* argv[])

    {

    LPCSTR cmd = "Hello";

    _asm

    {

    mov eax, 0x0910

    mov edx, cmd

    mov esi, 0x4647

    mov edi, 0x4a4d

    _emit 0xCC

    }



    printf("Hello World!\n");

    return 0;

    }
     
  4. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Для 16-bit пользуюсь таким (если dll самораспаковывается):



    #include <windows.h>

    #include <stdio.h>

    #include <dos.h>

    #include <toolhelp.h>

    #include <vector>

    #include <ctype.h>



    using namespace std;



    typedef struct

    {

    WORD seg;

    WORD ofs;

    char Name[50];

    BYTE b; // First byte in code

    }BREAKPOINT_ITEM;



    static vector<BREAKPOINT_ITEM> vbp;



    int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

    {

    LPCSTR mn = _argv[1];

    char pt[0x200];

    sprintf(pt, "%s.dll", mn);



    HMODULE hm = ::GetModuleHandle(pt);

    if(!hm)

    {

    MessageBox(NULL, "Cannot get module handle", "Error", MB_OK);

    return -1;

    }



    // Open exports file

    sprintf(pt, ".\\%s.txt", mn);

    FILE* f = fopen(pt, "rt");

    if(f == NULL)

    {

    MessageBox(NULL, "Cannot open exports file", "Error", MB_OK);

    return -1;

    }



    DebugBreak();

    sprintf(pt, ".\\bp_%s.txt", mn);

    FILE* fr = fopen(pt, "wt");

    if(fr == NULL)

    {

    MessageBox(NULL, "Cannot open report file", "Error", MB_OK);

    return -1;

    }



    bool bGetAddresses = true;

    while(fgets(pt, sizeof(pt), f) != NULL)

    {

    char* s = pt;

    if(s[0] == 0)

    continue;



    int len = strlen(s);

    if(s[len - 1] == '\n')

    s[len - 1] = 0;



    // Try get type of string

    char* p = strstr(s, "Name: "); // WDasm type

    if(p)

    s = p + 6;



    p = strchr(s, ' ');

    if(p)

    *p = 0;



    // Getting address

    FARPROC fp = ::GetProcAddress(hm, s);



    BREAKPOINT_ITEM bp;

    strcpy(bp.Name, s);

    bp.seg = SELECTOROF(fp);

    bp.ofs = OFFSETOF(fp);



    fprintf(fr, "%04X\t%04X\t%s\t"

    , bp.seg

    , bp.ofs

    , bp.Name

    );



    if(fp == NULL)

    {

    fprintf(fr, "DONT GET ADDRESS. Skipped\n");

    bGetAddresses = false;

    continue;

    }



    if(pt[0] == ';')

    {

    fprintf(fr, "breakpoint disabled. Skipped\n");

    continue;

    }



    // Read memory

    if(MemoryRead(bp.seg, bp.ofs, &bp.b, sizeof(bp.b)) != sizeof(bp.b))

    {

    fprintf(fr, "CANNOT READ MEMORY. Skipped\n");

    continue;

    }



    fprintf(fr, "%02X\t", bp.b);



    // Test write

    if(MemoryWrite(bp.seg, bp.ofs, &bp.b, sizeof(bp.b)) != sizeof(bp.b))

    {

    fprintf(fr, "CANNOT WRITE MEMORY. Skipped\n");

    continue;

    }



    fprintf(fr, "Ready\n");



    // Add into vector

    vbp.push_back(bp);

    }



    fclose(f);

    fclose(fr);



    sprintf(pt, "BP-setter ready for patch %s "

    , mn

    , (!bGetAddresses) ? "(Any of addresses were not getted)" : ""

    );



    if(MessageBox(NULL, pt, "Ready", MB_YESNO) != IDYES)

    return 0;



    for(int i =0; i < vbp.size(); i++)

    {

    BREAKPOINT_ITEM bp = vbp;



    // Patch memory

    BYTE cc = 0xCC;

    if(MemoryWrite(bp.seg, bp.ofs, &cc, sizeof(cc)) != sizeof(cc))

    {

    sprintf(pt, "CANNOT WRITE MEMORY at %04X:%04X. Skipped", bp.seg, bp.ofs);

    MessageBox(NULL, pt, "Error", MB_OK);

    continue;

    }

    }



    sprintf(pt, "Module %s was patched succesfully. Enjoy", mn);

    MessageBox(NULL, pt, "Ready", MB_OK);



    return 0;

    }



    ЗЫ:благо мемори там общая

    ЗЗЫ: Это я компилю в Borland 5.02 (Win16)

    ЗЗЗЫ: Запускаю иссл прогу, запускаю мою, распечатываю файл с кодами и вперед!