diff --git a/l2detect/ConfigDlg.cpp b/l2detect/ConfigDlg.cpp index dbb5208..88b8482 100644 --- a/l2detect/ConfigDlg.cpp +++ b/l2detect/ConfigDlg.cpp @@ -59,6 +59,8 @@ void ConfigDlg_OnInitDialog( HWND hDlg ) SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.2 - Gracia Part 2") ); SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.3 - Gracia Final") ); SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.4 - Gracia Epilogue") ); + SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("2nd Throne - Freya") ); + SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("2nd Throne - High Five") ); SendMessage( h, CB_SETCURSEL, (WPARAM)g_cfg.L2_version, 0 ); // L2 Client Version h = GetDlgItem( hDlg, IDC_CB_L2CVER ); @@ -68,6 +70,8 @@ void ConfigDlg_OnInitDialog( HWND hDlg ) SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.2 - Gracia Part 2") ); SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.3 - Gracia Final") ); SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("Chaotic Throne 2.4 - Gracia Epilogue") ); + SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("2nd Throne - Freya") ); + SendMessage( h, CB_ADDSTRING, 0, (LPARAM)TEXT("2nd Throne - High Five") ); SendMessage( h, CB_SETCURSEL, (WPARAM)g_cfg.L2_client_version, 0 ); // full mode enable @@ -80,6 +84,8 @@ void ConfigDlg_OnInitDialog( HWND hDlg ) CheckDlgButton( hDlg, IDC_C_GAMEGUARDREPLY, g_cfg.ReplyL2JGameGuardQuery ); // Gracia Epilogue protocol 148 hacks CheckDlgButton( hDlg, IDC_C_EPILOGUE_148_146, g_cfg.GraciaEpilogueProtocol_148_hacks ); + // TeonPvP hacks + CheckDlgButton( hDlg, IDC_C_TEONPVP_HACKS, g_cfg.TeonPvP_hacks ); // L2Walker_DropRequestGMList CheckDlgButton( hDlg, IDC_C_L2WDROPGMLIST, g_cfg.L2Walker_DropRequestGMList ); @@ -120,6 +126,7 @@ void ConfigDlg_OnInitDialog( HWND hDlg ) // forced game server select setting SetDlgItemTextA( hDlg, IDC_E_FORCEGSIP, g_cfg.ForceGameServerIP ); SetDlgItemInt( hDlg, IDC_E_FORCEGSPORT, g_cfg.ForceGameServerPort, TRUE ); + SetDlgItemInt( hDlg, IDC_E_INGAME_GAMESERVER_PORT, g_cfg.IngameGameServerPort, TRUE ); ConfigDlg_UpateEnabledControls( hDlg ); } @@ -141,6 +148,8 @@ void ConfigDlg_OnOK( HWND hDlg, BOOL bEndDialog ) g_cfg.ReplyL2JGameGuardQuery = IsDlgButtonChecked( hDlg, IDC_C_GAMEGUARDREPLY ); // Gracia Epilogue protocol 148 hacks g_cfg.GraciaEpilogueProtocol_148_hacks = IsDlgButtonChecked( hDlg, IDC_C_EPILOGUE_148_146 ); + // TeonPvP hacks + g_cfg.TeonPvP_hacks = IsDlgButtonChecked( hDlg, IDC_C_TEONPVP_HACKS ); // L2Walker_DropRequestGMList g_cfg.L2Walker_DropRequestGMList = IsDlgButtonChecked( hDlg, IDC_C_L2WDROPGMLIST ); @@ -177,10 +186,12 @@ void ConfigDlg_OnOK( HWND hDlg, BOOL bEndDialog ) // forced GS settings GetDlgItemTextA( hDlg, IDC_E_FORCEGSIP, g_cfg.ForceGameServerIP, sizeof(g_cfg.ForceGameServerIP) ); g_cfg.ForceGameServerPort = GetDlgItemInt( hDlg, IDC_E_FORCEGSPORT, NULL, TRUE ); + g_cfg.IngameGameServerPort = GetDlgItemInt( hDlg, IDC_E_INGAME_GAMESERVER_PORT, NULL, TRUE ); // g_cfg.SaveConfig(); - if( bEndDialog == TRUE ) EndDialog( hDlg, IDOK ); + if( bEndDialog == TRUE ) + EndDialog( hDlg, IDOK ); } void ConfigDlg_OnApply( HWND hDlg ) @@ -269,6 +280,11 @@ void ConfigDlg_UpateEnabledControls( HWND hDlg ) EnableWindow( GetDlgItem( hDlg, IDC_E_REALPORT ), FALSE ); //EnableWindow( GetDlgItem( hDlg, IDC_E_PLAYGSNO ), FALSE ); } + //else + //{ + // disable some controls in outgame mode + // EnableWindow( GetDlgItem( hDlg, IDC_E_INGAME_GAMESERVER_PORT ), FALSE ); + //} // also temporarily disable some controls - EnableWindow( GetDlgItem( hDlg, IDC_C_ENABLE_MODGT ), FALSE ); + //EnableWindow( GetDlgItem( hDlg, IDC_C_ENABLE_MODGT ), FALSE ); } diff --git a/l2detect/ConfigIni.cpp b/l2detect/ConfigIni.cpp index e953cf1..9de79a5 100644 --- a/l2detect/ConfigIni.cpp +++ b/l2detect/ConfigIni.cpp @@ -36,6 +36,7 @@ void CConfig::_initNull() OverrideGameProtocolVersion = 0; ReplyL2JGameGuardQuery = 0; GraciaEpilogueProtocol_148_hacks = 0; + TeonPvP_hacks = 0; // L2Walker fixes L2Walker_DropRequestGMList = 0; L2Walker_FixMoveBackwardToLocation = 1; @@ -172,6 +173,10 @@ bool CConfig::ReadConfig( const char *szConfigFileName ) { sscanf( token, "%d", &(this->GraciaEpilogueProtocol_148_hacks) ); } + if( strstr( line, "TeonPvP_hacks" ) == line ) + { + sscanf( token, "%d", &(this->TeonPvP_hacks) ); + } if( strstr( line, "ThreadProirityRaiseEnable" ) == line ) { sscanf( token, "%d", &(this->ThreadProirityRaiseEnable) ); @@ -221,13 +226,15 @@ bool CConfig::SaveConfig() fprintf( f, "" "# First - configure Lineage2 game protocol version and L2 Client version.\n" "# Supported versions are:\n" -"# * Chaotic Throne 1 - The Kamael = 0\n" -"# * Chaotic Throne 1.5 - Hellbound = 1\n" -"# * Chaotic Throne 2 - Gracia (Part 1) = 2\n" -"# * Chaotic Throne 2.2 - Gracia Part 2 = 3\n" -"# * Chaotic Throne 2.3 - Gracia Final = 4\n" -"# * Chaotic Throne 2.4 - Gracia Epilogue = 5\n" -"# default is 4 (CT2.3 Gracia Final)\n" +"# * Chaotic Throne 1 - The Kamael = 0\n" +"# * Chaotic Throne 1.5 - Hellbound = 1\n" +"# * Chaotic Throne 2 - Gracia (Part 1) = 2\n" +"# * Chaotic Throne 2.2 - Gracia Part 2 = 3\n" +"# * Chaotic Throne 2.3 - Gracia Final = 4\n" +"# * Chaotic Throne 2.4 - Gracia Epilogue = 5\n" +"# * 2nd Throne - Freya = 6\n" +"# * 2nd Throne - High Five = 7\n" +"# default is 6 (CT2.5 Freya)\n" "Lineage2Version = %d\n" "Lineage2ClientVersion = %d\n" "\n\n", @@ -384,6 +391,12 @@ bool CConfig::SaveConfig() "\n", GraciaEpilogueProtocol_148_hacks ); + fprintf( f, "" +"# Enables server specific protocol handlers for TeonPvP server.\n" +"TeonPvP_hacks = %d\n" +"\n", + TeonPvP_hacks ); + fprintf( f, "" "# Fixes L2Walker wrong or old packets\n" "L2Walker_DropRequestGMList = %d\n" @@ -426,13 +439,9 @@ bool CConfig::SaveConfig() void CConfig::SetDefault() { - // declared in L2PcodeObfuscator.h (include L2Packets.h) - //#define L2_VERSION_T1 0 - //#define L2_VERSION_T15 1 - //#define L2_VERSION_T2 2 - //#define L2_VERSION_T22 3 - L2_version = 4; - L2_client_version = 4; + // declared in L2_versions.h (include L2Packets.h) + L2_version = 7; + L2_client_version = 7; // Listen port setup strcpy( FakeListenLoginIP, "127.0.0.1" ); @@ -462,6 +471,7 @@ void CConfig::SetDefault() OverrideGameProtocolVersion = 0; ReplyL2JGameGuardQuery = 0; GraciaEpilogueProtocol_148_hacks = 0; + TeonPvP_hacks = 0; // L2Walker fixes L2Walker_DropRequestGMList = 0; diff --git a/l2detect/ConfigIni.h b/l2detect/ConfigIni.h index 3b56955..ed6c015 100644 --- a/l2detect/ConfigIni.h +++ b/l2detect/ConfigIni.h @@ -51,6 +51,7 @@ public: int OverrideGameProtocolVersion; int ReplyL2JGameGuardQuery; int GraciaEpilogueProtocol_148_hacks; + int TeonPvP_hacks; // L2Walker fixes int L2Walker_DropRequestGMList; diff --git a/l2detect/DebugDlg.cpp b/l2detect/DebugDlg.cpp index 3e8fd20..36ed0b2 100644 --- a/l2detect/DebugDlg.cpp +++ b/l2detect/DebugDlg.cpp @@ -37,6 +37,7 @@ void DebugDlg_OnTimer( HWND hDlg, UINT_PTR nIDEvent ); void DebugDlg_updateInfo( HWND hDlg ); void DebugDlg_OnBnClickedValidateInterception( HWND hDlg ); void DebugDlg_OnBnClickedInterceptConnect( HWND hDlg ); +void DebugDlg_OnBnClickedRestoreConnect( HWND hDlg ); void DebugDlg_OnBnClickedCheckVP( HWND hDlg ); void DebugDlg_OnBnClickedDumpAllRelations( HWND hDlg ); void DebugDlg_OnBnClickedPrintAddrTid( HWND hDlg ); @@ -63,6 +64,7 @@ INT_PTR CALLBACK DebugDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara case IDC_B_CONDISABLE: DebugDlg_OnBnClickedDisableConsole( hDlg ); break; case IDC_B_VALIDATEINTERCEPT: DebugDlg_OnBnClickedValidateInterception( hDlg ); break; case IDC_B_INTERCEPTCONNECT: DebugDlg_OnBnClickedInterceptConnect( hDlg ); break; + case IDC_B_RESTORECONNECT: DebugDlg_OnBnClickedRestoreConnect( hDlg ); break; case IDC_B_CHECK_VIRTUALPROTECTEX: DebugDlg_OnBnClickedCheckVP( hDlg ); break; case IDC_B_LOADWALKER: DebugDlg_OnBnClickedLoadWalker( hDlg ); break; case IDC_B_UNLOADWALKER: DebugDlg_OnBnClickedUnloadWalker( hDlg ); break; @@ -305,6 +307,12 @@ void DebugDlg_OnBnClickedInterceptConnect( HWND hDlg ) } } +void DebugDlg_OnBnClickedRestoreConnect( HWND hDlg ) +{ + hDlg = NULL; + Hook_RestoreConnect_my(); +} + void DebugDlg_OnBnClickedCheckVP( HWND hDlg ) { hDlg = NULL; diff --git a/l2detect/GameClient_full_PP_client.cpp b/l2detect/GameClient_full_PP_client.cpp index 822cb6b..b80cbf6 100644 --- a/l2detect/GameClient_full_PP_client.cpp +++ b/l2detect/GameClient_full_PP_client.cpp @@ -233,7 +233,7 @@ bool GameClient::PP_full_fromClient( unsigned char *bytes, unsigned int len, p->read_protoVer( &(this->gameProtoVer) ); delete p; log_error( LOG_PACKETNAME, "Client: 0e ProtocolVersion %u\n", this->gameProtoVer ); - if( this->gameProtoVer >= 0xFFFFFFF0 ) + if( this->gameProtoVer >= 0xFFFFFFF0 ) // < 0 { this->thisWasJustServerPing = true; // received client ping (full) log_error( LOG_PACKETNAME, "Received client ping server... no process\n" ); diff --git a/l2detect/GameClient_full_PP_server.cpp b/l2detect/GameClient_full_PP_server.cpp index 4d8a6b6..4899672 100644 --- a/l2detect/GameClient_full_PP_server.cpp +++ b/l2detect/GameClient_full_PP_server.cpp @@ -145,6 +145,7 @@ bool GameClient::PP_full_fromServer( unsigned char *bytes, unsigned int len, lpco->init_tables( this->opcodeObfuscator ); this->clsObfuscator = (void *)lpco; } + else log_error( LOG_PACKETNAME, "Server: 2e KeyPacket: not using obfuscation key! OK\n" ); } break; // KeyPacket case 0x09: // CharacterSelectionInfo // Hellbound { diff --git a/l2detect/GameClient_sniff.cpp b/l2detect/GameClient_sniff.cpp index 34e811c..a9b23e4 100644 --- a/l2detect/GameClient_sniff.cpp +++ b/l2detect/GameClient_sniff.cpp @@ -83,7 +83,7 @@ bool GameClient::PC_sniff( SOCKET scl, unsigned char *sip, unsigned short int sp log_error( LOG_WARNING, "GameClient::ProcessClient_onlySniff(): Cannot open log file [%s] for writing!\n", filename ); // open raw log data for not decrypted packets, if problems with decryption - // this->logfileRaw = fopen( filename_raw, "wt" ); + this->logfileRaw = fopen( filename_raw, "wt" ); } // set initial game client state @@ -235,6 +235,11 @@ closeSocks: // all cleanup fclose( this->logfile ); this->logfile = NULL; } + if( this->logfileRaw ) + { + fclose( this->logfileRaw ); + this->logfileRaw = NULL; + } // stop AI thread ai.notifyEvent( UAI_EVENT_STOP ); this->resetConnectedState(); diff --git a/l2detect/GameClient_sniff_PP_server.cpp b/l2detect/GameClient_sniff_PP_server.cpp index 0fd88e1..edc468f 100644 --- a/l2detect/GameClient_sniff_PP_server.cpp +++ b/l2detect/GameClient_sniff_PP_server.cpp @@ -77,20 +77,44 @@ void GameClient::PP_sniff_fromServer( unsigned char *bytes, unsigned int len ) //case 0x00: // Interlude: KeyPacket, FirstKey case 0x2e: // Hellbound: KeyPacket, FirstKey { - L2Game_KeyPacket *p = new L2Game_KeyPacket( bytes, len ); - p->read_key( this->key_client_cs ); - p->read_GameServerID(); - this->opcodeObfuscator = p->read_OpcodeObfuscator(); - L2Game_KeyPacket::createInitialHellboundKey( this->key_client_cs, - this->key_client_cs ); - delete p; + if( g_cfg.TeonPvP_hacks ) + { + L2GamePacket *p = new L2GamePacket( bytes, len ); + unsigned char opcode = p->getPacketType(); + unsigned char protoOk = p->readC(); + p->readBytes( this->key_client_cs, 16 ); // 16 bytes instead of 8? + int d1 = p->readD(); + int d2 = p->readD(); + int c1 = p->readC(); + int obf_key = p->readD(); + delete p; + // + log_error( LOG_PACKETNAME, "TeonPvP: enbaled hacks. KeyPacket [%02X] Read key [", (unsigned)opcode ); + for( i=0; i<16; i++ ) log_error_np( LOG_PACKETNAME, "%02X", (unsigned)this->key_client_cs[i] ); + log_error_np( LOG_PACKETNAME, "]\n" ); + log_error( LOG_PACKETNAME, " protocolOk : %d\n", protoOk ); + log_error( LOG_PACKETNAME, " d1 : %d\n", d1 ); + log_error( LOG_PACKETNAME, " d2 : %d\n", d2 ); + log_error( LOG_PACKETNAME, " c1 : %d\n", c1 ); + log_error( LOG_PACKETNAME, " obf_key : %d\n", obf_key ); + } + else + { + L2Game_KeyPacket *p = new L2Game_KeyPacket( bytes, len ); + p->read_key( this->key_client_cs ); + p->read_GameServerID(); + this->opcodeObfuscator = p->read_OpcodeObfuscator(); + L2Game_KeyPacket::createInitialHellboundKey( this->key_client_cs, + this->key_client_cs ); + delete p; + } memcpy( this->key_client_sc, this->key_client_cs, sizeof(this->key_client_cs) ); this->xor_enabled = true; log_error( LOG_PACKETNAME, "Server: 2e KeyPacket\n" ); - log_error( LOG_DEBUGDUMP, "Server: 2e KeyPacket: key: " ); - for( i=0; i<16; i++ ) log_error_np( LOG_DEBUGDUMP, "%02X ", this->key_client_cs[i] ); - log_error_np( LOG_DEBUGDUMP, "\n" ); + log_error( LOG_PACKETNAME, "Server: 2e KeyPacket: key: " ); + for( i=0; i<16; i++ ) log_error_np( LOG_PACKETNAME, "%02X ", this->key_client_cs[i] ); + log_error_np( LOG_PACKETNAME, "\n" ); // log obfuscator, if it is != 0x00000000 LOG_LEVEL log_level = LOG_DEBUGDUMP; if( this->opcodeObfuscator != 0x00000000 ) @@ -111,6 +135,7 @@ void GameClient::PP_sniff_fromServer( unsigned char *bytes, unsigned int len ) lpco->init_tables( this->opcodeObfuscator ); this->clsObfuscator = (void *)lpco; } + else log_error( LOG_PACKETNAME, "Server: 2e KeyPacket: not using obfuscator\n" ); } break; // KeyPacket case 0x09: // CharacterSelectionInfo // Hellbound { diff --git a/l2detect/L2Detect.rc b/l2detect/L2Detect.rc index b9be56c..cd02e75 100644 --- a/l2detect/L2Detect.rc +++ b/l2detect/L2Detect.rc @@ -24,54 +24,59 @@ BEGIN END -IDD_CONFIG DIALOGEX 0,0,332,261 +IDD_CONFIG DIALOGEX 0,0,332,297 CAPTION "Network/Protocol Setup" FONT 8,"MS Shell Dlg",400,0,1 STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME|DS_SETFONT|DS_FIXEDSYS BEGIN - CONTROL "OK",IDOK,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON,208,241,50,15 - CONTROL "Cancel",IDCANCEL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,262,241,50,15 - CONTROL "OverrideGameProtocolVersion:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,16,84,100,9 - CONTROL "",IDC_E_OVERRIDE_GPV,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,120,81,40,15,WS_EX_CLIENTEDGE - CONTROL "Logging level:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,186,127,46,9 - CONTROL "Enable modify Game Server Traffic",IDC_C_ENABLE_MODGT,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,81,128,11 - CONTROL "",IDC_CB_LOGLEVEL,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,258,127,60,87 - CONTROL "ThreadPriorityRaiseEnable",IDC_C_ENABLE_THREADPRI,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,96,100,11 - CONTROL "L2Walker_Fix_MoveBackwardToLocation",IDC_C_L2WMOVEFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,144,146,11 - CONTROL "Ports Setup",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,10,192,320,46 - CONTROL "Listen Login Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,206,56,9 - CONTROL "Listen Game Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,219,58,9 - CONTROL "",IDC_E_FLPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,201,36,15,WS_EX_CLIENTEDGE - CONTROL "",IDC_E_FGPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,217,36,15,WS_EX_CLIENTEDGE - CONTROL "Real Login Server:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,126,203,60,9 - CONTROL "",IDC_E_REALIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,196,201,84,15,WS_EX_CLIENTEDGE - CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,201,8,9 - CONTROL "",IDC_E_REALPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,201,32,15,WS_EX_CLIENTEDGE - CONTROL "Apply :)",IDC_APPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,152,241,50,15 - CONTROL "Log Game Packets",IDC_C_LOGGAMEP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,142,128,11 - CONTROL "Log File Name Prefix:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,184,158,68,9 - CONTROL "",IDC_E_LOGFNPREFIX,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,258,155,60,15,WS_EX_CLIENTEDGE + CONTROL "OK",IDOK,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON,132,276,50,15 + CONTROL "Cancel",IDCANCEL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,260,276,50,15 + CONTROL "OverrideGameProtocolVersion:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,16,96,100,9 + CONTROL "",IDC_E_OVERRIDE_GPV,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,120,92,40,15,WS_EX_CLIENTEDGE + CONTROL "Logging level:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,186,138,46,9 + CONTROL "Enable modify Game Server Traffic",IDC_C_ENABLE_MODGT,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,92,128,11 + CONTROL "",IDC_CB_LOGLEVEL,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,258,138,60,87 + CONTROL "ThreadPriorityRaiseEnable",IDC_C_ENABLE_THREADPRI,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,107,100,11 + CONTROL "L2Walker_Fix_MoveBackwardToLocation",IDC_C_L2WMOVEFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,155,146,11 + CONTROL "Ports Setup",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,203,322,67 + CONTROL "Listen Login Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,216,56,9 + CONTROL "Listen Game Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,232,58,9 + CONTROL "",IDC_E_FLPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,212,30,15,WS_EX_CLIENTEDGE + CONTROL "",IDC_E_FGPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,228,30,15,WS_EX_CLIENTEDGE + CONTROL "Real Login Server:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,214,82,9 + CONTROL "",IDC_E_REALIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,210,212,70,15,WS_EX_CLIENTEDGE + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,212,8,9 + CONTROL "",IDC_E_REALPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,212,32,15,WS_EX_CLIENTEDGE + CONTROL "Apply :)",IDC_APPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,196,276,50,15 + CONTROL "Log Game Packets",IDC_C_LOGGAMEP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,153,128,11 + CONTROL "Log File Name Prefix:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,184,169,68,9 + CONTROL "",IDC_E_LOGFNPREFIX,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,258,166,60,15,WS_EX_CLIENTEDGE CONTROL "Lineage II Server Protocol Version:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,20,16,112,8 CONTROL "",IDC_CB_L2VER,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,150,14,172,70 CONTROL "Lineage II Client Version:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,20,31,82,9 CONTROL "",IDC_CB_L2CVER,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,150,29,172,70 - CONTROL "Lineage II Versions",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,5,318,61 - CONTROL "Logging",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,178,116,148,70 - CONTROL "L2Walker_Drop_RequestGMList",IDC_C_L2WDROPGMLIST,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,132,146,11 - CONTROL "WarnUnknownPackets",IDC_C_WARNUNKP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,171,88,11 - CONTROL "L2Walker_Fix_ChangeWaitType2",IDC_C_L2WSITFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,155,146,11 - CONTROL "Force Game Server IP:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,124,219,76,9 - CONTROL "",IDC_E_FORCEGSIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,204,217,76,15,WS_EX_CLIENTEDGE - CONTROL "",IDC_E_FORCEGSPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,217,32,15,WS_EX_CLIENTEDGE - CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,217,4,9 - CONTROL "L2Walker fixes",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,116,162,70 - CONTROL "L2Walker_Inject_StatusUpdate",IDC_C_L2WALKER_INJECTSTATUSUPDATE,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,166,146,11 - CONTROL "Misc hacks (be careful!!!)",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,72,318,41 - CONTROL "Reply to L2J GameGuard query",IDC_C_GAMEGUARDREPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,97,134,11 + CONTROL "Lineage II Versions",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,5,318,72 + CONTROL "Logging",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,178,127,148,70 + CONTROL "L2Walker_Drop_RequestGMList",IDC_C_L2WDROPGMLIST,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,144,146,11 + CONTROL "WarnUnknownPackets",IDC_C_WARNUNKP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,182,88,11 + CONTROL "L2Walker_Fix_ChangeWaitType2",IDC_C_L2WSITFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,166,146,11 + CONTROL "Force Game Server IP:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,232,84,9 + CONTROL "",IDC_E_FORCEGSIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,210,228,70,15,WS_EX_CLIENTEDGE + CONTROL "",IDC_E_FORCEGSPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,228,32,15,WS_EX_CLIENTEDGE + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,228,4,9 + CONTROL "L2Walker fixes",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,127,162,70 + CONTROL "L2Walker_Inject_StatusUpdate",IDC_C_L2WALKER_INJECTSTATUSUPDATE,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,179,146,11 + CONTROL "Misc hacks (be careful!!!)",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,83,318,41 + CONTROL "Reply to L2J GameGuard query",IDC_C_GAMEGUARDREPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,108,134,11 CONTROL "Gracia Epilogue Server protocol 148 -> Client protocol 146 hacks (experimental!)",IDC_C_EPILOGUE_148_146,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,18,46,302,11 + CONTROL "TeonPvP server hacks",IDC_C_TEONPVP_HACKS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,18,59,114,9 + CONTROL "",IDC_E_INGAME_GAMESERVER_PORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,245,32,13,WS_EX_CLIENTEDGE + CONTROL "Also intercept this game server port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,249,154,9 + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,247,4,9 END -IDD_DEBUG DIALOGEX 0,0,266,158 + +IDD_DEBUG DIALOGEX 0,0,266,160 CAPTION "Debug" FONT 8,"MS Shell Dlg",400,0,1 STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME|DS_SETFONT|DS_FIXEDSYS @@ -91,13 +96,14 @@ BEGIN CONTROL "char_name",IDC_CHARNAME,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP|SS_SUNKEN,7,76,251,11 CONTROL "Enable Console",IDC_B_CONENABLE,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,65,42,64,14 CONTROL "Disable Console",IDC_B_CONDISABLE,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,141,42,63,14 - CONTROL "Check Interceptions",IDC_B_VALIDATEINTERCEPT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,94,92,15 - CONTROL "Intercept connect",IDC_B_INTERCEPTCONNECT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,106,94,80,15 - CONTROL "Check VP",IDC_B_CHECK_VIRTUALPROTECTEX,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,190,94,60,15 - CONTROL "Load L2Walker.dll",IDC_B_LOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,7,116,75,14 - CONTROL "Unload L2Walker.dll",IDC_B_UNLOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,116,76,15 - CONTROL "Dump All Relations",IDC_B_DUMP_ALL_RELATIONS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,136,86,15 - CONTROL "Print address of UserAI::dwThreadID",IDC_B_PRINTADDRTID,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,102,136,136,15 + CONTROL "Check Interceptions",IDC_B_VALIDATEINTERCEPT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,94,74,15 + CONTROL "Intercept connect",IDC_B_INTERCEPTCONNECT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,136,94,62,15 + CONTROL "Check VPEx",IDC_B_CHECK_VIRTUALPROTECTEX,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,84,94,48,15 + CONTROL "Load L2Walker.dll",IDC_B_LOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,118,76,15 + CONTROL "Unload L2Walker.dll",IDC_B_UNLOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,118,76,15 + CONTROL "Dump All Relations",IDC_B_DUMP_ALL_RELATIONS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,140,86,15 + CONTROL "Print address of UserAI::dwThreadID",IDC_B_PRINTADDRTID,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,102,140,136,15 + CONTROL "Restore connect",IDC_B_RESTORECONNECT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,200,94,62,15 END diff --git a/l2detect/RadarDllWnd.cpp b/l2detect/RadarDllWnd.cpp index 4b718d0..08e79e6 100644 --- a/l2detect/RadarDllWnd.cpp +++ b/l2detect/RadarDllWnd.cpp @@ -113,11 +113,11 @@ BOOL CALLBACK RadarDllWindowThread_EnumWindowsProc( HWND hWnd, LPARAM lParam ) // window is running in the same process as we are // check window class or name to check is it is main Lineage II window bool isL2Window = false; - TCHAR wndTitle[256]; + wchar_t wndTitle[256]; memset( wndTitle, 0, sizeof(wndTitle) ); - GetWindowText( hWnd, wndTitle, 255 ); + GetWindowTextW( hWnd, wndTitle, 255 ); log_error( LOG_DEBUGDUMP, ".. got window title [%S]\n", wndTitle ); - if( _tcsicmp( wndTitle, _T("Lineage II") ) == 0 ) + if( _wcsicmp( wndTitle, L"Lineage II" ) == 0 ) { isL2Window = true; log_error( LOG_DEBUG, "... found L2 window by title!\n" ); @@ -126,11 +126,11 @@ BOOL CALLBACK RadarDllWindowThread_EnumWindowsProc( HWND hWnd, LPARAM lParam ) if( !isL2Window ) { log_error( LOG_DEBUGDUMP, "... window title doesn't match, trying by class name...\n" ); - TCHAR buffer_for_class_name[256] = {0}; - if( GetClassName( hWnd, buffer_for_class_name, 255 ) ) + wchar_t buffer_for_class_name[256] = {0}; + if( GetClassNameW( hWnd, buffer_for_class_name, 255 ) ) { log_error( LOG_DEBUGDUMP, ".... got window class name = [%S]\n", buffer_for_class_name ); - if( _tcsicmp( buffer_for_class_name, _T("l2UnrealWWindowsViewportWindow") ) == 0 ) + if( _wcsicmp( buffer_for_class_name, _T("l2UnrealWWindowsViewportWindow") ) == 0 ) { isL2Window = true; log_error( LOG_DEBUG, ".... found L2 window by class name!\n" ); @@ -139,6 +139,33 @@ BOOL CALLBACK RadarDllWindowThread_EnumWindowsProc( HWND hWnd, LPARAM lParam ) else ErrorLogger_LogLastError( "GetClassName()", GetLastError() ); } + // try by process name! + if( !isL2Window ) + { + HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid ); + if( hProcess ) + { + wchar_t szFileName[512] = {0}; + //QueryFullProcessImageName( // >=Vista only + DWORD nameLen = GetProcessImageFileNameW( hProcess, szFileName, sizeof(szFileName)/sizeof(szFileName[0]) ); + if( nameLen > 0 ) + { + const wchar_t *wExe = wcsrchr( szFileName, '\\' ); + if( (_wcsicmp( wExe, L"l2.bin" ) == 0) || (_wcsicmp( wExe, L"l2.exe" ) == 0 ) ) + { + isL2Window = true; + wchar_t wClassName[256] = {0}; + GetClassNameW( hWnd, wClassName, 255 ); + log_error( LOG_OK, "... found L2 Window by process name (what???) of class [%S]\n", wClassName ); + } + } + else + ErrorLogger_LogLastError( "GetProcessImageFileName()", GetLastError() ); + CloseHandle( hProcess ); + } + else + ErrorLogger_LogLastError( "OpenProcess()", GetLastError() ); + } // checks... if( isL2Window ) // found { diff --git a/l2detect/Resource.h b/l2detect/Resource.h index a027110..0dfe28d 100644 --- a/l2detect/Resource.h +++ b/l2detect/Resource.h @@ -94,7 +94,8 @@ #define IDC_E_FORCEGSPORT 1088 #define IDC_B_VALIDATEINTERCEPT 1089 #define IDC_B_INTERCEPTCONNECT 1090 -#define IDC_B_CHECK_VIRTUALPROTECTEX 1091 +#define IDC_B_RESTORECONNECT 1158 +#define IDC_B_CHECK_VIRTUALPROTECTEX 1092 #define IDC_C_L2WALKER_INJECTSTATUSUPDATE 1122 #define IDC_B_LOADWALKER 1123 #define IDC_B_UNLOADWALKER 1124 @@ -102,6 +103,8 @@ #define IDC_C_EPILOGUE_148_146 1126 #define IDC_B_DUMP_ALL_RELATIONS 1127 #define IDC_B_PRINTADDRTID 1128 +#define IDC_C_TEONPVP_HACKS 1159 +#define IDC_E_INGAME_GAMESERVER_PORT 1160 // radar sound alerts setup dlg #define IDC_C_SOUNDENEMYENTER 1089 diff --git a/l2detect/net_hook.h b/l2detect/net_hook.h index 7de9f8f..1144000 100644 --- a/l2detect/net_hook.h +++ b/l2detect/net_hook.h @@ -8,6 +8,7 @@ bool Hook_ValidateAlign(); // my method void Hook_InterceptConnect_my(); +void Hook_RestoreConnect_my(); bool Hook_ValidateInterception_my(); bool Hook_IsWinsockConnectOrig(); bool Hook_CheckVirtualProtect(); diff --git a/l2detect/net_hook_my.cpp b/l2detect/net_hook_my.cpp index cbc7883..00c254a 100644 --- a/l2detect/net_hook_my.cpp +++ b/l2detect/net_hook_my.cpp @@ -29,6 +29,9 @@ VirtualProtectEx (kernel32) 8B FF 55 8B EC 5D // jump follows, r // rejump/relocate to VirtualProtectEx inside kernelbase.dll ===================================== */ +#define INSTR_PUSH 0x68 +#define INSTR_RET 0xC3 + unsigned char old_func_prologue[6] = {0,0,0, 0,0,0}; // область для хранения 6-ти затираемых байт начала функции jmp_push_ret jump_code; // машинные инструкции push addr; ret unsigned int connect_orig; // будущий адрес оригинальной функции @@ -48,8 +51,10 @@ unsigned int g_hook_flag_allow_write = PAGE_EXECUTE_READWRITE; // PAGE_EXECUT bool g_hook_restore_read_only = false; unsigned int Proxied_VirtualProtectEx = 0; + BOOL __stdcall Proxy_VirtualProtectEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect ); + void Hook_InterceptConnect_my() { //сначала получим абсолютный адрес функции для перехвата @@ -63,7 +68,7 @@ void Hook_InterceptConnect_my() connect_orig = (DWORD)GetProcAddress( hws2_32, "connect" ); if( connect_orig == 0 ) { - log_error( LOG_ERROR, "Hook_InterceptConnect_my(): cannot get adress of original connect()!\n" ); + log_error( LOG_ERROR, "Hook_InterceptConnect_my(): cannot get adress of ws2_32.dll!connect()!\n" ); ErrorLogger_FlushLogFile(); return; } @@ -78,15 +83,20 @@ void Hook_InterceptConnect_my() // struct member alignment must be == 1 !!!!! // Зададим машинный код инструкции перехода, который затем впишем в начало полученного адреса: - jump_code.instr_push = 0x68; - jump_code.push_arg = (unsigned int)connect_hook_my; - jump_code.instr_ret = 0xC3; + jump_code.instr_push = INSTR_PUSH; // PUSH + jump_code.push_arg = (unsigned int)connect_hook_my; // connect_hook_my + jump_code.instr_ret = INSTR_RET; // RET // Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции po = (unsigned char *)&old_func_prologue; pj = (unsigned char *)connect_orig; - po[0] = pj[0]; po[1] = pj[1]; po[2] = pj[2]; - po[3] = pj[3]; po[4] = pj[4]; po[5] = pj[5]; + if( pj[0] != INSTR_PUSH ) + { + po[0] = pj[0]; po[1] = pj[1]; po[2] = pj[2]; + po[3] = pj[3]; po[4] = pj[4]; po[5] = pj[5]; + } + else + log_error( LOG_WARNING, "Hook_InterceptConnect_my(): current connect() prolog already contains PUSH/RET code, do not overwriting old_prolog!\n" ); // remove read-only access to memory; remember prev.access rights //ret = VirtualProtect( (void *)connect_orig, 6, PAGE_EXECUTE_WRITECOPY, &old_protect ); @@ -127,12 +137,85 @@ void Hook_InterceptConnect_my() } } #ifdef _DEBUG - log_error( LOG_DEBUG, "Hook_InterceptConnect_my(): work done?...\n" ); + log_error( LOG_DEBUG, "Hook_InterceptConnect_my(): END: work done?...\n" ); #endif ErrorLogger_FlushLogFile(); } +void Hook_RestoreConnect_my() +{ + HINSTANCE hws2_32 = GetModuleHandle( TEXT("ws2_32.dll") ); + if( !hws2_32 ) + { + log_error( LOG_ERROR, "Hook_RestoreConnect_my(): cannot get module handle of ws2_32.dll!\n" ); + ErrorLogger_FlushLogFile(); + return; + } + connect_orig = (DWORD)GetProcAddress( hws2_32, "connect" ); + if( connect_orig == 0 ) + { + log_error( LOG_ERROR, "Hook_RestoreConnect_my(): cannot get adress of ws2_32.dll!connect()!\n" ); + ErrorLogger_FlushLogFile(); + return; + } + + if( Proxied_VirtualProtectEx ) + log_error( LOG_WARNING, "Hook_RestoreConnect_my(): START: Using proxied VirtualProtectEx!\n" ); + ErrorLogger_FlushLogFile(); + + BOOL ret; + DWORD old_protect = 0, old_protect_2 = 0; + unsigned char *pc = NULL, *po = NULL; + + // check old prolog + if( old_func_prologue[0] == 0x8B ) + { + // make memory page readwrite + DWORD flProtect = g_hook_flag_allow_write; + ret = 0; + if( Proxied_VirtualProtectEx ) + ret = Proxy_VirtualProtectEx( (HANDLE)-1, (void *)connect_orig, 6, flProtect, &old_protect ); + else + ret = VirtualProtectEx( (HANDLE)-1, (void *)connect_orig, 6, flProtect, &old_protect ); + if( (ret != TRUE) ) + { + DWORD le = GetLastError(); + if( le == ERROR_ACCESS_DENIED ) + log_error( LOG_ERROR, "Hook_RestoreConnect_my(): VirtialProtectEx() failed (allow write): (%d) ERROR_ACCESS_DENIED\n", le ); + else + ErrorLogger_LogLastError( "Hook_RestoreConnect_my(): VirtialProtectEx() failed (allow write)", le ); + ErrorLogger_FlushLogFile(); + } + po = (unsigned char *)&old_func_prologue; + pc = (unsigned char *)connect_orig; + pc[0] = po[0]; pc[1] = po[1]; pc[2] = po[2]; + pc[3] = po[3]; pc[4] = po[4]; pc[5] = po[5]; + log_error( LOG_OK, "Hook_RestoreConnect_my(): restored original connect...\n" ); + ErrorLogger_FlushLogFile(); + } + else + log_error( LOG_WARNING, "Hook_RestoreConnect_my(): old connect() prolog is invalid :(\n" ); + + + // restore previous access to memory + if( g_hook_restore_read_only ) + { + if( Proxied_VirtualProtectEx ) + ret = Proxy_VirtualProtectEx( (HANDLE)-1, (void *)connect_orig, 6, old_protect, &old_protect_2 ); + else + ret = VirtualProtectEx( (HANDLE)-1, (void *)connect_orig, 6, old_protect, &old_protect_2 ); + if( (ret != TRUE) ) + { + DWORD le = GetLastError(); + ErrorLogger_LogLastError( "Hook_RestoreConnect_my(): VirtualProtectEx() failed (restore prev)", le ); + } + } + + ErrorLogger_FlushLogFile(); +} + + bool Hook_check_func_prolog( LPCWSTR dllName, LPCSTR funcName, const unsigned char *orig_bytes ) { HINSTANCE hDll = GetModuleHandleW( dllName ); @@ -218,7 +301,7 @@ bool Hook_ValidateInterception_my() logLevel = LOG_WARNING; log_error( LOG_WARNING, "Not intercepted! Dump will follow...\n" ); } - else log_error( LOG_OK, "Interception OK!\n" ); + else log_error( LOG_OK, "ws2_32.dll!connect() Interception OK!\n" ); log_error( logLevel, "dump of machine codes:\n" @@ -251,7 +334,7 @@ int __stdcall connect_hook_my( unsigned int sock, void *sockaddr, int addrlen ) DWORD le = 0; if( Proxied_VirtualProtectEx ) - log_error( LOG_WARNING, "connect_hook_my(): Using proxied VirtualProtectEx!\n" ); + log_error( LOG_WARNING, "connect_hook_my(): START: Using proxied VirtualProtectEx!\n" ); #ifdef _DEBUG log_error( LOG_DEBUGDUMP, "connect_hook_my(): before restoring old code\n" ); @@ -327,14 +410,14 @@ int __stdcall connect_hook_my( unsigned int sock, void *sockaddr, int addrlen ) // log #ifdef _DEBUG if( paddr->sin_family == AF_INET ) - log_error_np( LOG_DEBUG, "original connect() returned %d\n", ret ); + log_error_np( LOG_DEBUG, "... original connect() returned %d\n", ret ); ErrorLogger_FlushLogFile(); #endif //Снова заменяем 6 байт функции на команду перехода на нашу функцию pc[0] = pj[0]; pc[1] = pj[1]; pc[2] = pj[2]; pc[3] = pj[3]; pc[4] = pj[4]; pc[5] = pj[5]; - log_error( LOG_DEBUGDUMP, "connect_hook_my(): after setting jump again\n" ); + log_error( LOG_DEBUGDUMP, "connect_hook_my(): ENDING: after setting jump again\n" ); // restore prev. protect if( g_hook_restore_read_only ) @@ -370,7 +453,8 @@ int __stdcall connect_nohook_my( unsigned int sock, void *sockaddr, int addrlen BOOL vp_ret = FALSE; DWORD le = 0; // last error - if( Proxied_VirtualProtectEx ) log_error( LOG_WARNING, "connect_nohook_my(): Using proxied VirtualProtectEx!\n" ); + if( Proxied_VirtualProtectEx ) + log_error( LOG_WARNING, "connect_nohook_my(): Using proxied VirtualProtectEx!\n" ); po = (unsigned char *)&old_func_prologue; pj = (unsigned char *)&jump_code; @@ -507,6 +591,7 @@ bool Hook_CheckVirtualProtect() return ret; } + __declspec(naked) BOOL __stdcall Proxy_VirtualProtectEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect ) { diff --git a/l2detect/res/temp.rc b/l2detect/res/temp.rc index ac4ec8d..8d3d1f7 100644 --- a/l2detect/res/temp.rc +++ b/l2detect/res/temp.rc @@ -1,33 +1,57 @@ #define IDC_STATIC -1 -#define IDC_B_DUMP_ALL_RELATIONS 1001 -#define IDC_B_PRINTADDRTID 1002 -IDD_DEBUG DIALOGEX 0,0,266,158 -CAPTION "Debug" +#include "resource.h" +#include "targetver.h" +#include + +IDD_CONFIG DIALOGEX 0,0,332,297 +CAPTION "Network/Protocol Setup" FONT 8,"MS Shell Dlg",400,0,1 STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME|DS_SETFONT|DS_FIXEDSYS BEGIN - CONTROL "Login listener status:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,7,7,68,8 - CONTROL "Game listener status:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,7,25,69,8 - CONTROL "",IDC_ELLSTATUS,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY|ES_AUTOHSCROLL,90,7,40,14,WS_EX_CLIENTEDGE - CONTROL "",IDC_EGLSTATUS,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY|ES_AUTOHSCROLL,89,23,40,14,WS_EX_CLIENTEDGE - CONTROL "Start LL",IDC_STARTLL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,141,7,50,14 - CONTROL "Start GL",IDC_STARTGL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,142,23,50,14 - CONTROL "Stop LL",IDC_STOPLL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,197,7,50,14 - CONTROL "Stop GL",IDC_STOPGL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,198,23,50,14 - CONTROL "Flush Log File",IDC_FLUSH_LOG,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,7,42,50,14 - CONTROL "hp",IDC_HP,"Static",WS_VISIBLE|WS_GROUP|SS_SUNKEN|SS_LEFTNOWORDWRAP,7,61,72,11 - CONTROL "mp",IDC_MP,"Static",WS_VISIBLE|WS_GROUP|SS_SUNKEN|SS_LEFTNOWORDWRAP,82,61,72,11 - CONTROL "cp",IDC_CP,"Static",WS_VISIBLE|WS_GROUP|SS_SUNKEN|SS_LEFTNOWORDWRAP,156,61,72,11 - CONTROL "char_name",IDC_CHARNAME,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP|SS_SUNKEN,7,76,251,11 - CONTROL "Enable Console",IDC_B_CONENABLE,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,65,42,64,14 - CONTROL "Disable Console",IDC_B_CONDISABLE,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,141,42,63,14 - CONTROL "Validate Interception",IDC_B_VALIDATEINTERCEPT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,94,92,15 - CONTROL "Intercept connect",IDC_B_INTERCEPTCONNECT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,106,94,80,15 - CONTROL "Check VP",IDC_B_CHECK_VIRTUALPROTECTEX,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,190,94,60,15 - CONTROL "Load L2Walker.dll",IDC_B_LOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,7,116,75,14 - CONTROL "Unload L2Walker.dll",IDC_B_UNLOADWALKER,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,116,76,15 - CONTROL "Dump All Relations",IDC_B_DUMP_ALL_RELATIONS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,136,86,15 - CONTROL "Print address of UserAI::dwThreadID",IDC_B_PRINTADDRTID,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,102,136,136,15 + CONTROL "OK",IDOK,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON,132,276,50,15 + CONTROL "Cancel",IDCANCEL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,260,276,50,15 + CONTROL "OverrideGameProtocolVersion:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,16,96,100,9 + CONTROL "",IDC_E_OVERRIDE_GPV,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,120,92,40,15,WS_EX_CLIENTEDGE + CONTROL "Logging level:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,186,138,46,9 + CONTROL "Enable modify Game Server Traffic",IDC_C_ENABLE_MODGT,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,92,128,11 + CONTROL "",IDC_CB_LOGLEVEL,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,258,138,60,87 + CONTROL "ThreadPriorityRaiseEnable",IDC_C_ENABLE_THREADPRI,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,180,107,100,11 + CONTROL "L2Walker_Fix_MoveBackwardToLocation",IDC_C_L2WMOVEFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,155,146,11 + CONTROL "Ports Setup",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,203,322,67 + CONTROL "Listen Login Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,216,56,9 + CONTROL "Listen Game Port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,18,232,58,9 + CONTROL "",IDC_E_FLPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,212,30,15,WS_EX_CLIENTEDGE + CONTROL "",IDC_E_FGPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,82,228,30,15,WS_EX_CLIENTEDGE + CONTROL "Real Login Server:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,214,82,9 + CONTROL "",IDC_E_REALIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,210,212,70,15,WS_EX_CLIENTEDGE + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,212,8,9 + CONTROL "",IDC_E_REALPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,212,32,15,WS_EX_CLIENTEDGE + CONTROL "Apply :)",IDC_APPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,196,276,50,15 + CONTROL "Log Game Packets",IDC_C_LOGGAMEP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,153,128,11 + CONTROL "Log File Name Prefix:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,184,169,68,9 + CONTROL "",IDC_E_LOGFNPREFIX,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,258,166,60,15,WS_EX_CLIENTEDGE + CONTROL "Lineage II Server Protocol Version:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,20,16,112,8 + CONTROL "",IDC_CB_L2VER,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,150,14,172,70 + CONTROL "Lineage II Client Version:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,20,31,82,9 + CONTROL "",IDC_CB_L2CVER,"ComboBox",WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|CBS_DROPDOWNLIST,150,29,172,70 + CONTROL "Lineage II Versions",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,5,318,72 + CONTROL "Logging",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,178,127,148,70 + CONTROL "L2Walker_Drop_RequestGMList",IDC_C_L2WDROPGMLIST,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,144,146,11 + CONTROL "WarnUnknownPackets",IDC_C_WARNUNKP,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,184,182,88,11 + CONTROL "L2Walker_Fix_ChangeWaitType2",IDC_C_L2WSITFIX,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,166,146,11 + CONTROL "Force Game Server IP:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,232,84,9 + CONTROL "",IDC_E_FORCEGSIP,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,210,228,70,15,WS_EX_CLIENTEDGE + CONTROL "",IDC_E_FORCEGSPORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,228,32,15,WS_EX_CLIENTEDGE + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,228,4,9 + CONTROL "L2Walker fixes",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,127,162,70 + CONTROL "L2Walker_Inject_StatusUpdate",IDC_C_L2WALKER_INJECTSTATUSUPDATE,"Button",WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,179,146,11 + CONTROL "Misc hacks (be careful!!!)",IDC_STATIC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,8,83,318,41 + CONTROL "Reply to L2J GameGuard query",IDC_C_GAMEGUARDREPLY,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,16,108,134,11 + CONTROL "Gracia Epilogue Server protocol 148 -> Client protocol 146 hacks (experimental!)",IDC_C_EPILOGUE_148_146,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,18,46,302,11 + CONTROL "TeonPvP server hacks",IDC_C_TEONPVP_HACKS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,18,59,114,9 + CONTROL "",IDC_E_INGAME_GAMESERVER_PORT,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_AUTOHSCROLL,290,245,32,13,WS_EX_CLIENTEDGE + CONTROL "Also intercept this game server port:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,120,249,154,9 + CONTROL ":",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,284,247,4,9 END diff --git a/l2detect/stdafx.h b/l2detect/stdafx.h index 18f4c7b..4d2f5ee 100644 --- a/l2detect/stdafx.h +++ b/l2detect/stdafx.h @@ -29,6 +29,7 @@ #include #include #include +#include // DirectX #include