코드인젝션시 주의사항
출처 : 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; } //*/
'메모' 카테고리의 다른 글
코드인젝션시 주의사항 (7) | 2014.01.10 |
---|---|
메모 (0) | 2014.01.02 |
Windbg 사용, 설정 (0) | 2013.12.24 |
JAVA Error occurred during initialization of VM 문제해결 (0) | 2013.12.19 |
메모 (2) | 2013.11.28 |
아나 하이라이터 ㅡㅡ (0) | 2013.11.01 |
댓글을 달아 주세요
reversecore 님 블로그꺼 똑같이 베끼셨네요 ㅡㅡ;
머 해볼려고 소스붙여넣기하고 하는데 안대서 올려둔거거든욧! ㅡㅡ
초대장 부탁드립니다~~
티스토리에서 활동하고싶어요
ninapark5577@daum.net
보내드렷서요~
비밀댓글입니다
비밀댓글입니다
헉 ^^ ~~ 감사합니다 ㅎㅎ