l2-unlegits/L2Detect_starter/L2Detect_starter.cpp
alexey.min 4ab3ce1c16
2012-02-04 11:50:00 +00:00

250 lines
6.9 KiB
C++
Raw Blame History

#include "stdafx.h"
#include "ChooseDlg.h"
#define PROCESS_NAME "l2.exe"
#define DLL_NAME "L2Detect.dll"
#define DLL_NAME_D "L2Detect_d.dll"
#define DLL_AUTH_NAME "L2Detect_auth.dll"
//I could just use PROCESS_ALL_ACCESS but it's always best to use the absolute bare minimum of priveleges, so that your code works in as
//many circumstances as possible.
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
BOOL WriteProcessBYTES( HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize );
int RunProcess( HANDLE *phProcess, HANDLE *phThread );
BOOL InjectDLL( HANDLE hProcess, char *dllName );
extern "C" __declspec(dllimport) int getHWID( char *);
bool validateAuthDll()
{
HINSTANCE hInstDLL = LoadLibrary( TEXT( DLL_AUTH_NAME ) );
if( hInstDLL )
{
FreeLibrary( hInstDLL );
return true;
}
MessageBox( NULL,
TEXT("The application has failed to start because required DLL ")
TEXT( DLL_AUTH_NAME )
TEXT( " was not found.\n" )
TEXT( "Reinstall application or contact application author." )
,TEXT("DLL Error"), MB_ICONSTOP );
return false;
}
bool IsWindowsNT()
{
OSVERSIONINFO osinfo;
memset( &osinfo, 0, sizeof(osinfo) );
osinfo.dwOSVersionInfoSize = sizeof(osinfo);
GetVersionEx( &osinfo );
if( osinfo.dwMajorVersion < 5 ) return false;
return true;
}
void run_connect()
{
SOCKET s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
addr.sin_port = htons( 80 );
//addr.sin_addr.s_addr = inet_addr( "81.30.199.5" );
//addr.sin_port = htons( 7777 );
//
int r = connect( s, (const sockaddr *)&addr, sizeof(addr) );
if( r == -1 )
{
MessageBox( NULL, TEXT("connect() failed!"), TEXT("Error!"), MB_ICONSTOP );
closesocket( s );
return;
}
MessageBox( NULL, TEXT("connect() OK!"), TEXT("OK!"), MB_ICONINFORMATION );
shutdown( s, 0 );
closesocket( s );
}
HINSTANCE Load_L2DetectDLL( char *outDllName )
{
HINSTANCE hDLL = LoadLibrary( TEXT( DLL_NAME ) );
if( hDLL == NULL )
{
hDLL = LoadLibrary( TEXT( DLL_NAME_D ) );
if( hDLL == NULL )
return NULL;
else
strcpy( outDllName, DLL_NAME_D );
}
else
strcpy( outDllName, DLL_NAME );
return hDLL;
}
int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
InitCommonControls();
//if( !validateAuthDll() ) return 1; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char foundDllName[256] = {0};
INT_PTR r = ChooseMode( hInstance );
if( r == IDNO ) // outgame
{
WSADATA wsadata;
WSAStartup( MAKEWORD(2,0), &wsadata );
TCHAR tszEvtName[256];
wsprintf( tszEvtName, TEXT("L2Detect Outgame Event_%d"), (unsigned)GetCurrentProcessId() );
HANDLE hEvtDbg = CreateEvent( NULL, FALSE, FALSE, tszEvtName );
HINSTANCE hL2DetectDLL = Load_L2DetectDLL( foundDllName );
if( hL2DetectDLL == NULL )
{
MessageBox( NULL,
TEXT("Cannot find required DLL: ")
TEXT( DLL_NAME ) TEXT(" / ") TEXT( DLL_NAME_D ),
TEXT("Error starting L2Detect:"), MB_ICONSTOP );
CloseHandle( hEvtDbg );
WSACleanup();
return 0;
}
WaitForSingleObject( hEvtDbg, INFINITE );
Sleep( 1000 );
CloseHandle( hEvtDbg );
WSACleanup();
FreeLibrary( hL2DetectDLL );
return 0;
}
else if( r == IDYES ) // ingame
{
if( IsWindowsNT() )
{
HANDLE hProcess = NULL, hThread = NULL;
int res = RunProcess( &hProcess, &hThread );
if( res == 0 ) return 0;
if( res == 1 )
{
InjectDLL( hProcess, foundDllName );
ResumeThread( hThread );
CloseHandle( hProcess );
CloseHandle( hThread );
}
else
{
MessageBox( 0, TEXT("Cannot start process!"), TEXT("Error!"), MB_ICONSTOP );
}
}
else
{
MessageBox( 0,
TEXT("Required Windows 2000 or later!\n")
TEXT("Your system does not support this method!"),
TEXT("OS Error!"),
MB_ICONSTOP );
}
}// if( r == IDNO )
else if( r == IDRETRY ) // " ( test ) "
{
HINSTANCE hL2DetectDll = Load_L2DetectDLL( foundDllName );
if( hL2DetectDll )
{
MessageBoxA( 0, foundDllName, "Loaded this version of L2Detect.dll:", MB_ICONINFORMATION );
r = IDYES;
while( r == IDYES )
{
r = MessageBox( NULL, TEXT("Run connect()?"), TEXT("OK"), MB_ICONQUESTION | MB_YESNO );
if( r == IDYES ) run_connect();
}
FreeLibrary( hL2DetectDll );
}
else
{
// not loaded
MessageBox( NULL,
TEXT("Cannot find required DLL: ")
TEXT( DLL_NAME ) TEXT(" / ") TEXT( DLL_NAME_D ),
TEXT("Error testing L2Detect:"), MB_ICONSTOP );
}
} // IDRETRY
return 0;
}
int RunProcess( HANDLE *phProcess, HANDLE *phThread )
{
TCHAR lpstrFilter[] = TEXT("Executables\0*.exe\0All files\0*.*\0\0");
TCHAR lpstrFile[512] = {0};
TCHAR dir[512] = {0};
//TCHAR curDir[512] = {0};
//GetCurrentDirectory( sizeof(curDir)/sizeof(curDir[0]), curDir );
_tcscpy( lpstrFile, _T("l2.exe") );
OPENFILENAME ofn;
memset( &ofn, 0, sizeof(ofn) );
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = lpstrFilter;
ofn.lpstrFile = lpstrFile;
ofn.nMaxFile = sizeof(lpstrFile)/sizeof(lpstrFile[0]);
ofn.lpstrTitle = TEXT("Choose program to run");
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NONETWORKBUTTON | OFN_PATHMUSTEXIST;
BOOL ret = GetOpenFileName( &ofn );
if( !ret ) return 0;
//SetCurrentDirectory( procDir );
GetCurrentDirectory( sizeof(dir)/sizeof(dir[0]), dir );
//SetCurrentDirectory( curDir );
PROCESS_INFORMATION pi;
memset( &pi, 0, sizeof(pi) );
STARTUPINFO si;
memset( &si, 0, sizeof(si) );
si.cb = sizeof(si);
ret = CreateProcess( NULL, lpstrFile, NULL, NULL, FALSE,
CREATE_SUSPENDED, NULL, dir, &si, &pi );
if( !ret ) return -1;
//
(*phProcess) = pi.hProcess;
(*phThread) = pi.hThread;
return 1;
}
BOOL InjectDLL( HANDLE hProcess, char *dllName )
{
HANDLE Proc = hProcess;
LPVOID RemoteString, LoadLibAddy;
LoadLibAddy = (LPVOID)GetProcAddress( GetModuleHandle( TEXT("kernel32.dll") ), "LoadLibraryA" );
RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME)+1, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
if( !RemoteString ) MessageBox( 0, TEXT("VirtualAllocEx() returned NULL!"), TEXT("Error (InjectDLL)"), MB_ICONSTOP );
if( WriteProcessMemory(Proc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL) == FALSE )
MessageBox( 0, TEXT("WriteProcessMemory() returned FALSE!"), TEXT("Error (InjectDLL)"), MB_ICONSTOP );
if( CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL) == NULL )
MessageBox( 0, TEXT("CreateRemoteThread() returned NULL!"), TEXT("Error (InjectDLL)"), MB_ICONSTOP );
return TRUE;
}