음….

음………

음…………………………………………………………


이번에는 미친식빵이 나타나…………..

엄마가 한마디 한다…

미친감자~~


잘하고 있냐고….


그렇게 시작하자…


엄마 나타난다…


이런...엄마를 그린 파일이 없어졌다...어디로 날라갔나? 저장을 하지 않았나보다……..;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



음...어쩔수 없지….

일단 미친식빵 나타나….버럭해준다~~~~~(왜 버럭해야 하는지는 모르겠고~~일단 버럭해준다…)

미친감자…

일단 깜짝놀란다…

흐~~~

“당연하죠~”라고 대사를 쳐준다~~!


오늘은 여기까지..;;;이런 …흐….

먹고 살려고 바뿌다 바뻐;;;


음....마소에...다음 편을 써야 한다...

초딩(?)을 위한 글을 써주라고 부탁을 해서...


미친감자와 미친식빵을 이용해서......


컴퓨터란 놈과 대화를 하는 컨셉으로 쓰고 있다.....


음....


이번 호에는 무슨 내용으로 써야 하는가?


성령님....도와주세요...


Oh Holy Spririt..~~~


컴파일러와 대화를 시작했다....


씨언어를 이용해서 말이다....


음...컴파일러는 무슨 짓(?)을 하는 것일까?


음…

샵…..

샵에 대해서 씹어 먹어야 한다…


전처리기에 대해서 알아보자….


전처리기?


전처리기에 대해서 이야기를 뽑아 내보자….


전 처리기 입니다….


‘전처리기’


전처리기에 대해서 이야기 해보자…..


전처리기의 정체를 알아볼 것 이다….


전처리기는 뭐지?


전 처리기 입니다????


I am 처리기? ㅋㅋㅋㅋ


전처리기



음…



프로젝트 속성에서 …

전처리기의 속성을

전처기기란 놈을 확인 할 수 있다…

여기 숨어 있다..

뭐든지….숨어 있다...ㅋㅋㅋ



음…

속성>구성 속성 > C/C++ > 전처리기

안으로 들어가니까!!!


온갖...옵션들이 있네~~!!


음….


전처리기 정의~!!

오~~여기에서………..

정의를 하는 구나!!!


WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)


전처리기 정의 해제

모든 전처리기 정의 해제

표준 포함 경로 무시

파일로 전처리

전처리 줄 번호 표시 안함

주석 유지


음…


음..전처리기에서 하는 일 중에 정의라는 것이 중요한 것인가 보내..

정의 할지 해제할지….모드 해제할지….를 3개의 옵션으로 처리하고 있네~!!


표준 포함 경로 ~??


파일로 전처리를 ‘예(/P)’로 변경하였다…음..이 옵션으로...전처리 결과를 확인할 수 있쥐~~!!!



줄 번호~~

주석 유지~~ 기본적으로 전처리 과정을 거치고 나면...주석을 없에 버린다….


자..확인해보면~~!!



음….

파일로 전처리를 처리하면….

저런 파일이 생긴다!!!


음…^^

이렇게 전처리기를 사용하면….

전처기리글 돌기고 나면..

이렇게 나옵니다.



TEST TEST2는 없어지고….

정의 했던 값으로 바뀌어 버린다…


컴파일러 입장에서는 .TEST 나,.....TEST2란 녀석은 필요가 없는 것이다…

다..이것들은 인간들을 위해 있는 것이니~~~


음..그렇다….


자..전처기기에 대해서 좀더 알아보자…..


전처리기….


그리고  결과를 컴파일러가 컴파일을 시작하는 거쥐~~



음....






오늘은 맨티가...이것을 가져왔다...


다음 소스를 말이다.

http://forum.sysinternals.com/uploads/Napalm/2006-04-20_211055_HandleList.zip


음...


맨티 : 음...시스인터날에서 핸들을 알아내는 소스가 있더라구요~


그래서 소스를 보니까..


NtQuerySystemInformation()

NtDuplicateHandle()

NtQueryObject()


맨티 : 이 함수를 이용해서 핸들을 알아내고, 핸들 정보를 알아내더라구요~~


오 그렇구나....


그래 좋았어...

그럼 저 함수를 이용해서........

핸들 정보를 알아내보도록.....


이건 진짜 게임이야...

이게 진짜 게임....


