블로그 이미지
ludwings

카테고리

분류 전체보기 (130)
WIN API (22)
워게임 (61)
만든것 (2)
메모 (37)
Total17,890
Today1
Yesterday1

operator+ 를 오버로딩 하던중 계속 리턴시에 참조오류가 나길래 뭐지??

원래 객체는 리턴못하나?? 했는데 알고보니까 그 객체가 가지고 있는 포인터를 연산자 오버로딩 함수에서 만들어주기때문에 리턴시에 에러가 났던 것이었다!!!! 포인터를 조심하자!!

'WIN API' 카테고리의 다른 글

cpp 객체리턴 액세스 위반 에러  (6) 2015.04.28
winapi] 64bit dll injector  (2) 2014.01.08
win api] lol 실행 차단  (0) 2014.01.02
Dll Injector, Dll Ejector  (0) 2013.10.11
#pragma once  (0) 2013.09.04
WINAPI ] 간단한 채팅2  (0) 2013.05.07
Posted by ludwings

댓글을 달아 주세요

  1. 2015.04.29 15:23 천재123  댓글주소  수정/삭제  댓글쓰기

    진짜 멍청하시네요 ㅋㅋ

  2. 2015.04.29 15:58 천재123  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋ 이분 핵멍청이로 유명하던데 ㅋㅋ
    깔깔ㅋㅋ

  3. 2015.05.04 13:47 안영철  댓글주소  수정/삭제  댓글쓰기

    개멍청하네

  4. 2015.05.04 13:50 안영철  댓글주소  수정/삭제  댓글쓰기

    핱짝

  5. 2015.05.13 17:47  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

winapi] 64bit dll injector

WIN API / 2014. 1. 8. 23:58

이거도해봐야지...

 

지금 dll injector는 32bit dll을ㅇ 32bit process에 인젝트하는 것만 ㄷ ㅗ ㅣ는데..

 

아니근데 64비트 dll은 어케 만드는거지? 구성관리자에서 x64로 해놓고 컴파일해도 32비트로 생성되는데 dll이?

 

일단 64bit 프로세스 만들어보고 64bit dll 만들어본 다음에 인젝션 시켜봐야지...

 

우선 reversecore에서 64bit injector하고 64bit dll 가져와서 실험해봣다.. 그런데 fail한다 ㅋㅋ 일단 dll은 64bit가 맞으니 injector에 문제가 있는거 같고

 

내가 만든 32bit에서 되던 dll injector로 reversecore에서 가져온 dummy64.dll 을 64bit 메모장에 인젝션 시도해봤는데 안된다 .. 그렇다 나의 인젝터에도 문제가 있었던 것이다..

 

그렇다면 할일..

1. 테스트용으로 64bit 프로세스 만들어보고

2. 64bit dll 만들어내고

3. 인젝터 수정하거나 만들기

 

--

 

1. 64프로세스 됨

 

 

 

2. 근데 64bit dll 이면 이런창 한번 떠야하는데

 

 

 

x64로 설정하고 해도 안뜸ㅋㅋ

 

ㅅㅂ 알고보니까 개삽질이야 프로젝트\debug\64.dll 이 아니라 프로젝트\x64\debug\64.dll 여기 들어있었네 ㅋㅋㅋㅋㅋㅋㅋ 이힣ㅅ

 

3.인젝터는..

'WIN API' 카테고리의 다른 글

cpp 객체리턴 액세스 위반 에러  (6) 2015.04.28
winapi] 64bit dll injector  (2) 2014.01.08
win api] lol 실행 차단  (0) 2014.01.02
Dll Injector, Dll Ejector  (0) 2013.10.11
#pragma once  (0) 2013.09.04
WINAPI ] 간단한 채팅2  (0) 2013.05.07
Posted by ludwings

댓글을 달아 주세요

  1. 2014.03.27 02:17 고구마  댓글주소  수정/삭제  댓글쓰기

    저도 안되서 계속 코드 수정하고 컴파일하고 ... 결국 님 블로그 보고 알게 됐어요.

    x64 폴더가 따로 있더라는........... -_- 삽질 멈추게 해줘서 고맙습니다!

win api] lol 실행 차단

WIN API / 2014. 1. 2. 22:28

그냥 공부하는 겸해서 만들어보려고 한다.

 

버전은 두가지 인데

 

