Re: Ограничения Демоверсии
Posted: Sat Oct 24, 2015 7:40 am
Да, но адрес возврата для sysenter это как раз вот этот пресловутый lea+push 

А зачем вам тогда вот эта штука?Да, но адрес возврата для sysenter это как раз вот этот пресловутый lea+push
Code: Select all
mov edx, esp
Code: Select all
0041989D lea eax, [004198B4]
004198A3 push eax
004198A4 push eax
004198A5 mov eax, [ebp-0C]
004198A8 push eax
004198A9 mov eax, [ebp-10]
004198AC xor ecx, ecx
004198AE lea edx, [esp+0C]
004198B3 ret
Code: Select all
xor eax, eax
push eax
push eax
push 17
mov eax, hThread
push eax
Code: Select all
lea eax, @FINALIZE ; получаем адрес на который будет происходить переход после выполнения sysenter
push eax ; и пушим его на стек
push eax ; второй параметр в оригинале (KiFastSystemCall) обнулён, но если положить туда любое число поведение не меняется, поэтому пушим еще раз
mov edx, esp ; указываем значение верхушки стека
mov eax, SysCallArgument ; указываем SDT индекс
sysenter ; производим вызов
Code: Select all
lea eax, @64bit ; получаем адрес на который будет происходить переход после выполнения WOW64 перехода {переключения режимов 32 и 64 бита}
push eax ; и пушим его на стек
push eax ; это по аналогу с sysenter, бо не ясно что он от нас хочет, но должен быть
mov eax, WOW64Addr ; берем адрес WOW64 (FS:[0xC0])
push eax ; пушим на стек для последующего ret
mov eax, SysCallArgument ; указываем SDT индекс
xor ecx, ecx ; ECX обязательно должен быть обнулён
lea edx, dword ptr ss:[esp+4*3] ; в EDX указатель на адрес начала параметров функции на стеке
ret ; производим вызов
@64bit:
add esp, 4 ; чистим
jmp @FINALIZE
Если SYSENTER/INT2E будут оформлены в виде отдельной функции, то при её вызове через CALL на стеке будет адрес возврата, который поддерживается VMProtect. Скиньте телефон или скайп в личку - так будет проще объяснитьДля чего выносить код во внешнюю функцию, когда адреса возврата из sysenter или WOW должны быть на стеке, а VMProt их не сможет распознать?
Даже если я вынесу вызов во внешку, то там эти адреса возврата все равно должны присутствовать и получается что я опять не смогу завиртуализировать этот кусок кода.
Code: Select all
function SysEnter(param)
asm
mov edx, esp
mov eax, param
sysenter
end;
function foo()
begin
...
SysEnter(param);
...
Int2E(param);
...
end;