 |
|

01.05.2019, 23:55
|
|
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами:
5663255
Репутация:
183
|
|
Сообщение от SR_team
1. на*** они тогда нужны в винде?
Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.
Сообщение от SR_team
2. Почему тогда фокус с получением адреса библиотечной функции из своего процесса работает?
Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.
На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.

|
|
|

02.05.2019, 12:54
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от Rinat_Namazov
Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.
Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.
На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.
да ты прав. Кстати, что касаемо адресов, в PE можно указать желаемое адрессное пространство для библиотеки, и если оно не занято, то библиотека всегда будет грузится в него. По дефолту вроде адрес 0x10000000
|
|
|

08.05.2019, 12:45
|
|
Участник форума
Регистрация: 04.07.2015
Сообщений: 168
С нами:
5715860
Репутация:
78
|
|
При попытке выполнения этого кода gta просто выключается, без ошибок, как будто завершается процесс
|
|
|

22.06.2019, 06:03
|
|
Постоянный
Регистрация: 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.
|
|
|

22.06.2019, 07:11
|
|
Новичок
Регистрация: 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
)
;
}
|
|
|

22.06.2019, 16:21
|
|
Участник форума
Регистрация: 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 инжекторы
|
|
|

22.06.2019, 18:08
|
|
Новичок
Регистрация: 22.06.2019
Сообщений: 13
С нами:
3629559
Репутация:
13
|
|
Сообщение от _Vine_
В funcAddr можно записать адрес WinApi функции текущего процесса, базовый адрес системных библиотек во процессах(одинаковой архитектуры) одинаковый.
Так же находят адрес LoadLibraryA инжекторы
а вот и нихуя, про ASLR слышал? Ну вот)
|
|
|

23.06.2019, 01:40
|
|
Постоянный
Регистрация: 23.05.2017
Сообщений: 545
С нами:
4723927
Репутация:
158
|
|
Сообщение от ntharbinger
а вот и нихуя, про ASLR слышал? Ну вот)
он генерирует одинаковые адреса во всех процессах для системных библиотек
|
|
|

23.07.2019, 21:13
|
|
Новичок
Регистрация: 23.07.2019
Сообщений: 0
С нами:
3584004
Репутация:
3
|
|
Сообщение от Rinat_Namazov
Спроси разработчиков виндовс. Если бы так было, то тот же АнтиСтилер ставил свои хуки не только внутри гта, а на весь комп в целом. А изменение кода в какой-то функции могло бы уронить систему.
Большинство библиотек (как правило системные) загружаются по одинаковому адресу, но виндовс не гарантирует этого.
На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах.
Копирование при записи — Википедия
ru.wikipedia.org
hint: PspAllocateProcess
|
|
|

14.08.2019, 14:33
|
|
Постоянный
Регистрация: 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)
|
|
|
|