ldloc.s <d0t.net> stloc.s <Reversed>
-
Автор темы
- #1
Как известно, у вмпротекта легко упростить функциональность защиты, меняя номер сборки ОС Windows через PEB процесса (OSBuildNumber):
(gs:[0x60]+0x120) - x64
(fs:[0x30]+0xAC) - x86
Но, как бы я не менял, как-будто вообще ничего не изменяется. Оказывается, когда снимал трассу VMProtect, обнаружил еще 1 способ: (код протектора)
И здесь происходит перебор модуля ntdll.dll на поиск в ресурсах строки FileVersion(unicode), которая содержит в себе номер сборки ОС, на которой была выпущена эта библиотека. (даже если у вас в win+r -> winver будет отличаться этот номер с тем, который в этой библиотеке, то можно считать их равными, т.к. особых изменений при обновлении windows это не повлекло, библиотеку незачем было менять. Если я не прав, поправьте).
И я сделал реализацию(почти 1 в 1 как у ВМП, только без базы build'ов версии) без лишних вызовов(не люблю их, люблю оптимизировать и скрывать некоторые вещи в бинарнике). Сам код простейший:
(gs:[0x60]+0x120) - x64
(fs:[0x30]+0xAC) - x86
Но, как бы я не менял, как-будто вообще ничего не изменяется. Оказывается, когда снимал трассу VMProtect, обнаружил еще 1 способ: (код протектора)
И здесь происходит перебор модуля ntdll.dll на поиск в ресурсах строки FileVersion(unicode), которая содержит в себе номер сборки ОС, на которой была выпущена эта библиотека. (даже если у вас в win+r -> winver будет отличаться этот номер с тем, который в этой библиотеке, то можно считать их равными, т.к. особых изменений при обновлении windows это не повлекло, библиотеку незачем было менять. Если я не прав, поправьте).
И я сделал реализацию(почти 1 в 1 как у ВМП, только без базы build'ов версии) без лишних вызовов(не люблю их, люблю оптимизировать и скрывать некоторые вещи в бинарнике). Сам код простейший:
C++:
#include <iostream>
#include <Windows.h>
int main()
{
char* pNative = (char*)GetModuleHandleA("ntdll");
while (true)
{
if (pNative[0] == 0x46) // F
{
if (pNative[2] == 0x69) // i
{
if (pNative[4] == 0x6C) // l
{
if (pNative[6] == 0x65) // e
{
if (pNative[8] == 0x56) // V
{
if (pNative[10] == 0x65) // e
{
if (pNative[12] == 0x72) // r
{
if (pNative[14] == 0x73) // s
{
if (pNative[16] == 0x69) // i
{
if (pNative[18] == 0x6F) // o
{
if (pNative[20] == 0x6E) // n
{
if (pNative[22] == 0x00)
{
if (pNative[24] == 0x00)
{
wprintf(L"%s\n", pNative + 26);
break;
}
}
}
}
}
}
}
}
}
}
}
}
}
pNative += 0x02;
}
system("pause");
return 0;
}
Последнее редактирование: