블로그 이미지
ludwings

카테고리

분류 전체보기 (132)
WIN API (22)
워게임 (61)
만든것 (2)
메모 (39)
Total17,407
Today17
Yesterday3

출처 : http://dstein.egloos.com/viewer/2335201

 

내용2 : http://sungod0.egloos.com/viewer/3920875

이 내용은 공부할려고 reversecore님 소스 써봣는데 안돼가지고... 이게머지.. 하면서 찾아다니다가 알게된 내용이다..

 

WriteProcessMemory를 이용하여 인젝션 시킬때 release 모드로 실행하면 정상 동작하지만 debug 모드로 컴파일된 파일로 실행하면 crash를 일으킨다고 한다. 그 설명은.. 저기 출처에 잘되어있다..

 

간단하게 debug 모드에서는 런타임 체크 코드가 자동으로 삽입되어있는데 이코드가 주입되서 실행되면 아무것도 없는 주소 공간을 참조하거나 실행해서 crash가 난다고한다..

 

그래서 알아본 debug 모드와 release 모드..

 

vs 설정에 debug 모드와 release 모드가 있는데..

 

debug 모드의 특징은

1. 파일 용량이 크고

2. 실행 속도가 느린 반면

3. 디버깅이 가능하다는 점ㅇ.

 

release 모드는 

1. 파일 용량이 작고

2. 실행 속도가 디버그 모드보다 빠르고

3. 디버깅이 불가능 하다.

 

둘의 차이점은 디버깅 정보를 실행코드에 넣냐 안넣냐 ..

그리고 동적으로 메모리를 할당받앗을떄 guard byte(0xfd) ㄹ를 자동으로 추가할당하여 잘못된 접근에도 crash가 일어나지 않을수도 있다. 

릴리즈에서는 초기화 시키지 않지만 디버그 모드에서는

초기화 하지않은 포인터 메모리 변수를 0xccccccc로 채우고 deallocate를 하면 0xdd로 채워진다.

 

주의할점도 release 시에는 변수 선언과 동시에 초기화 해주는게 좋고.'

debug mode에 방어용 공간을 확보하는것..

 

그 안됬던 애는 아래에 있다

 

 

 요거요거 릴리즈일떄

 

 

 

 

요거요거 디버그 일때

 

 

#include 
#include 
#include 


typedef HMODULE (WINAPI *PFLOADLIBRARYA)( LPCSTR lpLibFileName );
typedef FARPROC (WINAPI *PFGETPROCADDRESS)( HMODULE hModule, LPCSTR lpProcName );
typedef BOOL (WINAPI *PFTERMINATEPROCESS)( HANDLE hProcess, UINT uExitCode );
typedef int (WINAPI *PFMESSAGEBOXA) 
	(
	HWND hWnd,
	LPCSTR lpText,
	LPCSTR lpCaption,
	UINT uType
	);

int g_dwPID;

BOOL WINAPI MyTerminateProcess(HANDLE hProcess, UINT uExitCode);

typedef struct _THREAD_PARAM
{
	FARPROC pFunc[2]; // loadlibrary , getprocaddress
	char szBuf[4][128];      // dll, procname, mesaagebox param
} THREAD_PARAM, *PTHREAD_PARAM;
DWORD WINAPI ThreadProc(LPVOID lParam)
{
	// lParam 은 내가 만들어둔 구조체야... 이 구조체에 함수 주소를 구하기 위해 필수적인
	// LoadLibrary 주소와, getprocaddress 주소를 가지고 있다.
	PTHREAD_PARAM pParam = (PTHREAD_PARAM)lParam;
	HMODULE hMod = NULL;
	FARPROC pFunc = NULL;

	hMod = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);
	if(!hMod)
	{
		return 1;
	}

	pFunc = (FARPROC)((PFGETPROCADDRESS)pParam->pFunc[1])(hMod, pParam->szBuf[1]);
	if(!pFunc)
	{
		return 1;
	}

	((PFMESSAGEBOXA)pFunc)(NULL, pParam->szBuf[2], pParam->szBuf[3], MB_OK);

	return 0;
}
BOOL Inject_code();

