Цитата:
Сообщение от MaS0n
Благодарю, а насчет proc_check && driver_check мои догадки верны?
|
По DRIVER_CHECK все верно, а вот по PROC_CHECK я думаю так:
Код:
procAddress = this->procAddress;
v2 = 0;
do
{
if ( *(_BYTE *)procAddress != 0x90u ) // если не NOP, то procAddress не меняется
break;
++v2;
++procAddress;
}
while ( v2 < 6 );
if ( (*(_BYTE *)procAddress | 1) != 0xE9u ) // если не CALL relative_offset, выходим
return 0;
v8 = *(_DWORD *)(procAddress + 1) + procAddress + 5; // получаем относительный адрес функции для CALL, прибавляем procAddress, получается абсолютный адрес этой функции, и прибавялем у нему еще 5, чтобы пропустить инструкцию CALL relative_offset
HMACSHA1__Init(&hmac, v3->seed); // seed из серверного пакета
SHA1__Update(v8 + v3->address, (int)&hmac, v3->length); // считаем хэш блока памяти длинной length по "абсолютному адресу + 5 + смещение из серверного пакета"
SHA1__Final(&hmac, newHash);
Пример из иды:
Код:
.text:005C354C E8 7F B7 20 00 call sub_7CECD0 ; call 0x005C354C + 0x0020B77F + 5 = 0x007CECD0