Дико извиняюсь если уже обсуждалось Но все-ьаки как программно добавить BPX для Soft Ice? (Ессестно 0xCC не в счет) Спасибо
антиотладочные приемы 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 ............
Чё-то не получается: 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; }
Для 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) ЗЗЗЫ: Запускаю иссл прогу, запускаю мою, распечатываю файл с кодами и вперед!