2012. 4. 27. 21:14

다음은 국내 해커 ohhara님이 이미 만들어 놓으신 dumpcode.h라는 헤더입니다. ==================================================================== // dumpcode.h by ohhara void printchar(unsigned char c) { if(isprint(c)) printf("%c",c); // 해당하는 값을 문자로 표시 else printf("."); // 출력 불가능한 문자는 그냥 .으로 표시 } // 메모리 시작 주소와 출력할 크기를 인자로 받음 void dumpcode(unsigned char *buff, int len) { int i; for(i=0;i<len;i++) { // 16바이트 단위로 주소 출력 if(i%16==0) printf("0x%08x ",&buff[i]); // hex 값 출력 printf("%02x ",buff[i]); // 해당 16진수들을 각각 문자로 출력 if(i%16-15==0) { int j; printf(" "); for(j=i-15;j<=i;j++) printchar(buff[j]); printf("\n"); } } // 마지막 라인이 16바이트 이하일 경우 정렬 유지 if(i%16!=0) { int j; int spaces=(len-i+16-i%16)*3+2; for(j=0;j<spaces;j++) printf(" "); // 부족한 공간만큼 space로 이동한 후, for(j=i-i%16;j<len;j++) printchar(buff[j]); // 남은 문자 값들 출력 } printf("\n"); } ==================================================================== 이를 소스 코드에 추가하거나, 혹은 dumpcode.h로 만든 후 include 시키면 dumpcode()라는 함수를 사용할 수 있게 됩니다. 또는 dumpcode.h를 /usr/include/ 디렉토리에 복사해 넣으시면 어느 경로에서든 include하여 사용하실 수 있습니다.



아래는 또다른 덤프코드(이게 깔끔함)


 

/******************************

* RAW 메모리를 16진수로 덤프

*******************************/

void dump(const unsigned char *data_buffer, const unsigned int length) {

unsigned char byte;

unsigned int i, j;

   

for(i=0; i < length; i++) {

byte = data_buffer[i];

if (i%16 == 0)

printf("%08x: ", (unsigned int)&data_buffer[i]);

printf("%02x ", byte); // display byte in hex

   

if(((i%16)==15) || (i==length-1)) {

for(j=0; j < 15-(i%16); j++)

printf(" ");

printf(" | ");

for(j=(i-(i%16)); j <= i; j++) { // display printable bytes from line

byte = data_buffer[j];

if((byte > 31) && (byte < 127)) // outside printable char range

printf("%c", byte);

else

printf(".");

}

printf("\n"); // end of the dump line (each line 16 bytes)

} // end if

} // end for

}



Posted by k1rha