Тема: Warden
Показать сообщение отдельно
Старый 28.03.2011, 12:59   #82
TOM_RUS
MaNGOS Dev
 
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
TOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небес
По умолчанию

Цитата:
Сообщение от 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

Последний раз редактировалось TOM_RUS; 28.03.2011 в 13:57.
TOM_RUS вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
MaS0n (28.03.2011), Ranger (09.06.2011)