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

  #11  
Старый 01.05.2019, 23:55
#Rin
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами: 5663255

Репутация: 183


По умолчанию

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

1. на*** они тогда нужны в винде?
Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.

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

2. Почему тогда фокус с получением адреса библиотечной функции из своего процесса работает?
Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.

На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.

 
Ответить с цитированием

  #12  
Старый 02.05.2019, 12:54
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

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

Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.

Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.

На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.
да ты прав. Кстати, что касаемо адресов, в PE можно указать желаемое адрессное пространство для библиотеки, и если оно не занято, то библиотека всегда будет грузится в него. По дефолту вроде адрес 0x10000000
 
Ответить с цитированием

  #13  
Старый 08.05.2019, 12:45
Vadim.dll
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами: 5715860

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

При попытке выполнения этого кода gta просто выключается, без ошибок, как будто завершается процесс
 
Ответить с цитированием

  #14  
Старый 22.06.2019, 06:03
LUCHARE
Постоянный
Регистрация: 23.05.2017
Сообщений: 545
С нами: 4723927

Репутация: 158


По умолчанию

круто конечно

жаль что баян (the CreateRemoteThread & WriteProcessMemory technique старше меня)

и перепизжено на разные форумы тысячу раз

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

да ты прав.
частично. именно из-за таких программ, как в этой теме, сейчас у некоторых системных библиотек виндовс должен быть одинаковый базовый адрес во всех процессах.

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

Но адрес библиотеки в разных процессах может и будет отличаться.
Цитата:

Kernel32 is required to be at the same base address because there are a number of internal kernel32 routines that, similar to ntdll!DbgUiRemoteBreakIn, are used in cross-process thread injection. One example of this used to be the console control event handler In the case of console events, during kernel32.dll initialization, the address of the Ctrl-C event dispatcher is passed to WinSrv.dll (in CSRSS space).
...
By the time this change to WinSrv and Ctrl-C processing was made, though, the application compatibility impact of removing the kernel32 base address to be the same system-wide would have been too severe to eliminate the restriction (virtually all third party code injection code now relies heavily on this assumption). Thus, for this (and other) reasons, kernel32 still remains with the restriction that it may not be relocated to a different base address cross-process.
 
Ответить с цитированием

  #15  
Старый 22.06.2019, 07:11
ntharbinger
Новичок
Регистрация: 22.06.2019
Сообщений: 13
С нами: 3629559

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

Проблемy с разным адресом процедуры из-за релокаций можно решить так

C++:





Код:
DWORD RVA
=
(
(
DWORD_PTR
)
GetProcAddress
(
GetModuleHandleA
(
"kernel32.dll"
)
,
"CreateRemoteThread"
)
-
(
DWORD_PTR
)
GetModuleHandleA
(
"kernel32.dll"
)
)
;
auto
ObtainRemoteBase
=
[
]
(
HANDLE hProc
,
const
char
*
dllName
)
->
DWORD_PTR
{
HMODULE hMods
[
1024
]
;
DWORD cbNeeded
;
EnumProcessModules
(
hProc
,
hMods
,
sizeof
(
hMods
)
,
&
cbNeeded
)
;
for
(
unsigned
int
i
=
0
;
i

(
hMods
[
i
]
)
;
}
}
}
;
auto
FindProcessId
=
[
]
(
char
*
processName
)
->
DWORD
{
char
*
p
=
strrchr
(
processName
,
'\\'
)
;
if
(
p
)
processName
=
p
+
1
;
PROCESSENTRY32 processInfo
;
processInfo
.
dwSize
=
sizeof
(
processInfo
)
;
HANDLE processesSnapshot
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
processesSnapshot
==
INVALID_HANDLE_VALUE
)
return
0
;
Process32First
(
processesSnapshot
,
&
processInfo
)
;
if
(
!
strcmp
(
processName
,
processInfo
.
szExeFile
)
)
{
CloseHandle
(
processesSnapshot
)
;
return
processInfo
.
th32ProcessID
;
}
while
(
Process32Next
(
processesSnapshot
,
&
processInfo
)
)
{
if
(
!
strcmp
(
processName
,
processInfo
.
szExeFile
)
)
{
CloseHandle
(
processesSnapshot
)
;
return
processInfo
.
th32ProcessID
;
}
}
CloseHandle
(
processesSnapshot
)
;
return
0
;
}
;
DWORD procID
=
GetProcID
(
"имя_процесса.ехе"
)
;
if
(
procID
==
NULL
)
return
;
HANDLE hProc
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
procID
)
;
if
(
hProc
!=
NULL
)
{
DWORD_PTR funcAddr
=
RVA
+
ObtainRemoteBase
(
hProc
,
"kernel32.dll"
)
;
CloseHandle
(
hProc
)
;
}
 
