Появилась потребность перевести свой dll с 32 бит на 64 (т.к. для инъекции в x64 приложение нужна 64 битная dll).
Простые функции записи значения в адрес и изменения инструкции (например заполнение кода NOP'ами) перевелись и работают нормально, но на ассемблерную вставку (__asm) компилятор ругается - гугл говорит, что в VS 64 битной версии такой возможности нет. Но мне это нужно для инъекции кода.
Хотел бы узнать, как это все делается для 64 бит в Visual Studio?
P.S. Пример на 32 битной версии:
C++:
Код:
DWORD jumpBack
;
void
_declspec
(
naked
)
hpFilter
(
)
{
__asm
{
cmp
[
ebx
+
10
]
,
1
je sled
mov
[
ebx
+
4
]
,
eax
sled
:
fldz
jmp
[
jumpBack
]
}
}
bool
Hook
(
void
*
toHook
,
void
*
ourFunct
,
int
len
)
{
DWORD curProtection
;
DWORD temp
;
VirtualProtect
(
toHook
,
len
,
PAGE_EXECUTE_READWRITE
,
&
curProtection
)
;
memset
(
toHook
,
0x90
,
len
)
;
DWORD relativeAddress
=
(
(
DWORD
)
ourFunct
-
(
DWORD
)
toHook
)
-
5
;
*
(
BYTE
*
)
toHook
=
0xE9
;
*
(
DWORD
*
)
(
(
DWORD
)
toHook
+
1
)
=
relativeAddress
;
VirtualProtect
(
toHook
,
len
,
curProtection
,
&
temp
)
;
return
true
;
}
.
.
.
if
(
GetAsyncKeyState
(
VK_NUMPAD1
)
)
{
DWORD hookAddress
=
(
(
uint32_t
)
BASEADDR
)
+
0x265B7
;
// Адрес инструкции ( mov [ebx+4],eax)
jumpBack
=
hookAddress
+
5
;
Hook
(
(
void
*
)
hookAddress
,
hpFilter
,
5
)
;
}
.
.
.
|