int main(int argc, char* args[])
{
	if(argc != 2)
	{
		printf("How to use ? \n");
		printf("%s [pid]\n", args[0]);

		return 1;
	}

	g_dwPID = atoi(args[1]);

	if(g_dwPID <= 0)
	{
		printf("check PID\n");
		return 1;
	}

	Inject_code(); // g_dwPID 사용.

	return 0;
}

BOOL WINAPI MyTerminateProcess(HANDLE hProcess, UINT uExitCode)
{
	// 묻지도 따지지도 않고 return 해드립니다.
	return FALSE;
}

BOOL Inject_code()
{
	HMODULE hMod = NULL;
	HANDLE hProcess = NULL;
	HANDLE hThread = NULL;

	LPVOID pRemoteBuf[2];
	DWORD dwSize = 0;
	BOOL bRet = FALSE;

	THREAD_PARAM param = {0, };

	hMod = GetModuleHandleA("kernel32.dll");
	if(!hMod)
		return FALSE;

	param.pFunc[0] = GetProcAddress(hMod, "LoadLibraryA");
	param.pFunc[1] = GetProcAddress(hMod, "GetProcAddress");
	strcpy(param.szBuf[0], "user32.dll");
	strcpy(param.szBuf[1], "MessageBoxA");
	strcpy(param.szBuf[2], "www.ludwings.tistory.com");
	strcpy(param.szBuf[3], "ludwings");

	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwPID);
	if(!hProcess)
	{
		printf("OpenProcess() failed !\n");
		return FALSE;
	}
	dwSize = sizeof(THREAD_PARAM);
	pRemoteBuf[0] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
	if(!pRemoteBuf[0])
	{
		printf("VirtualAllocEx() Failed !\n");
		return FALSE;
	} // 사용이 필요한 인자들 메모리 공간 확보.. 이제 write 해줘야지

	if( !WriteProcessMemory(hProcess, pRemoteBuf[0], (LPVOID)¶m, dwSize, NULL))
	{
		printf("WriteProcessMemory Failed ! \n");
		return FALSE;
	}
	// 이제 중요한 createremotethread 해줄 함수를 상대 공간에 적어줘야겟지
	dwSize = (DWORD)Inject_code - (DWORD)ThreadProc;
	pRemoteBuf[1] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

	if(!pRemoteBuf[1])
	{
		printf("VirtualAllocEx() Failed !\n");
		return FALSE;
	}

	if( !WriteProcessMemory(hProcess, pRemoteBuf[1], (LPVOID)ThreadProc, dwSize, NULL))
	{
		printf("WriteProcessMemory Failed ! \n");
		return FALSE;
	}

	hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuf[1],
		pRemoteBuf[0], 0, NULL);

	WaitForSingleObject(hThread, INFINITE);

	CloseHandle(hThread);
	CloseHandle(hProcess);

	return TRUE;
}

//*/

'메모' 카테고리의 다른 글

관광과지리 기말과제  (0) 2015.11.28
자전거 국토종주  (0) 2015.10.09
코드인젝션시 주의사항  (7) 2014.01.10
메모  (0) 2014.01.02
Windbg 사용, 설정  (0) 2013.12.24
JAVA Error occurred during initialization of VM 문제해결  (0) 2013.12.19
Posted by ludwings

댓글을 달아 주세요

  1. 2014.01.13 10:09 신고 QBeom  댓글주소  수정/삭제  댓글쓰기

    reversecore 님 블로그꺼 똑같이 베끼셨네요 ㅡㅡ;

  2. 2014.03.27 20:50 NINA  댓글주소  수정/삭제  댓글쓰기


    초대장 부탁드립니다~~
    티스토리에서 활동하고싶어요
    ninapark5577@daum.net

  3. 2014.04.10 10:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  4. 2014.05.16 14:50  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

최근에 달린 댓글

최근에 받은 트랙백

글 보관함