게임방이나 오락실 게임이 진까게임이 아닌거야...


저 함수는 괴물인거야..

저 괴물을 잡아 먹어~~


그러면 SP지수(Sysmtem Power)지수가 올라갈거야....오케?


우리의 진짜 게임은 우리의 삶이야....


예수님안에서 지성소의 법궤안에 임재해 계시는 야훼의 파워로

저 괴물을 다 물리치는 것이 진짜 게임인거야~~

오케~?


지금 아주 잘 따라오고 있어~~!!!


오늘도 이기자고~~마귀에게서....

우리들이 싸우는 것은 혈과 육이 아니고

마귀랑 싸우는 거야~~!


자....


자...오늘은 말이야...


NtDuplicateHandle()을 왜하는지를 설명해줄께…


a.exe라는 프로그램을 클릭하는 순간 프로세스라는 것이 만들어지잖아~~

그럼.. 내가 뭐라고 했지?


프로세스가 실행될 수 있는 환경이 만들어진다고 했지?


그 환경에는 말이지…

밥상이 있어 밥상~~테이블(Table)~~!!무슨 밥상이냐?

핸들밥상~~

핸들 테이블

이 핸들 테이블은 프로세스마다 주어지지

누가 ? 커널 쪽에서 누군가가~~~


그래서 다른 프로세스의 핸들테이블에 있는 핸들값을 그대로 절대로 사용할 수 없는 거야…


그놈을 복사해야되는거야~


NtDuplicateHandle()함수를 호출하면,

커널쪽에…

이 핸들이 가르치는 개체 저도 사용할 수 있게 해주세요~~~

그럼 커널쪽 누군가가(누군지 모르겠어~~~) 그 핸들이 가르키는 개체에 대해서

사용할 수 있도록 핸들을 다시 할당해서 핸들 테이블에 저장해주고

그 핸들테이블의 인덱스 값을 넘겨주는 거쥐~~

알겠어?



음….

그리고, NTDLL.DLL의 함수를 컴파일러가 직접 호출할 수 가 없어….

NTDLL.DLL의 함수를 내 프로그램에서 사용하기 위해선느

컴파일러에게 함수의 모양을 알려줘야하고, 그 함수를 직접 로드해야 한다고~~!

그러면, 함수의 주소를 알아낼 수 있는데

이 함수를 함수주소포인터에 저장해서 사용하면 된다고~~!


그러면서, 나는 LoadLibrary()함수와 GetProcAddress()함수를 설명했다.


LoadLibrary()는 입력(Input)으로 경로를 받고, 출력(Output)으로 메모리 주소를 받는다고 했다.

이 메모리 주소는 로드한 모듈이 위한한 주소라고..

그리고 , 그 주소를 이용해서 함수를



ntdll.dll이 로드된 주소는 0x77a1000

그렇다면 LoadLibrary() 이놈이 뱉어낸 주소도?




0x77a10000

음….

즉… LoardLibrary()라는 녀석은 해당 모듈이 로드되어 있는 메모리 주소를 리턴해주는 것이 맞습니다!!!


그리고, GetProcAddress()는 함수의 주소를 리턴해주고~~!!



FARPROC WINAPI GetProcAddress(
 _In_  HMODULE hModule,
 _In_  LPCSTR lpProcName
);

그리고, 함수포인터로 해당 함수주소를 받아서 사용하면 된다는 점~~

함수 포인터는 어떻게 만드느냐?


리턴타입 가로열고 별 함수주소이름 가로닫고 인자값형태~~

로 하면 된다.

이런 식으로 말이다.



DWORD (*pMyFun)(INT nData);


pMyFun = GetProcAddress(hModule, "test");


이렇게 하면 어떤 dll이든 다 사용할 수 있다는 점~~!!






음...다시 새날이 밝았습니다.

안녕하세요..미친감자 김주생입니다.


오직 하나님께 미친고 예수님께 미치고 성령님께 미치면...됩니다.

할렐루야~!!


자...음..요즘 제가 갑자기.. CreateRemoteThread()를 요즘 씹어 먹고 있습니다.

흐~~





그러게요...왜이렇게 제가 당신에게 관심을 갖는 것일까요?

음…

그야… CreateRemoteThread()란 놈이 아주 특이하니께…

제가 관심을 갖죠…

