==================================Outline====================================
코드/데이터/스택 영역 설정
load, clear
----------------------------------------------------------------------------
코드/데이터/스택 영역 설정
동적 할당을 받은 영역에 코드영역, 데이터영역, 스택영역을 설정 해주자.
코드 영역은 헥사 값으로 뒤의 4자리가 ‘0’으로 채워져 있어야 한다. 이를 위한 마스크 설정을 해주자.
#define MASK_CODE 0xFFFF0000
#define MAX_PRG_SIZE (64*1024)
#define MEM_SIZE (MAX_PRG_SIZE*2)
vpCode = (void *)( ( ((int)vpMem_start) & (MASK_CODE) )+MAX_PRG_SIZE);
프로그램 사이즈를 더해준 이유는 마스크 코드를 적용할 시 뒤에 4자리가 삭제되기 때문이다.
뒤에 네 자리는 0xFFFF - 0x0000까지 가능한데 이 값을 복구시켜주기 위해 프로그램 사이즈를 더해준다. 처음에 동적할당을 받을 때 'MEM_SIZE' 즉, 프로그램 사이즈의 2배임으로 동적할당을 받은 영역 내에서 프로그램이 존재하게 된다.
데이터영역은 코드영역에서 헥사 값으로 2000떨어진 곳에 존재한다.
vpData = (void *)((int)vpCode + 0x2000);
스택 값은 끝에서부터 시작된다. 이것을 헥사뷰로 16줄을 출력시키기 위해 다음과 같은 코딩을 한다.
vpStack = (void *)( (int)vpMem_end - (16 * 16)+1);
load, clear
각 영역이 올바른 주소 값으로 설정되어 있는지 출력해본다. 올바르게 나온다면 각 영역에 값을 저장할 'load'명령어와 해당 영역을 ‘0’으로 채워주는 'mc'(memory clear) 함수를 만들어준다.
void load()
{
memset(vpCode, 0xFF, 16*16);
memset(vpData, 0xEE, 16*16);
memset(vpStack, 0xDD, 16*16);
return;
}
void memory_clear()
{
memset(vpMem_start, 0, MEM_SIZE);
}



/*** Code ***/
#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 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 }, { 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_end, vpMem_start); } 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 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; } |