소스코드
.386
.MODEL FLAT
PUBLIC _STST ; Store Status
PUBLIC _LDST ; Load Status
PUBLIC _MD ; Memory Display
PUBLIC _MM ; Memory Modify
.CODE
_STST PROC NEAR32
PUSH EBP
MOV EBP, ESP
PUSHFD
AND DWORD PTR [EBP-4], 0FFFFFEFFh
MOV ESP, [EBP+8]
ADD ESP, 40
PUSHAD
ADD ESP, 16
;Old EBP, RA, 인자, Main과의 경계
MOV EAX, EBP
ADD EAX, 8
PUSH EAX ; 메인 ESP
PUSH [EBP] ; Old EBP
SUB ESP, 8
PUSH [EBP+4] ; EIP(Return Address)
PUSH [EBP-4] ; EFL
MOV ESP, EBP
POP EBP
RET
_STST ENDP
_LDST PROC NEAR32
MOV ESP, [ESP+4] ; ESP = &Context
POPFD ; EFL = Context.EFL
; 플래그 레지스터에 값을 넣음
POP EAX ; EAX = Context.EIP
; 예전 EIP를 EAX 저장
MOV EBX, ESP ; EBX = Current ESP
; 현재 ESP 백업
MOV ESP, [ESP+12] ; ESP = Old ESP
; 과거 ESP로 점프
PUSH EAX ; Save Old EIP
; 과거 ESP에 EAX를 푸쉬하여 RA덮어씀
MOV ESP, EBX ; ESP = Current ESP
; 백업해둔 ESP를 다시 복원
POPAD ; ESP를 제외한 모든 값을 복원
MOV ESP, [ESP-20] ; Old ESP값을 복원
SUB ESP, 4 ; ESP를 RA위로 올려주어야 한다(RET이 POP하기때문)
RET
_LDST ENDP
_MD PROC NEAR32
PUSH EBP
MOV EBP, ESP
MOV EAX, [EBP+8]
MOV EAX, [EAX]
MOV ESP, EBP
POP EBP
RET
_MD ENDP
_MM PROC NEAR32
PUSH EBP
MOV EBP, ESP
PUSH EBX
MOV EAX, [EBP+8] ; EAX = Address
MOV BL, [EBP+12] ; BL = Data
MOV BYTE PTR [EAX], BL ; *EAX = BL
POP EBX
MOV ESP, EBP
POP EBP
RET
_MM ENDP
END
#include <stdio.h>
typedef struct _context
{
int efl;
int eip;
int edi;
int esi;
int ebp;
int esp;
int ebx;
int edx;
int ecx;
int eax;
} CONTEXT;
void STST( CONTEXT *stpReg ); // CPU의 정보를 메모리에 저장
void LDST( CONTEXT *stpReg ); // 메모리에 저장된 CPU 정보를 재등록
unsigned char MD( int * ); // Memory Display Function By Assembly
void MM( int *, char); // Memory Modify Function By Assembly
void PrintRegister( CONTEXT *stpReg );
int main()
{
int a = 0x12345678;
CONTEXT stReg = { 0, };
printf( "0x%08X : %02X\n", &a, MD( &a ) );
MM( &a, 0xFF );
printf( "0x%08X : %02X\n", &a, MD( &a ) );
printf( "0x%08X : %08X\n", &a, a );
PrintRegister( &stReg );
STST( &stReg );
PrintRegister( &stReg );
getchar();
LDST( &stReg );
printf( "Kernel Panic\n" );
return 0;
}
void PrintRegister( CONTEXT *stpReg )
{
printf( "┌──────RegisterStatus──────┐\n" );
printf( "│EAX : 0x%08X\t", stpReg->eax );
printf( "ECX : 0x%08X│\n", stpReg->ecx );
printf( "│EDX : 0x%08X\t", stpReg->edx );
printf( "EBX : 0x%08X│\n", stpReg->ebx );
printf( "│ESP : 0x%08X\t", stpReg->esp );
printf( "EBP : 0x%08X│\n", stpReg->ebp );
printf( "│ESI : 0x%08X\t", stpReg->esi );
printf( "EDI : 0x%08X│\n", stpReg->edi );
printf( "│EIP : 0x%08X\t", stpReg->eip );
printf( "EFL : 0x%08X│\n", stpReg->efl );
printf( "└───────────────────┘\n\n" );
}
결과 사진
위는 원래 값, 중간은 0xFF로 수정한 값, 아래는 전체 값입니다. 1바이트만 수정되었다는 것을 알 수 있습니다.
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
130930 월 어셈블리 숙제 조유진 (0) | 2013.09.30 |
---|---|
PE 헤더 구조, 응용 프로그램 원리 pdf (2) | 2013.09.27 |
9월 25일 어셈블리 - 석주원 (0) | 2013.09.25 |
2013.09.25 어셈블리_이수현 (0) | 2013.09.25 |
20130924 USART 소스 _ 손초롱 (0) | 2013.09.25 |
9월 24일 ATmega 시리얼 통신 & 어셈블리 정리 (0) | 2013.09.24 |
20130924 어셈블리 pushad - 손초롱 (0) | 2013.09.24 |
CONTEXT 프로젝트(2) POPAD -0924 임기준 (0) | 2013.09.24 |