; 반환값이 unsigned char인 프로시져 : 인수로 받은 주소값의 메모리 상태를 보여주는 Memory Display 기능
_MD PROC NEAR32
PUSH EBP ; Entry Code MOV EBP, ESP
MOV EBX, [EBP+8] MOV EAX, [EBX]
MOV ESP, EBP ; Exit Code POP EBP RET
_MD ENDP
; 메모리 수정 프로시져 : 인수로 받은 주소에다 인수로 받은 값을 삽입하는 기능 _MM PROC NEAR32
PUSH EBP ; Entry Code MOV EBP, ESP
MOV EBX, [EBP+12] ; char(뒤의 인수부터 스택에 삽입됨) MOV EAX, [EBP+8] ; int
MOV BYTE PTR [EAX], BL ; 주소값은 4바이트라서?[AL]안됨
MOV ESP, EBP ; Exit Code POP EBP RET
_MM ENDP |
|
인수로 받은 바이트 수 만큼 출력하는 hexaview 함수 |
void hexaview(unsigned char *RData, unsigned int iSize) { unsigned char *ucP = RData; int iCnt, iLoop; int iBytes = iSize; // 입력받은 바이트수 int prtCnt = 0; // 출력한 문자수를 세는 변수 int iMax = 16; // 아스키 코드도 입력된 바이트 수만큼만 // 출력되도록 제한하는 변수
printf("-------------------------------------" "------------------------------------\n"); printf("ADDRESS\t\t\t HEXA\t\t\t\t ASCII\n"); printf("\n\t "); for (iCnt = 0; iCnt < 16; iCnt++) printf("%02X ", iCnt); putchar('\n'); printf("-------------------------------------" "------------------------------------\n"); if(0 == iSize%16) iSize = iSize/16; else iSize = (iSize/16) + 1; for (iLoop = 0; iLoop < iSize; iLoop++) { // 주소출력 printf("%08X ", ucP+iCnt); // 16진수 출력 for (iCnt = 0; iCnt < 16; iCnt++) { if (iBytes == prtCnt) { printf(" "); } else { printf("%02X ", MD((int)(ucP + iCnt))); prtCnt++; } } // 호출시 입력한 바이트 수만큼 출력했을 경우 아스키 문자도 출력제한 if (iBytes == prtCnt) { iMax = iBytes%16; }
// 아스키코드 출력 for (iCnt = 0; iCnt < iMax; iCnt++) { if (0 == *(ucP+iCnt)) printf("."); else if (32 > *(ucP+iCnt)) printf("."); else if (127 < *(ucP+iCnt)) printf("."); else printf("%c", MD((int)ucP + iCnt)); } putchar('\n'); ucP += iCnt; //lines += iCnt; }
}
|
< 출력화면 >