첫번째는 유저단에서 돌아가고, 단순하게 전역으로 zwsysteminformation을 후킹함으로써 이 프로세스가 숨겨지도록 하며, 대기하였다가 lol 프로세스가 실행되면 강제로 종료시킨다..

 

두번째는 큐밤아카데미 선생님이 숙제로 내주신 커널 단에서 lol 프로세스를 종료하는건데 처리는 유저단과 비슷하지만 커널단에서 처리... 처음이지만 한번 해봐야겠다.

 

 

 

reversecore님의 블로그에서 많은 도움을 얻었따~

 

2014-1-2 작성시작

이름은 LOL_HAJIMARUYOT으로 해야지 엘오엘하지마루욧

 

기본적으로 프로세스를 숨겨주기위해 전역으로 stealth.dll을 인젝션 해 줄 생각이다... 전에 작성했던 dll injector&ejector의 소스를 이용해서 쉽게 만들수 있었고.. stealth.dll 을 작성해야한다..

 

.exe 의 기능

실행하면 현재 실행중인 모든 프로세스에 stealth.dll 을 인젝션 시킨다.

 

stealth.dll

이 분은 zwsysteminformation을 코드패치를 통해서 후킹한다... 내가원하는 프로세스라면 프로세스간 연결을 끊어서 숨겨버린다.

 

 

-------------------------

1/3

변경

stealth.dll -> LOL_HAJIMARUYOT.dll

LOL_HAJIMARUYOT.exe -> AllProcessInjector.exe

 

잘못생각했던 점

1. injector 프로세스가 계속돌면서 새로운 프로세스가 생성되면 인젝션 시켜줘야 된다고 생각했다.

   그런데 이건 createprocessa, createprocessw 를 후킹해두면 어떤 부모프로세스(explorer.exe) 등이 프로세스를 생성할때 자동으로 stealth.dll을 인젝션 해줌과 동시에 생성되는 프로세스 이름을 확인하고 종료해버릴수도 있다.

   그럼 프로세스를 은폐하는 기술은 필요가 없으며 모든 프로세스의 dll을 ejection 해줘야 lol 차단을 종료 할 수 있다.

 

2. stealth 기능

   위에서 말한것과 같이 stealth기능은 필요가 업ㅈㅅ이 dll 에서 모두 처리하고 injection하는 프로세스느는 종료되기 떄문에 createprocess 함수들만 후킹하면 된다.

 

우선 모든프로세스에 dll을 인젝션하는 소스당

 

-- allprocessinjector 소스 --

 

소스출처 : reversecore.com

#include 
#include 
#include 

#define DllPath L"c:\\stealth.dll"

enum { INJECTION_MODE = 0 , EJECTION_MODE };

BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath);
BOOL EjectDll(DWORD dwPID, LPCTSTR szDllPath);
BOOL InjectAllProcess(int nMode, LPCTSTR szDllPath);
DWORD CheckProcess(LPCTSTR szProcessName);

int APIENTRY WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	int nMode = INJECTION_MODE;
	
	InjectAllProcess(nMode, DllPath);

	if(nMode == EJECTION_MODE)
		return 0;

	while(1)
	{
		DWORD dwPID = CheckProcess(L"notepad.exe"); // process to kill
		if(dwPID != 0)
		{
			HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
			TerminateProcess(hProc, 0);

			CloseHandle(hProc);
		}

		Sleep(5000); // 5초에 한번검사
	}

	return 0;
}

BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath)
{
	HANDLE hProcess, hThread;
	LPVOID pRemoteBuf;
	DWORD dwBufSize = (DWORD)(lstrlen(szDllPath)+1)*sizeof(TCHAR);
	LPTHREAD_START_ROUTINE pThreadProc;


	if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
	{
		return FALSE;
	}

	pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, 
		MEM_COMMIT, PAGE_READWRITE);

	WriteProcessMemory(hProcess, pRemoteBuf, 
		(LPVOID)szDllPath, dwBufSize, NULL);

	pThreadProc = (LPTHREAD_START_ROUTINE)
		GetProcAddress(GetModuleHandle(L"kernel32.dll"), 
		"LoadLibraryW");

	hThread = CreateRemoteThread(hProcess, NULL, 0, 
		pThreadProc, pRemoteBuf, 0, NULL);

	WaitForSingleObject(hThread, INFINITE);	

	VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);

	CloseHandle(hThread);
	CloseHandle(hProcess);

	return TRUE;
}

