Holy Hacker

핸들을 알아내는 툴을 만들어~! 001 본문

음...

핸들을 알아내는 툴을 만들어~! 001

홀리해커 얄리얄리얄리 2014.12.05 13:27

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


다음 소스를 말이다.

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이든 다 사용할 수 있다는 점~~!!






3 Comments
댓글쓰기 폼