
03.11.2018, 16:13
|
|
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами:
5351007
Репутация:
0
|
|
Сообщение от SR_team
Пиксель поломал совместимость с wine в 4.9.0
Но вероятно это фикс такой, что бы игру не крашило. Я предлагал крашить игру, если запрос не валиден. Т.к. раньше такой обход вообще в логе не палился.
Писал ночью и совсем упустил из виду один момент, у него стоит GetProcAddress хук по этому сапается кастомным парсером EAT.
C++:
Код:
FARPROC
GetProcedureAddress
(
HANDLE hModule
,
char
*
pszProcName
)
{
IMAGE_DOS_HEADER
*
pdhDosHeader
=
(
IMAGE_DOS_HEADER
*
)
hModule
;
if
(
pdhDosHeader
->
e_magic
!=
IMAGE_DOS_SIGNATURE
)
return
0
;
IMAGE_NT_HEADERS
*
pndNTHeader
=
(
IMAGE_NT_HEADERS
*
)
(
pdhDosHeader
->
e_lfanew
+
(
long
)
hModule
)
;
if
(
pndNTHeader
->
Signature
!=
IMAGE_NT_SIGNATURE
)
return
0
;
IMAGE_EXPORT_DIRECTORY
*
iedExports
=
(
IMAGE_EXPORT_DIRECTORY
*
)
(
pndNTHeader
->
OptionalHeader
.
DataDirectory
[
IMAGE_DIRECTORY_ENTRY_EXPORT
]
.
VirtualAddress
+
(
long
)
hModule
)
;
long
*
pNames
=
(
long
*
)
(
iedExports
->
AddressOfNames
+
(
long
)
hModule
)
;
short
wOrdinalIndex
=
-
1
;
for
(
int
i
=
0
;
i
NumberOfFunctions
;
i
++
)
{
char
*
pszFunctionName
=
(
char
*
)
(
pNames
[
i
]
+
(
long
)
hModule
)
;
if
(
lstrcmpiA
(
pszFunctionName
,
pszProcName
)
==
0
)
{
wOrdinalIndex
=
i
;
break
;
}
}
if
(
wOrdinalIndex
==
-
1
)
return
0
;
short
*
pOrdinals
=
(
short
*
)
(
iedExports
->
AddressOfNameOrdinals
+
(
long
)
hModule
)
;
unsigned
long
*
pAddresses
=
(
unsigned
long
*
)
(
iedExports
->
AddressOfFunctions
+
(
long
)
hModule
)
;
short
wAddressIndex
=
pOrdinals
[
wOrdinalIndex
]
;
return
(
FARPROC
)
(
pAddresses
[
wAddressIndex
]
+
(
long
)
hModule
)
;
}
И в том случае даже если он по экспорту адрес свой поставит, всегда можно искать вин апи сканнером сигнатур.
|
|
|