BOOL EjectDll(DWORD dwPID, LPCTSTR szDllPath)
{
	BOOL                    bMore = FALSE, bFound = FALSE;
	HANDLE                  hSnapshot, hProcess, hThread;
	MODULEENTRY32           me = { sizeof(me) };
	LPTHREAD_START_ROUTINE  pThreadProc;

	if( INVALID_HANDLE_VALUE == 
		(hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID)) )
		return FALSE;

	bMore = Module32First(hSnapshot, &me);
	for( ; bMore ; bMore = Module32Next(hSnapshot, &me) )
	{
		if( !_tcsicmp(me.szModule, szDllPath) || 
			!_tcsicmp(me.szExePath, szDllPath) )
		{
			bFound = TRUE;
			break;
		}
	}

	if( !bFound )
	{
		CloseHandle(hSnapshot);
		return FALSE;
	}

	if( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
	{
		CloseHandle(hSnapshot);
		return FALSE;
	}

	pThreadProc = (LPTHREAD_START_ROUTINE)
		GetProcAddress(GetModuleHandle(L"kernel32.dll"), 
		"FreeLibrary");
	hThread = CreateRemoteThread(hProcess, NULL, 0, 
		pThreadProc, me.modBaseAddr, 0, NULL);
	WaitForSingleObject(hThread, INFINITE);	

	CloseHandle(hThread);
	CloseHandle(hProcess);
	CloseHandle(hSnapshot);

	return TRUE;
}

BOOL InjectAllProcess(int nMode, LPCTSTR szDllPath)
{
	DWORD                   dwPID = 0;
	HANDLE                  hSnapShot = INVALID_HANDLE_VALUE;
	PROCESSENTRY32          pe;

	// Get the snapshot of the system
	pe.dwSize = sizeof( PROCESSENTRY32 );
	hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, NULL );

	// find process
	Process32First(hSnapShot, &pe);
	do
	{
		dwPID = pe.th32ProcessID;

		// 시스템의 안정성을 위해서
		// PID 가 100 보다 작은 시스템 프로세스에 대해서는
		// DLL Injection 을 수행하지 않는다.
		if( dwPID < 100 )
			continue;

		if( nMode == INJECTION_MODE )
			InjectDll(dwPID, szDllPath);
		else
			EjectDll(dwPID, szDllPath);
	} while( Process32Next(hSnapShot, &pe) );

	CloseHandle(hSnapShot);

	return TRUE;
}

DWORD CheckProcess(LPCTSTR szProcessName)
{
	HANDLE hSnapShot = INVALID_HANDLE_VALUE;
	PROCESSENTRY32 pe;
	DWORD dwPID;
	pe.dwSize = sizeof(PROCESSENTRY32);

	hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

	Process32First(hSnapShot, &pe);

	do 
	{
		dwPID = pe.th32ProcessID;
		if(dwPID < 100)
			continue;

		if(!lstrcmp(pe.szExeFile, szProcessName)) // 찾고자하는 프로세스가 있으면 
			return dwPID;

	} while (Process32Next(hSnapShot, &pe));

	CloseHandle(hSnapShot);

	return 0;
}



 

