Busan IT/Assembly2015. 10. 15. 09:13

.386

.MODEL FLAT

PUBLIC _stst
PUBLIC _ldst    ; '_stst''_ldst'함수 외부 접근 허용 코드

.code

_start:  

_stst   PROC   NEAR32  ;store status

    ; - entry code -
    push  ebp    
    mov   ebp, esp

    pushfd
    mov esp, [ebp+8]  ;esp obj로 이동
    add esp, 40    ;esp obj 가장 아래로 이동

    pushad      ;eip와 efl을 제외한 모든 레지스터 구조체에 삽입
    push [ebp+4] ; eip삽입
    push [ebp-4] ; eflags삽입
    add esp, 20  ; 구조체의 esp자리로 내려온다.

    mov eax, ebp ; main의 esp를 구조체의 넣기 위해 레지스터 eax를 사용한다.
    add eax, 8   ; eax를 main의 esp가 있는 자리로 옮겨준다.
     ;12가 아닌 8인 이유는 esp는 마지막 변수를 가리키고 있기 때문이다.
    mov [esp], eax ; 구조체 esp에 main의 esp를 넣어준다.
    push [ebp]     ; 구조체 ebp자리에 main의 ebp를 넣어준다.

    
    ;mov eax, [esp+20] eax에는 return값이 들어감으로 복구시킬 필요가 없다.


    ; - exit code -
    mov  esp, ebp
    pop  ebp
    ret ;pop eip
    
    ;메인 함수에서의 복구
    ;add esp, 4 ;함수의 인자 자리를(&obj) 복구 시키기 위해 esp 사용한 인자의 크기만큼 옮긴다.

  
  _stst ENDP

  _ldst   PROC   NEAR32  ;
      
    ;mov esp, [esp+4]  ;esp를 구조체로 이동
    ;popfd    ;구조체 efl값을 레지스터 efl로 이동
    ;pop eax    ;eax값에 구조체 eip값을 이동
    ;mov ebx, esp  ;현재 esp값(구조체에 edi를 가리킨다)을 백업
    ;mov esp, [esp+12]  ;구조체 esp값을 esp에 저장한다.
    ;push eax    ;구조체eip값을 구조체 esp에 저장
    ;mov esp, ebx  ;esp를 구조체에 edi를 가리키는 값으로 이동시킨다.
    ;popad    ;스택에 있는 내용을 레지스터에 채운다.
    ;mov esp, [esp-20]  ;esp를 구조체 esp가 가리키는 곳으로 이동시킨다.
    ;sub esp, 4    ;esp - 4

    mov esp, [esp+4]
    popfd
    pop eax
    mov ebx, [esp+12]
    mov [ebx-4], eax
    popad
    mov esp, [esp-20]
    sub esp, 4


    ret ;pop eip

  _ldst ENDP


마지막 연산을 통해서 efl값이 변동된다. efl값이 변동하지 않도록 다시 코딩을 해보자.

반응형
Posted by newind2000