HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #61  
Старый 02.11.2024, 20:55
LifeGame32
Постоянный
Регистрация: 06.05.2016
Сообщений: 328
С нами: 5273133

Репутация: 398
По умолчанию

если окно не в фокусе. после логина что происходит норм?
 
Ответить с цитированием

  #62  
Старый 02.11.2024, 20:58
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Цитата:
Сообщение от LifeGame32  

если окно не в фокусе. после логина что происходит норм?
Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
 
Ответить с цитированием

  #63  
Старый 02.11.2024, 22:10
BladeRunner
Новичок
Регистрация: 03.01.2024
Сообщений: 0
С нами: 1243983

Репутация: 0
По умолчанию

Цитата:
Сообщение от BIT_hack  

Всё работает нормально проверял, независимо от того, находится ли окно в фокусе или нет. Можно открыть сколько угодно окон, главное — не забывать менять логин и пароль в файле AutoLogin.ini".
это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
 
Ответить с цитированием

  #64  
Старый 02.11.2024, 22:12
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Цитата:
Сообщение от BladeRunner  

это на каждое окно под разных чаров надо каждый раз вбивать логин и пароль?
На данный момент — да, но никто не мешает вам реализовать свои идеи в коде.
 
Ответить с цитированием

  #65  
Старый 02.11.2024, 22:27
ANZO
Участник форума
Регистрация: 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
]
;
}
}
Могут быть некоторые внешние зависимости, но я думаю вы там поймете что к чему.
 
Ответить с цитированием

  #66  
Старый 02.11.2024, 23:52
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Цитата:
Сообщение от LifeGame32  

если окно не в фокусе. после логина что происходит норм?
Я увидел твой пост в друг теме и понял о чем ты, но этот код для интерлюдии и HF подойдет, для выше хроник все можно сделать через интерфейс и UGX и будет работать стабильно.
 
Ответить с цитированием

  #67  
Старый 04.11.2024, 17:47
hawking
Познающий
Регистрация: 27.02.2022
Сообщений: 37
С нами: 2215853

Репутация: 1
По умолчанию

есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?

Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
 
Ответить с цитированием

  #68  
Старый 04.11.2024, 18:41
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Цитата:
Сообщение от hawking  

есть ли способ импортировать функцию RequestLogin внутрь интерфейса, чтобы мы могли использовать ее там?
Таким образом, мы можем записывать/считывать файл автологина внутри интерфейса, и мы можем использовать его для нескольких учетных записей, а не только для одной.
Возможно, в будущем я планирую заниматься этим только под заказ. Или же, если кто-то из ребят захочет помочь, они могут это сделать, но не бесплатно.

Поскольку код уже опубликован, каждый желающий может попробовать самостоятельно разобраться, как это сделать. Я думаю, что в интернете нет более подробной информации по этому вопросу.

Пример для High Five, а также можно и для Interlude : Дизайн окон можно сделать любой!
 
Ответить с цитированием

  #69  
Старый 05.11.2024, 12:17
BIT_hack
Постоянный
Регистрация: 12.08.2021
Сообщений: 355
С нами: 2502597

Репутация: 223
По умолчанию

Я немного поработал над интерфейсом, и вот что у меня получилось!
 
Ответить с цитированием

  #70  
Старый 08.11.2024, 03:48
AlhimN1
Новичок
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.