// -- stealth.dll // #include #include #define STATUS_SUCCESS (0x00000000L) #define DEF_NTDLL ("ntdll.dll") #define DEF_ZWQUERYSYSTEMINFORMATION ("ZwQuerySystemInformation") #define DEF_HIDEPROCNAMEA ("AllProcessInjector.exe") #define DEF_HIDEPROCNAMEW (L"AllProcessInjector.exe") //나중에 쓰일지도 모른다. //TCHAR g_szKillProcName[MAX_PATH] = {0, }; // save origin op code s BYTE g_pOrgBytes[5] = {0, }; typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation = 0, SystemPerformanceInformation = 2, SystemTimeOfDayInformation = 3, SystemProcessInformation = 5, SystemProcessorPerformanceInformation = 8, SystemInterruptInformation = 23, SystemExceptionInformation = 33, SystemRegistryQuotaInformation = 37, SystemLookasideInformation = 45 } SYSTEM_INFORMATION_CLASS; typedef struct _SYSTEM_PROCESS_INFORMATION { ULONG NextEntryOffset; BYTE Reserved1[52]; PVOID Reserved2[3]; HANDLE UniqueProcessId; PVOID Reserved3; ULONG HandleCount; BYTE Reserved4[4]; PVOID Reserved5[11]; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER Reserved6[6]; } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION; BOOL hook_by_code(LPCSTR szDllName, LPCSTR szFuncName, PROC pfnNew, PBYTE pOrgBytes) { FARPROC pfnOrg; DWORD dwOldProtect, dwAddress; BYTE pBuf[5] = { 0xE9, 0, }; PBYTE pByte; pfnOrg = (FARPROC)GetProcAddress(GetModuleHandleA(szDllName), szFuncName); pByte = (PBYTE)pfnOrg; if(pByte[0]== 0xe9) return FALSE; VirtualProtect((LPVOID)pfnOrg, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect); memcpy(pOrgBytes, pfnOrg, 5); // pOrgBytes에 백업 해둔다. dwAddress = (DWORD)pfnNew - (DWORD)pfnOrg - 5; memcpy(&pBuf[1], &dwAddress, 4); memcpy(pfnOrg, pBuf, 5); // 패치해준다. VirtualProtect((LPVOID)pfnOrg, 5, dwOldProtect, &dwOldProtect); return TRUE; } BOOL unhook_by_code(LPCSTR szDllName, LPCSTR szFuncName, PBYTE pOrgBytes) { FARPROC pFunc; DWORD dwOldProtect; PBYTE pByte; // API 주소 구한다 pFunc = GetProcAddress(GetModuleHandleA(szDllName), szFuncName); pByte = (PBYTE)pFunc; // 만약 이미 언후킹 되어 있다면 return FALSE if( pByte[0] != 0xE9 ) return FALSE; // 원래 코드(5 byte)를 덮어쓰기 위해 메모리에 WRITE 속성 추가 VirtualProtect((LPVOID)pFunc, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect); // Unhook memcpy(pFunc, pOrgBytes, 5); // 메모리 속성 복원 VirtualProtect((LPVOID)pFunc, 5, dwOldProtect, &dwOldProtect); return TRUE; } typedef NTSTATUS (WINAPI *PFZWQUERYSYSTEMINFORMATION) ( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength ); NTSTATUS WINAPI MyZwQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength) { NTSTATUS status; FARPROC pFunc; PSYSTEM_PROCESS_INFORMATION pCur, pPrev; unhook_by_code(DEF_NTDLL, DEF_ZWQUERYSYSTEMINFORMATION, g_pOrgBytes); pFunc = GetProcAddress(GetModuleHandleA(DEF_NTDLL), DEF_ZWQUERYSYSTEMINFORMATION); // 우선 실행해. status = ((PFZWQUERYSYSTEMINFORMATION)pFunc)(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); // 그리고 그결과를 확인해 if(status != STATUS_SUCCESS) goto __NTQUERYSYSINFORMATION_END; if(SystemInformationClass == SystemProcessInformation) { // 이거 프로세스 정보 가지고 있을때 pCur = (PSYSTEM_PROCESS_INFORMATION)SystemInformation; while(1) { if(pCur->Reserved2[1] != NULL) { if(!wcscmp((WCHAR *)pCur->Reserved2[1], DEF_HIDEPROCNAMEW)) { if(pCur->NextEntryOffset == 0) pPrev->NextEntryOffset = 0; else pPrev->NextEntryOffset += pCur->NextEntryOffset; } else pPrev = pCur; } if(pCur->NextEntryOffset == 0) break; pCur = (PSYSTEM_PROCESS_INFORMATION)((ULONG)pCur + pCur->NextEntryOffset); } } __NTQUERYSYSINFORMATION_END: hook_by_code(DEF_NTDLL, DEF_ZWQUERYSYSTEMINFORMATION, (PROC)MyZwQuerySystemInformation, g_pOrgBytes); return status; } BOOL WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved) { char szCurProc[MAX_PATH] = {0,}; char *p = NULL; GetModuleFileNameA(NULL, szCurProc, MAX_PATH); p = strchr(szCurProc, '\\'); if((p!=NULL)&&!stricmp(p+1, DEF_HIDEPROCNAMEA)) return TRUE; switch(_Reason) { case DLL_PROCESS_ATTACH: hook_by_code(DEF_NTDLL, DEF_ZWQUERYSYSTEMINFORMATION, (PROC)MyZwQuerySystemInformation, g_pOrgBytes); break; case DLL_PROCESS_DETACH: unhook_by_code(DEF_NTDLL, DEF_ZWQUERYSYSTEMINFORMATION, g_pOrgBytes); break; } return TRUE; }

 

 

