 |
|

02.11.2024, 20:55
|
|
Постоянный
Регистрация: 06.05.2016
Сообщений: 328
С нами:
5273133
Репутация:
398
|
|
если окно не в фокусе. после логина что происходит норм?
|
|
|

02.11.2024, 20:58
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от LifeGame32
если окно не в фокусе. после логина что происходит норм?
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
|
|
|

02.11.2024, 22:10
|
|
Новичок
Регистрация: 03.01.2024
Сообщений: 0
С нами:
1243983
Репутация:
0
|
|
Сообщение от BIT_hack
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
|
|
|

02.11.2024, 22:12
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от BladeRunner
это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
На данный момент — да, но никто не мешает вам реализовать свои идеи в коде.
|
|
|

02.11.2024, 22:27
|
|
Участник форума
Регистрация: 09.07.2015
Сообщений: 211
С нами:
5708007
Репутация:
312
|
|
Сообщение от BIT_hack
На данный момент — да, но никто не мешает вам реализовать свои идеи в коде.
CommandLineManager.h
C++:
Код:
#pragma once
struct
CommandLineConstants
{
/** Auth login/password set from launcher params (Format: String - e.g. "-authdata login,password") */
static
constexpr
wchar_t
AuthData
[
]
=
L
"authdata"
;
}
;
class
CommandLineManager
{
public
:
/**
* No copying or copy assignment allowed for this class.
*/
CommandLineManager
(
CommandLineManager
const
&
)
=
delete
;
CommandLineManager
&
operator
=
(
CommandLineManager
const
&
)
=
delete
;
/**
* Initialization using a string containing all params
*/
void
Init
(
const
wchar_t
*
lp_cmd_line
)
;
/**
* Initialization using a collection of params
*/
void
Init
(
const
std
::
vector
&
cmd_line_params
)
;
/**
* Checks command line arguments for a matching param
*
* @param param - Parameter to look for in command line arguments
*
* @return True if param is found in command line arguments
*/
bool
HasParam
(
const
std
::
wstring
&
param
)
;
/**
* Retrieves value associated with given command line parameter
*
* @param param - Parameter to look for in command line arguments
*
* @return Value associated with command line parameter
*/
std
::
wstring
GetParamValue
(
const
std
::
wstring
&
param
)
;
/**
* Checks command line arguments for a matching flag param
*
* @param param - Parameter to look for in command line arguments
*
* @return True if param is found in command line arguments and it is a flag param value
*/
bool
HasFlagParam
(
const
std
::
wstring
&
param
)
;
std
::
map
GetCommandLineArgs
(
)
{
return
command_line_args_
;
}
/**
* Singleton
*/
static
CommandLineManager
&
Get
(
)
;
private
:
CommandLineManager
(
)
=
default
;
/** True if command line parser initialized */
static
bool
IsInitialized
;
/** Gets a collection of sub-arguments from a string of one or two arguments */
std
::
vector
GetSubArguments
(
const
std
::
wstring
&
sub_arg_list
)
;
/** Add commandline params from a collection of arguments */
void
AddArguments
(
const
std
::
vector
&
arg_list
)
;
/**
* Adds parameter name to collection of command line parameters
*
* @param param_name - Parameter name to add
*/
void
AddParam
(
const
std
::
wstring
&
param_name
)
;
/** Collections of command line arguments */
std
::
map
command_line_args_
;
}
;
CommandLineManager.cpp
C++:
Код:
#include
#include "CommandLineManager.h"
namespace
{
const
std
::
wstring FlagParamValue
=
L
"__FLAG__"
;
const
std
::
wstring UnusedParamValue
=
L
"unused"
;
}
bool
CommandLineManager
::
IsInitialized
=
false
;
CommandLineManager
&
CommandLineManager
::
Get
(
)
{
static
CommandLineManager command_line_manager
;
if
(
!
IsInitialized
)
{
// Support for DLL's
int
arg_count
=
0
;
const
LPWSTR
*
arg_list
=
CommandLineToArgvW
(
GetCommandLine
(
)
,
&
arg_count
)
;
std
::
vector
output
;
output
.
reserve
(
arg_count
)
;
for
(
int
i
=
0
;
i
&
cmd_line_params
)
{
if
(
!
IsInitialized
)
{
std
::
vector
args
;
for
(
std
::
wstring cmd_line_param
:
cmd_line_params
)
{
for
(
const
std
::
wstring
&
arg
:
GetSubArguments
(
cmd_line_param
)
)
{
args
.
push_back
(
arg
)
;
}
}
AddArguments
(
args
)
;
IsInitialized
=
true
;
}
}
std
::
vector
CommandLineManager
::
GetSubArguments
(
const
std
::
wstring
&
sub_arg_list
)
{
std
::
vector
args
;
if
(
const
std
::
wstring
::
size_type sub_arg_equals_pos
=
sub_arg_list
.
find_first_of
(
L
'='
)
;
sub_arg_equals_pos
!=
std
::
wstring
::
npos
)
{
// Add both args
args
.
push_back
(
sub_arg_list
.
substr
(
0
,
sub_arg_equals_pos
)
)
;
args
.
push_back
(
sub_arg_list
.
substr
(
sub_arg_equals_pos
+
1
,
sub_arg_list
.
length
(
)
-
1
)
)
;
}
else
{
// Add single arg
args
.
push_back
(
sub_arg_list
)
;
}
return
args
;
}
void
CommandLineManager
::
AddArguments
(
const
std
::
vector
&
arg_list
)
{
if
(
!
arg_list
.
empty
(
)
)
{
const
std
::
wstring
delimiters
(
L
"-,;\\"
)
;
std
::
wstring param_name
;
bool
bPrevWasParamName
=
false
;
const
int
num_args
=
static_cast
(
arg_list
.
size
(
)
)
;
for
(
int
i
=
0
;
i
0
&&
pos
!=
std
::
wstring
::
npos
)
{
if
(
bPrevWasParamName
)
{
// We have another param name so previous was a flag (no param value)
// Add a value to signify we have a flag param
AddParam
(
param_name
)
;
}
param_name
=
command_line_arg
;
// strip out first part so we're left with just the param name
param_name
.
erase
(
0
,
pos
)
;
if
(
i
==
num_args
-
1
)
{
// Add final flag param
AddParam
(
param_name
)
;
}
bPrevWasParamName
=
true
;
continue
;
}
bPrevWasParamName
=
false
;
// Make sure we're not adding a duplicate
if
(
auto
it
=
command_line_args_
.
find
(
{
param_name
}
)
;
it
==
command_line_args_
.
end
(
)
)
{
if
(
command_line_arg
.
empty
(
)
)
{
// Treat empty param value as a flag
command_line_args_
.
insert
(
{
param_name
,
FlagParamValue
}
)
;
}
else
{
command_line_args_
.
insert
(
{
param_name
,
command_line_arg
}
)
;
}
}
// Clear for next param
param_name
.
clear
(
)
;
}
}
}
void
CommandLineManager
::
AddParam
(
const
std
::
wstring
&
param_name
)
{
// Make sure we're not adding a duplicate
if
(
const
auto
it
=
command_line_args_
.
find
(
{
param_name
}
)
;
it
==
command_line_args_
.
end
(
)
)
{
command_line_args_
.
insert
(
{
param_name
,
FlagParamValue
}
)
;
}
}
bool
CommandLineManager
::
HasParam
(
const
std
::
wstring
&
param
)
{
if
(
const
auto
itr
=
command_line_args_
.
find
(
{
param
}
)
;
itr
!=
command_line_args_
.
end
(
)
)
{
if
(
itr
->
second
!=
UnusedParamValue
)
{
return
true
;
}
}
return
false
;
}
std
::
wstring CommandLineManager
::
GetParamValue
(
const
std
::
wstring
&
param
)
{
if
(
const
auto
itr
=
command_line_args_
.
find
(
{
param
}
)
;
itr
!=
command_line_args_
.
end
(
)
)
{
return
itr
->
second
;
}
return
std
::
wstring
(
)
;
}
bool
CommandLineManager
::
HasFlagParam
(
const
std
::
wstring
&
param
)
{
if
(
const
auto
itr
=
command_line_args_
.
find
(
{
param
}
)
;
itr
!=
command_line_args_
.
end
(
)
)
{
return
itr
->
second
==
FlagParamValue
;
}
return
false
;
}
Пример использования:
C++:
Код:
std
::
wstring AutoLogin_Login
;
std
::
wstring AutoLogin_Password
;
if
(
CommandLineManager
::
Get
(
)
.
HasParam
(
CommandLineConstants
::
AuthData
)
)
{
const
std
::
wstring auth_string
=
CommandLineManager
::
Get
(
)
.
GetParamValue
(
CommandLineConstants
::
AuthData
)
;
if
(
std
::
vector
auth_data
=
StringUtils
::
Split
(
auth_string
,
','
)
;
auth_data
.
size
(
)
>=
2
)
{
AutoLogin_Login
=
auth_data
[
0
]
;
AutoLogin_Password
=
auth_data
[
1
]
;
}
}
Могут быть некоторые внешние зависимости, но я думаю вы там поймете что к чему.
|
|
|

02.11.2024, 23:52
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от LifeGame32
если окно не в фокусе. после логина что происходит норм?
Я увидел твой пост в друг теме и понял о чем ты, но этот код для интерлюдии и HF подойдет, для выше хроник все можно сделать через интерфейс и UGX и будет работать стабильно.
|
|
|

04.11.2024, 17:47
|
|
Познающий
Регистрация: 27.02.2022
Сообщений: 37
С нами:
2215853
Репутация:
1
|
|
есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
|
|
|

04.11.2024, 18:41
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Сообщение от hawking
есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
Возможно, в будущем я планирую заниматься этим только под заказ. Или же, если кто-то из ребят захочет помочь, они могут это сделать, но не бесплатно.
Поскольку код уже опубликован, каждый желающий может попробовать самостоятельно разобраться, как это сделать. Я думаю, что в интернете нет более подробной информации по этому вопросу.
Пример для High Five, а также можно и для Interlude : Дизайн окон можно сделать любой!
|
|
|

05.11.2024, 12:17
|
|
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами:
2502597
Репутация:
223
|
|
Я немного поработал над интерфейсом, и вот что у меня получилось!
|
|
|

08.11.2024, 03:48
|
|
Новичок
Регистрация: 06.07.2024
Сообщений: 0
С нами:
977536
Репутация:
1979
|
|
Сообщение от BIT_hack
Вот код автологина для interlude, который требует доработки, но уже работает, особенно благодаря Charmant
Логин и пароль берется из файла AutoLogin.ini который должен лежать рядом с dll в вашей папке system игры.
AutoLogin.ini с таким содержимым:
Код:
Код:
[AutoLogin]
Login=admin
Password=admin
Код на с++ Visual Studio 2022
C++:
Код:
#include "pch.h"
#include
#include
extern
"C"
void
__declspec
(
dllexport
)
__stdcall
function1
(
)
{
//Заглушка для экспорта L2.exe (От крита клиента!)
}
namespace
{
enum
L2ConsoleState
{
Loading
=
0
,
Unknown
=
1
,
Login
=
2
,
CharCreate
=
3
,
CharSelect
=
4
,
InGame
=
5
}
;
class
UL2ConsoleWnd
{
}
;
UL2ConsoleWnd
*
UL2ConsoleWndPtr
=
nullptr
;
uintptr_t consoleOffset
=
0x3663bc
;
// для IL клиента
}
// Определение класса UNetworkHandler
class
UNetworkHandler
{
}
;
// Тип функции RequestAuthLogin
typedef
int
(
__fastcall
*
RequestAuthLoginFn
)
(
UNetworkHandler
*
,
int
,
const
wchar_t
*
,
const
wchar_t
*
,
int
)
;
// Смещение для UNetworkHandler в engine.dll
const
uintptr_t unetworkOffset
=
0x81F538
;
// Глобальные переменные для хранения указателей
UNetworkHandler
*
*
unetwork
=
nullptr
;
RequestAuthLoginFn requestAuthLoginFn
=
nullptr
;
// Функция для авторизации
static
void
RequestLogin
(
const
std
::
wstring
&
login
,
const
std
::
wstring
&
password
)
{
// Проверка инициализации указателей
if
(
!
unetwork
||
!
requestAuthLoginFn
)
{
return
;
}
// Вызов функции авторизации из игры
requestAuthLoginFn
(
*
unetwork
,
0
,
login
.
c_str
(
)
,
password
.
c_str
(
)
,
0
)
;
}
// Функция для чтения строки из INI-файла
static
void
ReadIniString
(
)
{
std
::
wstring login
;
std
::
wstring password
;
wchar_t
buffer
[
256
]
=
{
0
}
;
// Чтение логина и пароля из ini-файла
GetPrivateProfileStringW
(
L
"AutoLogin"
,
L
"Login"
,
L
""
,
buffer
,
_countof
(
buffer
)
,
L
".\\AutoLogin.ini"
)
;
login
=
buffer
;
// Чтение логина и пароля из ini-файла
GetPrivateProfileStringW
(
L
"AutoLogin"
,
L
"Login"
,
L
""
,
buffer
,
_countof
(
buffer
)
,
L
".\\AutoLogin.ini"
)
;
password
=
buffer
;
// Вызов функции авторизации
RequestLogin
(
login
,
password
)
;
}
static
void
L2StatusLoad
(
)
{
HMODULE hNwindowModule
=
nullptr
;
while
(
hNwindowModule
==
nullptr
)
{
hNwindowModule
=
GetModuleHandleW
(
L
"nwindow.dll"
)
;
Sleep
(
1000
)
;
}
// получение валидного указателя на UL2ConsoleWnd
uintptr_t pUL2ConsoleWnd
=
(
reinterpret_cast
(
hNwindowModule
)
)
+
consoleOffset
;
while
(
UL2ConsoleWndPtr
==
nullptr
)
{
UL2ConsoleWndPtr
=
*
reinterpret_cast
(
pUL2ConsoleWnd
)
;
Sleep
(
300
)
;
}
// получение адреса по которому записывается текущее состояние
L2ConsoleState
*
statePtr
=
reinterpret_cast
(
UL2ConsoleWndPtr
+
0x38
)
;
while
(
true
)
{
L2ConsoleState currentState
=
*
statePtr
;
switch
(
currentState
)
{
case
L2ConsoleState
::
Loading
:
// MessageBoxW(NULL, L"загрузка", L"L2ConsoleState", MB_OK);
ReadIniString
(
)
;
exit
;
break
;
case
L2ConsoleState
::
Login
:
//MessageBoxW(NULL, L"лобби", L"L2ConsoleState", MB_OK);
break
;
case
L2ConsoleState
::
CharCreate
:
//MessageBoxW(NULL, L"cоздание чара", L"L2ConsoleState", MB_OK);
break
;
case
L2ConsoleState
::
CharSelect
:
//MessageBoxW(NULL, L"выбор чара", L"L2ConsoleState", MB_OK);
break
;
case
L2ConsoleState
::
InGame
:
// MessageBoxW(NULL, L"в игре", L"L2ConsoleState", MB_OK);
break
;
}
Sleep
(
5000
)
;
}
}
// Поток для авторизации
static
DWORD WINAPI
TestThread
(
LPVOID lpParameter
)
{
L2StatusLoad
(
)
;
return
0
;
}
// Точка входа DLL
extern
"C"
__declspec
(
dllexport
)
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
if
(
ul_reason_for_call
==
DLL_PROCESS_ATTACH
)
{
// Отключение отслеживания вызовов функций библиотеки
DisableThreadLibraryCalls
(
hModule
)
;
// Получение модуля engine.dll
HMODULE engineModule
=
GetModuleHandleW
(
L
"engine.dll"
)
;
if
(
engineModule
)
{
// Получение адреса UNetworkHandler
unetwork
=
reinterpret_cast
(
reinterpret_cast
(
engineModule
)
+
unetworkOffset
)
;
// Получение адреса функции RequestAuthLogin
requestAuthLoginFn
=
(
RequestAuthLoginFn
)
GetProcAddress
(
engineModule
,
"?RequestAuthLogin@UNetworkHandler@@UAEHPAG0H@Z"
)
;
}
// Создание потока для авторизации
CreateThread
(
nullptr
,
0
,
TestThread
,
nullptr
,
0
,
nullptr
)
;
}
return
TRUE
;
}
И вот готовые файлы для тех, кто хочет настроить автологин (*Только вход в окно логина*): просто распакуйте архив в системную папку игры interlude и не забудьте изменить логин и пароль в файле AutoLogin.ini.
решил попробовать - но не работает, вроде как бы и пишет что пароль не подходит, но акк и пароль я точно вписал верно))
мб длинна пароля 4 нуля ему не подходит?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|