http://powerhacker.net/forums/viewtopic.php?t=51
지뢰찾기 프로그램 핵을 만드는 예제가 있더군요. D2HackIt 을 통해서 훅을 하는 예제였습니다.
winmine.exe 를 IDA 로 열어보니 심볼서버에 winmine.exe 에 대한 심볼들이 있더군요. 호호. 놀랬습니다.
디버깅심볼이 있어서 ShowBomb() 함수가 바로 보이더군요.
저 문서를 작성한 분도 ShowBomb() 함수를 호출하는 방법을 사용했습니다.
오늘 오후에 시간도 좀 나고 .. 심심해서 다른 방법으로 같은 핵을 만들어 보았습니다.
저는 dll 을 사용하지 않고, 후킹을 하지도 않습니다.
winmine.exe 프로세스에서 직접 ShowBomb() 를 호출하는 코드를 삽입하는 방법을 사용했습니다.
오래전부터 바이러스나 웜에 자주 사용되던 기법이죠.
code injection 또는 Thread injection 이라고 하죠.
조금만 응용하면 여러 방면에 아주~~ 유용하게 써먹을 수 있답니다. 패커, 바이러스, 스텔스 웜.. 등등.. :-)
아래에 있는 코드로는 음.. 한 2% 부족할겁니다. 하지만 조금만 생각해 보면 해결할 수 있을겁니다.
somma_winmine_hack.zip
참고로 이 프로그램은 win 98 에서는 안됩니다.
지뢰찾기 프로그램(winmine.exe - windows xp 에 포함되어있는..)을 실행하고, 작업관리자 같은 툴을 통해 process id 를 알아내서 Showbomb.exe 에 입력하면 됩니다. :-)


지뢰찾기 프로그램 핵을 만드는 예제가 있더군요. D2HackIt 을 통해서 훅을 하는 예제였습니다.
winmine.exe 를 IDA 로 열어보니 심볼서버에 winmine.exe 에 대한 심볼들이 있더군요. 호호. 놀랬습니다.
디버깅심볼이 있어서 ShowBomb() 함수가 바로 보이더군요.
저 문서를 작성한 분도 ShowBomb() 함수를 호출하는 방법을 사용했습니다.
오늘 오후에 시간도 좀 나고 .. 심심해서 다른 방법으로 같은 핵을 만들어 보았습니다.
저는 dll 을 사용하지 않고, 후킹을 하지도 않습니다.
winmine.exe 프로세스에서 직접 ShowBomb() 를 호출하는 코드를 삽입하는 방법을 사용했습니다.
오래전부터 바이러스나 웜에 자주 사용되던 기법이죠.
code injection 또는 Thread injection 이라고 하죠.
조금만 응용하면 여러 방면에 아주~~ 유용하게 써먹을 수 있답니다. 패커, 바이러스, 스텔스 웜.. 등등.. :-)
아래에 있는 코드로는 음.. 한 2% 부족할겁니다. 하지만 조금만 생각해 보면 해결할 수 있을겁니다.
somma_winmine_hack.zip
참고로 이 프로그램은 win 98 에서는 안됩니다.
지뢰찾기 프로그램(winmine.exe - windows xp 에 포함되어있는..)을 실행하고, 작업관리자 같은 툴을 통해 process id 를 알아내서 Showbomb.exe 에 입력하면 됩니다. :-)


/** ---------------------------------------------------------------------------
\brief
\param
\return
\code
\endcode
-----------------------------------------------------------------------------*/
int inject_remote(DWORD dwPid)
{
if (0 != EnableDebugPriv())
{
_ASSERTE(!"oops!");
return -1;
}
// open process for inject
//
HANDLE hProc = OpenProcess(
PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |
PROCESS_VM_WRITE | PROCESS_VM_READ,
FALSE,
dwPid);
if (hProc == NULL)
{
_ASSERTE(!"OpenProcess");
return -1;
}
DWORD_PTR funcBody = GetFunctionRVA(injetor_stub);
int proc_size = SizeOfProc(funcBody) + 1;
if (1 == proc_size)
{
_ASSERTE(!"proc_size");
CloseHandle(hProc); hProc = NULL;
return -1;
}
// step #1
// step #2
// allocate buffer for thread procedure
//
char* proc_buf = (char *) VirtualAllocEx( hProc,
0,
proc_size,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if (NULL == proc_buf)
{
_ASSERTE(!"proc_buf");
CloseHandle(hProc); hProc = NULL;
return -1;
}
// step #3
//
// step #4
//
DWORD dwBytesWritten = 0;
if (0 == WriteProcessMemory(hProc,
proc_buf,
(char *)funcBody,
proc_size,
&dwBytesWritten))
{
_ASSERTE(!"writeprcsmemory");
VirtualFreeEx(hProc, proc_buf, proc_size, MEM_RELEASE);
proc_buf = NULL;
CloseHandle(hProc); hProc = NULL;
return -1;
}
// 자~ 시작해 볼까나?
//
DWORD dwTid = 0;
HANDLE hThread = CreateRemoteThread( hProc,
NULL,
0,
(LPTHREAD_START_ROUTINE)proc_buf,
NULL,
CREATE_SUSPENDED,
&dwTid);
if (NULL == hThread)
{
_ASSERTE(!"hTherad");
VirtualFreeEx(hProc, proc_buf, proc_size, MEM_RELEASE);
CloseHandle(hProc); hProc = NULL;
return -1;
}
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread); hThread = NULL;
VirtualFreeEx(hProc, proc_buf, proc_size, MEM_RELEASE);
proc_buf = NULL;
CloseHandle(hProc); hProc = NULL;
return 0;
}
/** ---------------------------------------------------------------------------
\brief thread procedure to be injected
\param
\return
\code
\endcode
-----------------------------------------------------------------------------*/
__declspec( naked )
DWORD __stdcall injetor_stub(void* pBlock)
{
__asm /* prolog */
{
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
// 지뢰를 보여주셈~~
//
__asm
{
mov eax, 0x0A
push eax
;call [0x01002f80]
mov eax, 0x01002F80
call eax
}
//-------------------------------------------------------------------------
__asm /* epilog */
{
xor eax, eax // always return 0 (33 C0)
mov esp, ebp
pop ebp
/* epilog signature */
xor eax, eax
xor eax, eax
ret 4 // 0xC3
}
}












최근 덧글