현재 내환경은 win 8 64bit 환경이여서 all injection 되는지 확인해보지 못해서... 가상머신 xp 에서 돌려봣는데.. 안됀다.. 왜이러지..? 애초에 32비트 환경이아니면 만들기 힘들잖아?

 

-- 14/01/07 --

일단 하긴했는데 문제가 있ㅇ당

테스트용으로 메모장이 켜지면 종료되게 했다.

그런데 myresumethread에서 예외처리안했더니 시도때도 없이 막 디버깅하라고듬

 

소스들임

 

 

 

 

stealth.cpp

 

AllProcessInjector.cpp

 

 

어차피 목표는 유저단이 아니라 커널단에서 막는거니..  이 정도에서 넘어가자 커널로

 

'WIN API' 카테고리의 다른 글

cpp 객체리턴 액세스 위반 에러  (6) 2015.04.28
winapi] 64bit dll injector  (2) 2014.01.08
win api] lol 실행 차단  (0) 2014.01.02
Dll Injector, Dll Ejector  (0) 2013.10.11
#pragma once  (0) 2013.09.04
WINAPI ] 간단한 채팅2  (0) 2013.05.07
Posted by ludwings

댓글을 달아 주세요

Dll Injector, Dll Ejector

WIN API / 2013. 10. 11. 20:32


요게 기본이다


첫번째 드랍박스는 현재 실행중인 process목록을 보여준다 근데이거 실시간아님 ㅠㅠ




그리고 이창 더블클릭하면 파일선택하는 창이나오는데 dll 파일 선택해준다 그러면 밑에 라벨이 dll 경로로 바뀐다.



그리고 인젝트 버튼 누르면 INJECTED!하면서 인젝트 된다. 나는 notepad.exe에 testdll.dll 을 inject 해봣다.



그리고 프로세스를 선택하게되면 그밑에 콤보박스에 그 프로세스의 dll 목록들이 표시되는데 

하나 선택한다. 나는 방금넣었던 testdll.dll을 이젝트해봐야징




그리고 eject! 버튼을 누르면 EJECTED! 와함께 dll이 Eject된걸 확인 할수있다.




DllInjector.exe


//소스


'WIN API' 카테고리의 다른 글

winapi] 64bit dll injector  (2) 2014.01.08
win api] lol 실행 차단  (0) 2014.01.02
Dll Injector, Dll Ejector  (0) 2013.10.11
#pragma once  (0) 2013.09.04
WINAPI ] 간단한 채팅2  (0) 2013.05.07
간단한 쓰레드 만들기  (0) 2013.05.06
Posted by ludwings

댓글을 달아 주세요

#pragma once

WIN API / 2013. 9. 4. 14:42

#pragma를 자주볼수있는데

 이를 컴파일러 지시어 라고한다.

 

프로젝트 메뉴에서 클래스를 생성하게 되면

#pragma once 가 자동 추가된다.

 

얘는 표준으로 보게되면

#ifndef POINT_H

#def POINT_H

~~~~~

#endif

 

요렇게 사용하는 것과 같다.

그 외에도 특별한 기능을 많이 사용한다.

 

컴파일러마다 다다르다..

'WIN API' 카테고리의 다른 글

win api] lol 실행 차단  (0) 2014.01.02
Dll Injector, Dll Ejector  (0) 2013.10.11
#pragma once  (0) 2013.09.04
WINAPI ] 간단한 채팅2  (0) 2013.05.07
간단한 쓰레드 만들기  (0) 2013.05.06
WINAPI ] 채팅 프로그램1  (0) 2013.05.06
Posted by ludwings

댓글을 달아 주세요

win 8 64bit dll inject

2013. 6. 17. 23:02
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

winapi ] ftp ㅜㅜ 2

2013. 6. 10. 01:11
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

winapi ] FTP 따라하기

2013. 6. 6. 19:10
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

최근에 달린 댓글

최근에 받은 트랙백

글 보관함