본문 바로가기
코스웨어/14년 스마트컨트롤러

내용정리-손병규(출석번호14번)

by 알 수 없는 사용자 2014. 8. 24.
728x90
반응형

현재까지 진행된 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




내용이 없어서 죄송해여


728x90