코스웨어/14년 스마트컨트롤러
내용정리-손병규(출석번호14번)
알 수 없는 사용자
2014. 8. 24. 23:18
현재까지 진행된 main.c 코드
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<fcntl.h>
#define MAX_PROGRAM_SIZE 0X10000 //65536
typedef struct _context //레지스터 구조체 { 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;
static unsigned char * MEM; // 메모리 할당 후 시작 위치 static unsigned char * MEM_END; // 메모리 마지막 위치 static unsigned char * code; // 프로그램 저장공간의 시작 위치 - Code int File_DS; // 저수준 파일의 데스크립터
extern void STST(context *); extern void LDST(context *); extern void MM(void *, unsigned char); //메모리 수정 extern unsigned char MD(void *); //해당하는 주소의 1byte를 반환
void load(void); // void HexaView(void *); //Hexa View 출력 함수 void print_register(context *); //레지스터 정보 출력 함수 void Memory_Clear(void); //메모리 값 초기화
int main() { context status; unsigned int uiNum; MEM=malloc(MAX_PROGRAM_SIZE*2); //128 Kbyte 할당하고 메모리의 시작위치를 나타낸다.
MEM_END=(MEM+(MAX_PROGRAM_SIZE*2))-1;
if(0==MEM) //동적할당 실패시 { printf("동적할당을 받을수 없습니다. 프로그램을 종료하겠습니다.\n"); return; }
else { printf("Dynamic Memory area: [%08x]to[%08x](128KBytes)\n",MEM,MEM_END); }
//프로그램 메모리에 저장 시키는 code를 메모리 시작위치에서~ 64Kbyte 사이에 초기값이 되도록 설정 code=(unsigned char *)(((unsigned int)MEM+MAX_PROGRAM_SIZE) & 0xFFFF0000); printf("Code Start Address : 0x%08x\n", code); STST(&status); print_register(&status);
load();
HexaView(code); printf("1 : 프로그램 재시작\n"); printf("2 : 프로그램 종료 \n"); printf("선택하세요 : ");
scanf("%d",&uiNum);
if(1 == uiNum) { LDST(&status); }
free(MEM);
return 0; }
void load() { int Read_Num; int Header_Size; IMAGE_DOS_HEADER * stpDH; //DOS Header IMAGE_NT_HEADERS * stpPH; //PE Header IMAGE_FILE_HEADER * stpFH; //File Header IMAGE_OPTIONAL_HEADER32 * stpOH; //Optional Header unsigned int uiSectionSize;
File_DS= open("t1.exe", O_RDONLY); //t1 파일 열기
if(0 > File_DS) // 파일열기 실패시 { printf("File open error \n"); return; }
//t1파일에 128Kbyte 읽어온 후 MEM에 저장. Read_Num=read(File_DS,MEM,(MAX_PROGRAM_SIZE*2)); if(-1 == Read_Num) //read 실패시 { printf("File read error \n"); return; } stpDH=(IMAGE_DOS_HEADER *)MEM; //Dos Header 시작위치 stpPH=(IMAGE_NT_HEADERS *)(MEM + stpDH->e_lfanew-1); //PE Header 시작위치 stpFH=(IMAGE_FILE_HEADER *)((unsigned char *)stpPH+4); //File Header 시작위치 stpOH=(IMAGE_OPTIONAL_HEADER32 *)((unsigned char *)stpFH+sizeof(IMAGE_FILE_HEADER)); //Optional Header 시작위치
Header_Size=stpOH->SizeOfHeaders; //SizeOfHeaders의 값을 저장 // * SizeOfHeader의 값은 Header의 전체 크기를 나타낸다. uiSectionSize=stpOH->FileAlignment; //File에서 section 크기의 최소단위 Memory_Clear();
//printf("%s\n",&stpPH->Signature);
//파일포인터를 Header_Size(400)만큼 처음 위치에서 이동시킨다. lseek(File_DS,Header_Size,SEEK_SET);
//현재 파일포인터에서 FileAlignment(200)만큼 읽어온다. Read_Num=read(File_DS,code,uiSectionSize);
if(-1 == Read_Num) { printf("File read error \n"); return; }
close(File_DS);
}
void print_register(context * status1) { printf("EFL : %08x\t",status1->EFL); printf("EIP : %08x\n",status1->EIP); printf("EDI : %08x\t",status1->EDI); printf("ESI : %08x\n",status1->ESI); printf("EBP : %08x\t",status1->EBP); printf("ESP : %08x\n",status1->ESP); printf("EBX : %08x\t",status1->EBX); printf("EDX : %08x\n",status1->EDX); printf("ECX : %08x\t",status1->ECX); printf("EAX : %08x\n",status1->EAX); }
void Memory_Clear(void) //메모리 초기화 { unsigned char * ucData; ucData=MEM;
while(1) { MM(ucData,0x00); // 메모리를 0으로 초기화 ++ucData; //메모리 증가 if(ucData > MEM_END) //마지막 메모리 도착할 때 까지 { break; } }
}
void HexaView(void* ucpCode) { int iCnt; int iCnt2; printf("================================================="); printf("==============================\n"); printf("= ADDRESS\t\t\tHEXA\t\t\t\t ASCII\t =\n"); printf("=----------------------------------------------"); printf("-------------------------------=\n"); for(iCnt2=0;20>iCnt2;++iCnt2) { printf("= ");
//----------------------------// //--- Address Part Start ---// printf("%08X ",ucpCode); //--- Address Part End ---// //----------------------------// //----------------------------// //--- Hexa View Part Start ---// for(iCnt=0;16>iCnt;++iCnt) { if(8 == iCnt) { printf(" "); } printf("%02X ",*((unsigned char *)ucpCode)); ++((unsigned char *)ucpCode); } //--- Hexa View Part End ---// //----------------------------// //----------------------------// //----- ASCII Part Start ----// (unsigned char *)ucpCode=(unsigned char *)ucpCode-iCnt;
for(iCnt=0;16>iCnt;++iCnt) { if(32>*((unsigned char *)ucpCode)) //아스키코드 0~31은 명령문 { printf("."); ++(unsigned char *)ucpCode; } else if(127<*((unsigned char *)ucpCode)) //128이상은 상위아스키 코드 { printf("."); ++(unsigned char *)ucpCode; } else { printf("%c",(*(unsigned char *)ucpCode)); ++(unsigned char *)ucpCode; } } printf(" ="); printf("\n"); //----- ASCII Part End -----// //----------------------------// } printf("================================================="); printf("==============================\n"); }
|
.asm 소스코드
.386 .MODEL FLAT .STACK 4096
PUBLIC _STST PUBLIC _LDST PUBLIC _MM PUBLIC _MD
.CODE
_STST PROC NEAR32
push ebp mov ebp, esp
pushfd
mov esp, [ebp + 8] add esp, 40
pushad
mov eax, ebp add eax, 8
mov [esp + 12], eax
mov eax, [ebp]
mov [esp + 8], eax mov eax, [ebp + 4]
push eax
push [ebp - 4]
mov esp, ebp
pop ebp
ret
_STST EndP
_LDST PROC NEAR32 mov esp, [esp + 4] popfd pop eax
mov ebx, [esp + 12] mov ecx, esp
mov esp, ebx
push eax
mov esp, ecx
popad
mov esp, [esp - 20]
sub esp, 4
ret
_LDST ENDP
_MM PROC NEAR32 push ebp mov ebp, esp
mov al, [ebp+12] mov esp, [ebp+8] mov [esp], al
mov esp, ebp pop ebp ret
_MM ENDP
_MD PROC NEAR32
push ebp mov ebp, esp
mov esp, [ebp+8] mov al, [esp]
mov esp, ebp pop ebp ret
_MD ENDP
|
내용이 없어서 죄송해여