왜? 자기 프로세스가 아닌 다른 프로세스에 스레드를 만들고 그러냐 이겁니다.

그게 아주 특이하니께...제가..관심을 갖는 것입니다.

그리고, DLL Injection 공격 방법으로도 사용되고 있으니..

미친감자가 관심을 갖을 수 밖에요…그렇지 않겠습니까요?


자...오늘은  말이죠…. 3번째...이야기가 되는 것인데…

저는 CreateRemoteThread()의 일반적인 사용방법에 대해서 알아볼까합니다.

공격말고~!


일반적인 사용법말입니다…

어떻게 하면 다른 프로세스에 스레드를 집어넣을 수 있을 까 말입니다.

디엘엘 인젝션(DLL Injection)말고 말입니다.


그래서 인터넷에서 찾아낸 소스가…

https://github.com/meizhitu/SimpleUI/blob/master/CreateRemoteThread.cpp ← 이 소스는 중국분께서 만드셨고...디엘엘 인젝션 이 아니고 순수하게 메모리를 할당하고 스레드를 만드는 방식이였습니다.

그런데, Windows 8에서 잘 안되는 것 같습니다. 어제 잠깐 테스트하는 동안 에러가 계속 발생합니다.


아..그리고, 다른 프로세스에 스레드를 만든것이 결코 쉬운일이 아닙니다….


흐..스레드 인젝션을 당한 쪽에서..계속 죽었습니다.

저는 크롬(Chrome)프로세스에 리모트 스레드를 만들었었죠...그랬더니

이렇게 되어 있었습니다…


웹페이지를 표시하는 동안 문제가 발생했구나…

내가 스레드를 만든건데...이런..

뭐가 문제일까요? 여러분~!


여러분~!...

그러게요~

뭐가 문제죠~!

다시 잘해보세요~미친감자~

뭔가 실수하신게 있을 수 있잖아요~!!

다른 프로세스를 선택해서 해보세요^^


이런~

스카이도 죽었습니다…

이런 왜그럴까요?

음...도대체...어떤 프로세스에...스레드가 생성되는 것일까요?


오늘은 여기까지..

계속..이야기는 지속됩니다.~~


오늘도 승리 승리 무조건 승리

만번을 외치자…~~

오직 예수 그리스도만 바라보자~~

바라봄의 법칙이 있다!


자~ 오늘은 무신이야기를 계속할까요~

그야… CreateRemteThread()라는 녀석에 대해서 더 이야기 해야겠죠…

칼을 꺼냈으니…

무우라도 잘라요죠…

그렇죠^^~!

무우를 주세요~!


대걸레를 들고..뭐하는 것일까?

정말 무우를 자르려고 하는가 보군요~!!


자…

이 전 이야기에서 저는 다른 프로세스에 스레드를 만드는 방법에 대해서

이야기를 시작했었요~~

기억 나시나요~


프로세스들은 모두다 독립된 메모리공간을 가지고 있기 때문에.

다른 프로세스의 메모리에 뭔가를 한다는 것이 이상한 것입니다.

하지만, 권한만 있다면, 이게 다 가능하다죠~~!!

ㅋ~


그게 다 ...OpenProcess()함수가 있기 때문에 가능한거죠~!

그렇죠?


HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


기억 나시죠^^?

PID (Process ID)만 알고 있으면, 해당 프로세스의 핸들을 알아내고, 그 핸들을 이용하여 메모리를 할당 할 수 있는 것입니다.

VirtualAllocEx()함수를 이용해서 말이죠~!!



//1. OpenProcess로 프로세스를 오픈한다.

HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


//2. 오픈된 프로세스에 가상메모리를 할당한다.

void* pRemoteThread = VirtualAllocEx(hTargetProcess,

0,

dwThreadSize,

MEM_COMMIT | MEM_RESERVE,

PAGE_EXECUTE_READWRITE);



자~ Now~

VirtualAllocEx()함수를 이용하여 할당한 메모리에 이번에는 WriteProcessMemory()함수를 이용하여 스레드 함수를  복사해 봅시다.


//3. 새로 추가한 메모리에 스레드 함수를 복사한다.

WriteProcessMemory( hTargetProcess,

    pRemoteThread,

                   &threadProc,

                   dwThreadSize,

                   0);