Ответить с цитированием

  #16  
Старый 22.06.2019, 16:21
_Vine_
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами: 5447649

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

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

Проблемy с разным адресом процедуры из-за релокаций можно решить так

C++:





Код:
DWORD RVA
=
(
(
DWORD_PTR
)
GetProcAddress
(
GetModuleHandleA
(
"kernel32.dll"
)
,
"CreateRemoteThread"
)
-
(
DWORD_PTR
)
GetModuleHandleA
(
"kernel32.dll"
)
)
;
auto
ObtainRemoteBase
=
[
]
(
HANDLE hProc
,
const
char
*
dllName
)
->
DWORD_PTR
{
HMODULE hMods
[
1024
]
;
DWORD cbNeeded
;
EnumProcessModules
(
hProc
,
hMods
,
sizeof
(
hMods
)
,
&
cbNeeded
)
;
for
(
unsigned
int
i
=
0
;
i

(
hMods
[
i
]
)
;
}
}
}
;
auto
FindProcessId
=
[
]
(
char
*
processName
)
->
DWORD
{
char
*
p
=
strrchr
(
processName
,
'\\'
)
;
if
(
p
)
processName
=
p
+
1
;
PROCESSENTRY32 processInfo
;
processInfo
.
dwSize
=
sizeof
(
processInfo
)
;
HANDLE processesSnapshot
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
processesSnapshot
==
INVALID_HANDLE_VALUE
)
return
0
;
Process32First
(
processesSnapshot
,
&
processInfo
)
;
if
(
!
strcmp
(
processName
,
processInfo
.
szExeFile
)
)
{
CloseHandle
(
processesSnapshot
)
;
return
processInfo
.
th32ProcessID
;
}
while
(
Process32Next
(
processesSnapshot
,
&
processInfo
)
)
{
if
(
!
strcmp
(
processName
,
processInfo
.
szExeFile
)
)
{
CloseHandle
(
processesSnapshot
)
;
return
processInfo
.
th32ProcessID
;
}
}
CloseHandle
(
processesSnapshot
)
;
return
0
;
}
;
DWORD procID
=
GetProcID
(
"имя_процесса.ехе"
)
;
if
(
procID
==
NULL
)
return
;
HANDLE hProc
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
procID
)
;
if
(
hProc
!=
NULL
)
{
DWORD_PTR funcAddr
=
RVA
+
ObtainRemoteBase
(
hProc
,
"kernel32.dll"
)
;
CloseHandle
(
hProc
)
;
}

В funcAddr можно записать адрес WinApi функции текущего процесса, базовый адрес системных библиотек во процессах(одинаковой архитектуры) одинаковый.

Так же находят адрес LoadLibraryA инжекторы
 
Ответить с цитированием

  #17  
Старый 22.06.2019, 18:08
ntharbinger
Новичок
Регистрация: 22.06.2019
Сообщений: 13
С нами: 3629559

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

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

В funcAddr можно записать адрес WinApi функции текущего процесса, базовый адрес системных библиотек во процессах(одинаковой архитектуры) одинаковый.
Так же находят адрес LoadLibraryA инжекторы
а вот и нихуя, про ASLR слышал? Ну вот)
 
Ответить с цитированием

  #18  
Старый 23.06.2019, 01:40
LUCHARE
Постоянный
Регистрация: 23.05.2017
Сообщений: 545
С нами: 4723927

Репутация: 158


По умолчанию

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

а вот и нихуя, про ASLR слышал? Ну вот)
он генерирует одинаковые адреса во всех процессах для системных библиотек
 
Ответить с цитированием

  #19  
Старый 23.07.2019, 21:13
iqvw64e.sys
Новичок
Регистрация: 23.07.2019
Сообщений: 0
С нами: 3584004

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

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

Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.

Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.

На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.
Копирование при записи — Википедия

ru.wikipedia.org


hint: PspAllocateProcess
 
Ответить с цитированием

  #20  
Старый 14.08.2019, 14:33
ALF
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами: 4472205

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

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

DWORD __stdcall RemoteThread(Struct *sArg) { _SendMSG msg = (_SendMSG)sArg->pAdr; // передаем адрес msg(sArg->text, sArg->time, sArg->flag, sArg->bPreviousBrief); // вызываем return 0; } void __stdcall RemoteThread_end() {}
Цитата:
Сообщение от CleanLegend  

(DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread
только вот ты забыл сказать, что при таком варианте должна быть отключена оптимизация, иначе мы можем получить неопределённое поведение
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.