Code 인젝션
상대방 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법
일반적으로CreateRemoteThread() API를 이용해 원격 스레드의 형태로 실행하므로 Thread 인젝션이라도고 함.
DLL 인젝션 vs Code 인젝션
DWORD WINAPI ThreadProc(LPVOID lParam)
{
MessageBoxAa(NULL, "www.reversecore,com", "ReverseCore", MB_OK);
return 0;
}
windows 메시지 박스 출력하는 코드
DLL인젝션이면 위에 코드를 DLL 파일 형태로 만들고 다른 프로세스에 인젝션하면됨
디버거로 열면 이렇게 나온다.
10009290, 1000929C 주소의 문자열을 확인하면 DLL의 데이터 섹션에 위치한 문자열을 가르키는것을 확인할 수있다. push 명령어들은 MessageBoxA() API에 사용될 문자열 주소를 스택에 저장함.
DLL의 코드에서 사용되는 모든 데이터는 DLL의 데이터 영역에 위치함.
DLL 인젝션 기법으로 DLL을 통째로 상대방 프로세스 메모리에 삽입하면, 코드와 데이터가 같이 메모리에 존재하기 때문에 코드는 정상 실행됨.
Code 인젝션은 필요한 코드를 인젝션하는 것.
코드에서 사용되는 데이터도 같이 인젝션해야 정상적으로 코드 실행이 됨
코드 인젝션의 사용 이유
1. 메모리 차지량이 적다
아주 작은 코드와 데이터 인젝션 시 DLL로 만드는 것보다 코드로 하는게 메모리 덜 차지한다.
2. 흔적을 찾기 어렵다.
DLL 인젝션은 해당 프로세스 메모링 흔적을 남겨서 인젝션 여부가 보이는데 Code 인젝션은 ㅇ흔적 잘 안남긴다. 그래서 악성코드에 많이 사용함
3. 기타
DLL 파일 없이 Code Injector 프로그램만 있으면 됨.
실습
notepad 실행시킴 process explorer이용해서 pid 확인함
CodeInjection 실행시킴. 실행 파라미터로 notepad의 pid 입력함
메시지박스 출력되는 것 확인이 가능하다..
실습 코드
CodeInjection.cpp
int main(int argc, char *argv[])
{
DWORD dwPID = 0;
if( argc != 2 )
{
printf("\n USAGE : %s pid\n", argv[0]);
return 1;
}
// code injection
dwPID = (DWORD)atol(argv[l]);
InjectCode(dwPID);
return 0;
}
main()함수의 역할은 InjectCode()함수를 호출하는 것
함수 파라미터로 상대방 프로세스의 pid 값 넘겨줌
실제 인젝션 되는 부분은 ThreadProc()함수임
hMod = Load!_ibraryA("user32.dU");
pFunc = GetProcAddress(hMod, "MessageBoxA");
pFunc(NULL, "www.reversecore.com", "Reve rseCore", MB OK);
이건 일부분..
Code 인젝션 기법의 핵심은 독립 실행 코드를 인젝션하는 것
코드와 데이터를 같이 인젝션하는 것
인젝션하는 코드에서 역시 인젝션한 데이터를 참조할 수 있도록해야됨
위에 함수는 API직접 호출안하고 문자열도 직접 정의하지 않음
여기서는 THREAD_PARAM 구조체 써서 2개의 API 주소와 4개의 문자열 데이터를 받아들임
2개 API는 LoadLibraryA(), GetProcAddress()이고 이것만 있으면 API 모든 라이브러리의 함수 호출 가능함.
InjectCode()도 보면 DLL인젝션 코드와 유사함. InjectCode()함수의 앞 부분은 THREAD_PARAM 구조체 변수를 세팅함
OpenProcess()
// data : THREAD_PARAM
VirtualAllocEx()
WriteProcessMemory()
// code : ThreadProcO
VirtualAllocEx()
WriteProcessMemory()
CreateRemoteThread()
핵심 API 함수들의 호출 흐름만 딴거
상대방 프로세스에 data와 code를 각각 메모리 할당하고 인젝션해줌
CreateRemoteThread() API를 이용해 원격 스레드를 실행함
Code 인젝션 디버깅 실습
디버거로 notepad 열어서 실행함
옵션 이렇게 설정하면 스레드 함수 시작코드에서 멈추게 됨
notepad의 PID 구함 이 값을 실행 파라미터로 해서 codeinjection을 실행함.
코드 인젝션 성공하면 인젝션된 스레드 코드 시작 위치에서 디버깅이 멈추게 됨
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
29. API 후킹: 리버싱의 '꽃' (0) | 2024.11.17 |
---|---|
28. 어셈블리 언어를 이용한 Code 인젝션 (0) | 2024.11.12 |
26. PE Tools (0) | 2024.11.06 |
25. PE 패치를 이용한 DLL 로딩 (0) | 2024.11.06 |
24. DLL 이젝션 (0) | 2024.11.04 |