새로 할당한 메모리 pRemoteThread에, 스레드 함수 threadProc()을 복사하는 것입니다.~

알겠죠~

dwThreadSize 만큼요~!


알겠죠~!


그런데, 요 시점에서~~

스레드함수를 알아봐야 겠죠~!

스레드 함수...라는 것은 뭐냐?

스레드를 만들때 사용되는 함수입니다.


뭐시기? 스레드를 만든때 사용하는 함수?

그냥 아무것나 사용하면 안되는 것여^^?




그렇습니다. 스레드를 만들 때는 무조건…

다음 형태의 함수이어야 합니다.


잘보세요~~!


DWORD WINAPI ThreadProc(
 _In_  LPVOID lpParameter
);


그렇습니다. 인자는 한개의 LPVOID 형 ...리턴값은..DWORD

함수 호출 방식은 WINAPI 즉~ __stdcall 방식이고요~~


#define WINAPI      __stdcall


입니다.

흐….오늘도 멀리 가지 못했군요…

흐~~내일 다시 봅시다.

물방울로 바위를 뚤을것입니다.

흐~~



7개의 인자를 채워 넣어줘야 한다.

이중에서 제일 중요한 것은 제 생각엔~

lpStartAddress가 제일 중요한것 같다…왜냐하면, 함수가 있어야 스레드를 만들 수 있으니까!!!


다른 프로세스에 스레드를 만들기 위해서는 스레드용 함수가 있어야 한다.

그런데, CreateRemoteThread()에 전달해줘야할 스레드 함수 주소는 다른 프로세스에 있는 함수 주소이어야 한다고 한다.(이게 무슨 말인인지 이해가 가는가?)

즉, CrateRemoteThread()함수를 호출 하는 프로세스의 함수를 전달해서는 안되는 것이다.


자. 프로세스라는 녀석들은 각자 독립된 메모리 공간을 가진다.




자~ 그런데 어떻게 다른 주소공간에 있는 함수주소를 알아내어서 그 함수를 스레드로 만들 수 있는 것일까요~!


궁굼하시죠~!

자~

방법이 있습니다~!

다른 프로세스에 메모리를 할당하고 그 메모리에 함수를 복사하고 그 복사된 함수를 호출해주면 된다.

이해할 수 있겠는가?



  1. 다른 프로세스에 메모리를 할당한다.

  2. 그 메모리에 내 주소 공간에 있는 함수를 복사한다.

  3. 복사된 함수를 CreateRemoteThread()함수에 전달한다.




자~

다른 프로세스에 메모리를 할당하는 방법은 다음과 같습니다.


  1. 다른 프로세스의 PID(Process ID)값을 알아낸다.

  2. PID를 이용하여 OpenProcess()하여 핸들을 알아낸다.

  3. VirtualAllocEx()함수를 이용하여 PID의 프로세스에 메모리를 할당한다.



HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


void* pRemoteThread = VirtualAllocEx(hTargetProcess,

0,

dwThreadSize,

MEM_COMMIT | MEM_RESERVE,

PAGE_EXECUTE_READWRITE);



오늘은 여기까지..

내일은..

함수 복사하고, 스레드 만들고 까지 해보죠~!



자...이제… 쩜아이 파일을 더 구경해보자고요~~!!!!


이 놈안은 어떻게 생겨 먹었는지 말입니다.~~~



자… Preprocessr001.i

파일을 다시 보자고요~~!!

자..이렇게 시작을 합니다…

음..

음..파일들의 전체경로들이 나오는군요….


내가 만든 파일도 있고…

그렇지 않은 녀석들도 있고…


targetver.h라는

녀석은….

중요한 녀석이죠…


지금 내가 만들놈은….

어느 윈도우 버전에서 실행될 놈인지를 지정하는 것이죠~~

암튼…

자..계속...구경 갑시다요~~!!!


음..

음…

#pragma

프라그마…..

나오면서

어찌고 저찌고 하고 있습니다…


아..오늘도 여기까지…

멀리 못갔습니다..

흐..


자 오늘은…

쩜아이 파일 보고 끝냅시다…

흐..

시간이 없는 관계로..ㅋㅋ

오늘은 여기까지..~

너무 짧네요~~~

흐흐흐

할레룰야~~~

예수님 안에 거합시다~~

+ Recent posts