#include <stdio.h>
/* 사용자 정의 */ #define CMD_SIZE 20 #define MAX_PRG_SIZE (64*1024) #define MEM_SIZE (MAX_PRG_SIZE*2) #define MASK_CODE 0xFFFF0000 typedef struct { unsigned int efl; unsigned int eip; unsigned int edi; unsigned int esi; unsigned int ebp; unsigned int esp; unsigned int ebx; unsigned int edx; unsigned int ecx; unsigned int eax; }context;
typedef struct { char * cpCmd; void (*fp)(); }comm;
/* 전역 변수 */ static context stOld_state; extern void stst(context *); extern void ldst(context *); void * vpMem_start; void * vpMem_end; void print_addr(); void * vpCode; void * vpData; void * vpStack;
/* 함수 원형 */ void print_r(); void print_help(); void memory_clear(); void quit(); void view_code(); void view_data(); void view_stack(); void load(); void memory_modify();
void hexaview(void *, unsigned int);
comm stCmd_Map[] ={ //메세지 맵 기법 { "R", print_r }, { "H", print_help }, { "MC", memory_clear }, { "Q", quit }, { "QUIT", quit }, { "P", print_addr }, { "CODE", view_code }, { "DATA", view_data }, { "STACK", view_stack }, { "LOAD", load }, { "MM", memory_modify }, { 0, 0 } }; int main(void) { char cInput[CMD_SIZE]; comm * stpCmd; int iRet; vpMem_start = (void *)malloc(MEM_SIZE); if(0==vpMem_start) { return -1; } vpCode = (void *)( ( ((int)vpMem_start) & (MASK_CODE) )+MAX_PRG_SIZE); vpData = (void *)((int)vpCode + 0x2000); vpMem_end = (void *)( (int)vpMem_start + MEM_SIZE - 1 ); vpStack = (void *)( (int)vpMem_end - (16 * 16)+1); stst(&stOld_state); printf("Moniter Program Start\n"); while(1) { putchar('>'); iRet = read(0, cInput, CMD_SIZE); if(iRet < 2) { continue; } cInput[iRet-1] = 0; strupr(cInput); stpCmd = stCmd_Map; while(0 != (stpCmd->fp)) { if(0 == strcmp(strupr(cInput), stpCmd->cpCmd)) { break; } ++stpCmd; } if(0!= (stpCmd->fp)) { ((stpCmd->fp)()); } else { print_help(); } } return 0; } void print_r() { printf("main : %08X\n", main); printf("stOld_state : %08X\n\n", &stOld_state); printf("EAX = %08X EBX = %08X\nECX = %08X EDX = %08X\nESI = %08X EDI = %08X\nEBP = %08X ESP = %08X\nEIP = %08X EFL = %08X\n\n",stOld_state.eax, stOld_state.ebx, stOld_state.ecx, stOld_state.edx, stOld_state.esi, stOld_state.edi, stOld_state.ebp, stOld_state.esp, stOld_state.eip, stOld_state.efl);
} void print_help() { printf("Memory Debugging Prompt\n\n"); printf("R: Print Register Info.\n"); printf("H: Print Command List\n"); printf("H: Clear Momory\n"); printf("P: Print Memory\n"); } void memory_clear() { memset(vpMem_start, 0, MEM_SIZE); } void print_addr() { printf("Code Start Address : 0x%08X\n", vpCode); printf("Dynamic Memory Area : 0x%08X - 0x%08X [128Byte]\n", vpMem_start, vpMem_end); } void quit() { free(vpMem_start); exit(0); } void view_code() { hexaview(vpCode, 16*16);
return; }
void view_data() { hexaview(vpData, 16*16);
return; } void view_stack() { hexaview(vpStack, 16*16);
return; } void load() { memset(vpCode, 0xFF, 16*16); memset(vpData, 0xEE, 16*16); memset(vpStack, 0xDD, 16*16);
return; } void memory_modify() { unsigned int uiAddr; unsigned int uiVal; while(1) { printf("수정할 메모리 주소를 입력하세요 [%08X - %08X] : ", vpMem_start, vpMem_end); scanf("%x", &uiAddr); fflush(0); if(uiAddr < (unsigned int)vpMem_start || uiAddr > (unsigned int)vpMem_end) { printf("잘못입력하셨습니다. \n"); continue; } break; } hexaview((void *)uiAddr, 16); printf("수정할 값을 입력하세요 : "); scanf("%x", &uiVal); fflush(0);
*((unsigned int *)uiAddr) = uiVal; hexaview((void *)uiAddr, 16); return; }
void hexaview(void * vP, unsigned int uiLen) { unsigned int uiCnt; unsigned int uiLine;
printf("===============================================================================\n"); printf(" Address Hexa ASCII \n"); printf("-------------------------------------------------------------------------------\n"); for (uiLine = 0; uiLine < uiLen; uiLine += 16) { printf(" %08X ", vP); for(uiCnt=0; uiCnt<16; ++uiCnt) { printf("%02X ", *((unsigned char *)vP)); vP = (char *)vP + 1; } vP = (char *)vP - 16; putchar(' ');
for(uiCnt=0; uiCnt<16; ++uiCnt) { if (32 > *((unsigned char *)vP)) { putchar('.'); } else if(127 < *((unsigned char *)vP)) { putchar('.'); } else { printf("%1c", *((unsigned char *)vP)); }
vP = (char *)vP + 1; } putchar('\n'); } return; } |