Code Injection with Assembly Language

컴컴한해커·2025년 1월 12일

리버스 엔지니어링

목록 보기
13/18

📌 ThreadProc() Assembly 작성


해당 코드는 ThreadProc() 함수를 어셈블리어에서 작성한 것이다. C언어로 작성된 것과 비교하고 싶으면 아래 링크로 가서 비교하면 된다.
Code Injection

📌 Assembly 분석

push ebp
mov ebp,esp
  1. 스택 프레임 생성 --> 스택에 문자열들을 넣어서 ThreadProc() 함수가 종료될 때 스택을 깨끗하게 관리하려고
mov esi,dword ptr ss:[ebp+8]
  1. THREAD_PARAM 구조체 포인터
    이 때 구조체의 멤버는 LoadLibraryAGetProcAddress이다.
push 6c6c		;"\0\0ll"
push 642e3233	;"d.23"
push 72657375	;"resu"
push esp
  1. "user32.dll" 문자열 저장 및 주소 입력
    이 때 Little Endian 표기법과 스택의 거꾸로 자라는 특성 때문에 위처럼 입력되고 있다.
call dword ptr ds:[esi]		;kernel32.LoadLibraryA
  1. LoadLibraryA("user32.dll") 호출
    이 때 함수의 리턴 값은 EAX에 저장된다.
push 41786F		;"\0Axo"
push 42656761	;"Bega"
push 7373654D	;"sseM"
push esp		
push eax		;hMod(778E000)
call dword ptr ds:[esi+4]	;kernel32.GetProcAddress
  1. "MessageBoxA" 문자열 입력 및 GetProcAddress(hMod,"MessageBoxA") 호출
    이 때 hMod는 user32.dll 모듈의 로딩 주소이다.
push 0
call 002D003F
push edx
jbe short 002D009C
jb short 002D00AC
inc ebx
outs dx,dword ptr es:[edi]
jb short 002D00A3
add al,ch
  1. MessageBoxA 파라미터 입력한다
    이 때 push 0은 파라미터 1의 값이고 그 이후 코드는 파라미터 2(ReverseCore)의 문자열 데이터이다.
call 002D0058
ja short 002D00BD
ja short 002D0076
jb short 002D00AF
jbe short 002D00B1
jb short 002D00C1
arpl word ptr gs:[edi+72],bp
prefix gs:
arpl word ptr cs:[edi+6D],bp
add byte ptr ds:[edx],ch

push 0
  1. MessageBoxA의 파라미터 3(www.reversecore.com)을 입력하는 문자열 데이터와 파라미터 4를 입력하는 코드이다.
call eax
  1. MessageBoxA API 호출하는 call 명령어로 GetProcAddress에 의해 리턴된 MessageBoxA API의 시작 주소가 EAX에 저장되어 있다.
xor eax,eax

mov esp,ebp
pop ebp
retn
  1. ThreadProc() 리턴 값 세팅 및 스택 프레임 해제, 함수 리턴

어셈블리 명령어에 대해 잘 알고 프로그래밍을 할 줄 알면 Code Injection을 할 수 있다. 이 과정들을 잘 이해하고 있다는 건 DLL injection 및 MessageHooking 과정을 잘 이해하고 있다고 판단할 것 같다.

0개의 댓글