개요 지난번에 PE 파일의 헤더구조에 대해서 알아보았다. 잘 기억이 안나면 01 PE 파일 분석-헤더분석 문서를 다시 보자. 이번에 분석할 부분은 PE 파일에 포함된 Import 영역이다. Import 영역은 PE 파일이 실행될 때 외부로부터 당겨와서 사용하는 함수들의 목록이 포함되어있으며, Export 영역은 다른 모듈이 사용할 수 있게 노출해 놓은 함수들이 들어있다. 일단 Import 영역부터 살펴보자. Import 영역 분석 Import 영역은 PE 파일내의 특정 섹션에 자리잡고 있으며, IMAGE_OPTIONAL_HEADER의 DataDirectory에서 위치를 찾을 수 있다. DataDirectory내의 인덱스는 0x01이며 IMAGE_DIRECTORY_ENTRY_IMPORT 매크로로 WinNT..
개요 지난번에 PE 파일의 헤더구조 및 Import 섹션에 대해서 알아보았다. 잘 기억이 안나면 01 PE 파일 분석-헤더분석 문서 및 02 PE 파일 분석-Import 분석 을 다시 보자. 이번에 분석할 부분은 PE 파일에 포함된 Export 영역이다. Export 영역은 내가 다른 프로그램을 위한 기능을 제공하기위해 노출한 함수 목록이 들어있다. Import 영역과 비슷한 방법으로 IMAGE_NT_HEADER의 Data Directory를 찾아서 0번째 인덱스(IMAGE_DIRECTORY_ENTRY_EXPORT)를 찾으면 Export 섹션을 구할 수 있다. 역시 RVA를 파일 내의 오프셋(Pointer Of Raw Data)로 바꾸는 작업이 필요하다. Export 섹션의 시작 Export 섹션의 첫번..
개요 지난번에 PE 파일의 헤더구조 및 Import/Export 섹션에 대해서 알아보았다. 잘 기억이 안나면 01 PE 파일 분석-헤더분석 문서 및 02 PE 파일 분석-Import 분석, 그리고 03 PE 파일 분석-Export 분석 문서를 다시 보자. 일단 들어가기 전에 재배치(Relocation)이 무엇인지 알아보자. 재배치는 코드에 특정 값을 더해줘서 다른 메모리 주소에서 실행 가능하게 해주는 것을 말한다. 말 그대로 코드를 다시 배치하는 과정인데, 왜 이런걸 해야 하는 걸까? EXE 파일의 경우 윈도우에서는 굳이 재배치를 할 필요가 없다. 왜냐하면 로더가 프로그램을 로딩할때 제일 먼저 EXE 파일을 위한 메모리를 할당해주기 때문이다. IMAGE_OPTIONAL_HEADER에 ImageBase라는..
LITTLE ENDIAN or BIG ENDIAN 체크 123456789101112131415#include int main(void){ volatile int iNum=0x1234; volatile unsigned char * ucP = (volatile unsigned char *)&iNum; DDRD =0xff; if(*ucP==0x12) // BIG ENDIAN PORTD = 0xfe; else // LITTLE ENDIAN PORTD = 0xfd; return 0;}Colored by Color Scriptercs
1234567891011121314151617181920212223242526272829303132333435363738#include void EEPROM_write(unsigned int uiAddress, unsigned char ucData);unsigned char EEPROM_read(unsigned int niAddress); int main(void){ unsigned char t; DDRD=0xff; t = EEPROM_read(0x123); PORTD = ~t; t = t*2; EEPROM_write(0x123, t); return 0;}void EEPROM_write(unsigned int uiAddress, unsigned char ucData){ while(EECR & (1
12345678910111213141516171819202122232425262728293031#include int main(void){ volatile int iCnt; volatile int iCnt1; volatile int iCnt2; DDRD = 0xff; // PD0~PD7번 핀을 출력핀으로 초기화 PORTD = 0xfe; // 첫번째 LED ON while(1) { for(iCnt=0;7>iCnt;iCnt++) { for(iCnt1=0; 700>iCnt1; iCnt1++) for(iCnt2=0;100>iCnt2;iCnt2++); // 왼쪽으로 비트를 1씩 이동하면서 채워지는 0에 1을 대입 PORTD = (PORTDiCnt1; iCnt1++) for(iCnt2=0;100>iCnt2;iCnt..
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// basedef.h#ifndef BASE_DEF_H#define BASE_DEF_H // MCU Clock & Baud Rate#define CPU_CLOCK 7372800#define BAUD_RATE 19200#define BAUD_RATE_L (CPU_CLOCK / (16l * BAUD_RATE)) - 1#define BAUD_RATE_H ((CPU_CLOCK / (16l * BAUD_RATE)) - 1) >> 8 // TWI 통신시에 Ack를 주고 받는지 여부#define noACK 0#define..
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816..
123456789101112131415161718192021222324252627282930313233343536373839#include #include #pragma comment(lib,"ws2_32.lib") void err_quit(char *msg){ LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR); LocalF..