944 lines
32 KiB
Plaintext
944 lines
32 KiB
Plaintext
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||
|
<Document>
|
||
|
<Protection InputFileName="../bin/64/Release/win_runtime.dll" Options="0" OutputFileName="win_runtime32.dll">
|
||
|
<Messages />
|
||
|
<Folders />
|
||
|
<Procedures />
|
||
|
<Objects />
|
||
|
</Protection>
|
||
|
<Script>
|
||
|
<![CDATA[function OnBeforeSaveFile()
|
||
|
local file = vmprotect.core():outputArchitecture()
|
||
|
local functions = vmprotect.core():inputArchitecture():functions()
|
||
|
local empty_byte
|
||
|
local is_dotnet
|
||
|
if (file:name() == ".NET") then
|
||
|
is_dotnet = true
|
||
|
empty_byte = 0x2a
|
||
|
else
|
||
|
is_dotnet = false
|
||
|
empty_byte = 0xcc
|
||
|
end
|
||
|
for i = 1, functions:count() do
|
||
|
local func = functions:item(i)
|
||
|
if (not func:needCompile() and func:type() ~= ObjectType.String) then
|
||
|
local block_size = 0;
|
||
|
local block_address = 0;
|
||
|
for j = 1, func:count() do
|
||
|
command = func:item(j)
|
||
|
need_clear = bit32.btest(command:options(), CommandOption.ClearOriginalCode)
|
||
|
if (need_clear and is_dotnet and command:type() == ILCommandType.Comment) then
|
||
|
need_clear = false
|
||
|
end
|
||
|
if need_clear then
|
||
|
if (is_dotnet) then
|
||
|
-- IL
|
||
|
else
|
||
|
-- Intel
|
||
|
for k = 1, 3 do
|
||
|
operand = command:operand(k)
|
||
|
if operand:fixup() then
|
||
|
local fixup = file:fixups():itemByAddress(operand:fixup():address())
|
||
|
if fixup then
|
||
|
fixup:setDeleted(true)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if block_address ~= 0 and (block_address + block_size) ~= command:address() then
|
||
|
if block_size > 0 then
|
||
|
if file:addressSeek(block_address) then
|
||
|
local s = string.rep(string.char(empty_byte), block_size)
|
||
|
file:write(s)
|
||
|
end
|
||
|
end
|
||
|
block_address = 0
|
||
|
block_size = 0
|
||
|
end
|
||
|
|
||
|
if block_address == 0 then
|
||
|
block_address = command:address()
|
||
|
end
|
||
|
block_size = block_size + command:size()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if block_size > 0 then
|
||
|
if file:addressSeek(block_address) then
|
||
|
local s = string.rep(string.char(empty_byte), block_size)
|
||
|
file:write(s)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
file:exports():clear()
|
||
|
end
|
||
|
|
||
|
function OnAfterCompilation()
|
||
|
local array_name = string.gsub(string.gsub(vmprotect.extractFileName(core:outputFileName()), "%.", "_"), "demo", "")
|
||
|
|
||
|
local lines = {}
|
||
|
table.insert(lines, string.format('const uint8_t %s_code[] = {', array_name))
|
||
|
local s = ""
|
||
|
for i = 1, code_data:len() do
|
||
|
s = s .. string.format("0x%.2x, ", code_data:byte(i))
|
||
|
if (s:len() > 100) then
|
||
|
table.insert(lines, s)
|
||
|
s = ""
|
||
|
end
|
||
|
end
|
||
|
if (s:len() > 0) then
|
||
|
table.insert(lines, s)
|
||
|
end
|
||
|
table.insert(lines, "};")
|
||
|
|
||
|
local stream = io.open(core:outputFileName(), "rb")
|
||
|
local file_data = stream:read("*all")
|
||
|
stream:close()
|
||
|
|
||
|
table.insert(lines, string.format('const uint8_t %s_file[] = {', array_name))
|
||
|
local key = math.random(0x100000000);
|
||
|
local key_data = DWordToChar(key);
|
||
|
s = ""
|
||
|
for i = 1, key_data:len() do
|
||
|
s = s .. string.format("0x%.2x, ", key_data:byte(i))
|
||
|
end
|
||
|
for i = 0, file_data:len() - 1 do
|
||
|
s = s .. string.format("0x%.2x, ", bit32.bxor(file_data:byte(i + 1), (bit32.lrotate(key, i) + i) % 0x100))
|
||
|
if (s:len() > 100) then
|
||
|
table.insert(lines, s)
|
||
|
s = ""
|
||
|
end
|
||
|
end
|
||
|
if (s:len() > 0) then
|
||
|
table.insert(lines, s)
|
||
|
end
|
||
|
table.insert(lines, "};")
|
||
|
|
||
|
local stream = io.open(core:outputFileName() .. ".inc", "w+")
|
||
|
stream:write(table.concat(lines, "\n"))
|
||
|
stream:close()
|
||
|
end
|
||
|
|
||
|
function ValueToChar(val, len)
|
||
|
local value = ""
|
||
|
if (type(val) == "userdata") then
|
||
|
value = tostring(val)
|
||
|
else
|
||
|
if (val < 0) then
|
||
|
val = 0x10000 + val
|
||
|
end
|
||
|
value = string.format("%x", val)
|
||
|
end
|
||
|
while (value:len() < len * 2) do
|
||
|
value = "0" .. value
|
||
|
end
|
||
|
|
||
|
local res = ""
|
||
|
for i = value:len() - 1, 1, -2 do
|
||
|
res = res .. string.char(tonumber("0x" .. value:sub(i, i + 1)))
|
||
|
len = len - 1
|
||
|
if (len == 0) then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
return res
|
||
|
end
|
||
|
|
||
|
function ByteToChar(value)
|
||
|
return ValueToChar(value, 1)
|
||
|
end
|
||
|
|
||
|
function WordToChar(value)
|
||
|
return ValueToChar(value, 2)
|
||
|
end
|
||
|
|
||
|
function DWordToChar(value)
|
||
|
return ValueToChar(value, 4)
|
||
|
end
|
||
|
|
||
|
function QWordToChar(value)
|
||
|
return ValueToChar(value, 8)
|
||
|
end
|
||
|
|
||
|
function Ord(value)
|
||
|
if (value) then
|
||
|
return 1
|
||
|
end
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
function OnBeforeCompilation()
|
||
|
local file = core:outputArchitecture()
|
||
|
if (file:name() == ".NET") then
|
||
|
local rsrc = file:segments():itemByName(".rsrc")
|
||
|
if (rsrc) then
|
||
|
rsrc:destroy()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
core = vmprotect.core()
|
||
|
file = core:inputFile():item(core:inputFile():count())
|
||
|
|
||
|
procedure_lines = {}
|
||
|
--[[
|
||
|
# format: procname XYZ
|
||
|
#
|
||
|
# X:
|
||
|
# A - All features
|
||
|
# L - Licensing system
|
||
|
# B - Bundler
|
||
|
# R - Registry
|
||
|
# E - rEsources
|
||
|
# I - Loader
|
||
|
# P - Processor
|
||
|
#
|
||
|
# Y:
|
||
|
# M - Mutation
|
||
|
# F - Fast virtualization
|
||
|
# V - Virtualization (default)
|
||
|
#
|
||
|
# Z:
|
||
|
# N - None entry point
|
||
|
# R - Random entry point
|
||
|
#
|
||
|
]]--
|
||
|
if (file:name() == ".NET") then
|
||
|
-- Virtual Machine
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine::.ctor( PM')
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine::Invoke( PM')
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine/Utils::Random( AVN')
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine/Utils::CalcCRC( AVN')
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine:: PM')
|
||
|
table.insert(procedure_lines, 'VMProtect.VirtualMachine/ PM')
|
||
|
-- Crypto
|
||
|
table.insert(procedure_lines, 'VMProtect.CipherRC5:: AM')
|
||
|
-- Core
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::Init( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::IsProtected( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::IsDebuggerPresent( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::FindFirmwareVendor( AM')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::IsVirtualMachinePresent( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::IsValidImageCRC( AM')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::DecryptString( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::FreeString( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::AntidebugThread( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::SetSerialNumber( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::GetSerialNumberState( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::GetSerialNumberData( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::GetCurrentHWID( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::ActivateLicense( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::DeactivateLicense( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::GetOfflineActivationString( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::GetOfflineDeactivationString( LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Core::DecryptBuffer( LVN')
|
||
|
-- CpuId
|
||
|
table.insert(procedure_lines, 'VMProtect.CpuId::Invoke( AV')
|
||
|
-- String Manager
|
||
|
table.insert(procedure_lines, 'VMProtect.StringManager::.ctor( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.StringManager:: AVN')
|
||
|
-- Resource Manager
|
||
|
table.insert(procedure_lines, 'VMProtect.ResourceManager::.ctor( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.ResourceManager::DecryptData( AM')
|
||
|
table.insert(procedure_lines, 'VMProtect.ResourceManager:: AV')
|
||
|
-- HardwareID
|
||
|
table.insert(procedure_lines, 'VMProtect.HardwareID::.ctor( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.HardwareID::ToString( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.HardwareID:: AVN')
|
||
|
-- Licensing Manager
|
||
|
table.insert(procedure_lines, 'VMProtect.LicensingManager::.ctor( AV')
|
||
|
table.insert(procedure_lines, 'VMProtect.LicensingManager:: LVN')
|
||
|
table.insert(procedure_lines, 'VMProtect.LicensingManager/ActivationRequest:: LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.LicensingManager/DeactivationRequest:: LV')
|
||
|
table.insert(procedure_lines, 'VMProtect.LicensingManager/BaseRequest::Send( LV')
|
||
|
-- Loader
|
||
|
table.insert(procedure_lines, 'VMProtect.Loader::FindFirmwareVendor( IM')
|
||
|
table.insert(procedure_lines, 'VMProtect.Loader:: IVN')
|
||
|
table.insert(procedure_lines, 'VMProtect.GlobalData::Set IVN')
|
||
|
table.insert(procedure_lines, 'VMProtect.GlobalData:: IV')
|
||
|
table.insert(procedure_lines, 'SevenZip.Compression. IM')
|
||
|
table.insert(procedure_lines, 'VMProtect.Win32::GetProcAddress( IM')
|
||
|
table.insert(procedure_lines, 'VMProtect.Win32:: IV')
|
||
|
table.insert(procedure_lines, 'VMProtect.Win32/ IV')
|
||
|
else
|
||
|
-- Crypto
|
||
|
table.insert(procedure_lines, 'RC5Key:: A')
|
||
|
table.insert(procedure_lines, 'CipherRC5::CipherRC5( A')
|
||
|
table.insert(procedure_lines, 'CipherRC5::Encrypt( AM')
|
||
|
table.insert(procedure_lines, 'CipherRC5::Decrypt( AM')
|
||
|
table.insert(procedure_lines, 'CryptoContainer:: A')
|
||
|
table.insert(procedure_lines, 'SHA1:: A')
|
||
|
table.insert(procedure_lines, 'BigNumber::internal_mul( LMR')
|
||
|
table.insert(procedure_lines, 'BigNumber::internal_mod( LMR')
|
||
|
table.insert(procedure_lines, 'BigNumber:: LVN')
|
||
|
table.insert(procedure_lines, 'CalcCRC( AM')
|
||
|
-- Strings
|
||
|
table.insert(procedure_lines, 'string "')
|
||
|
-- Core
|
||
|
table.insert(procedure_lines, 'Core:: AV')
|
||
|
table.insert(procedure_lines, 'DllMain AV')
|
||
|
table.insert(procedure_lines, '_DllMain AV')
|
||
|
table.insert(procedure_lines, 'InternalGetProcAddress( A')
|
||
|
table.insert(procedure_lines, 'ShowMessage( AV')
|
||
|
table.insert(procedure_lines, 'ExportedIsValidImageCRC AVR')
|
||
|
table.insert(procedure_lines, 'CRCData::CRCData( AVN')
|
||
|
table.insert(procedure_lines, 'InternalFindFirmwareVendor AM')
|
||
|
table.insert(procedure_lines, 'ExportedIsVirtualMachinePresent AVR')
|
||
|
table.insert(procedure_lines, 'ExportedIsDebuggerPresent AVR')
|
||
|
table.insert(procedure_lines, 'ExportedIsProtected AVR')
|
||
|
table.insert(procedure_lines, 'CoreData::CoreData( AVN')
|
||
|
table.insert(procedure_lines, 'HookedNtProtectVirtualMemory( AM')
|
||
|
table.insert(procedure_lines, 'HookedNtClose( AM')
|
||
|
table.insert(procedure_lines, 'ExAllocateNonPagedPoolNx( AM')
|
||
|
-- Loader
|
||
|
table.insert(procedure_lines, 'SetupImage IVN')
|
||
|
table.insert(procedure_lines, 'FreeImage IV')
|
||
|
table.insert(procedure_lines, 'SETUP_IMAGE_DATA:: IVN')
|
||
|
table.insert(procedure_lines, 'LoaderMessage IVN')
|
||
|
table.insert(procedure_lines, 'Loader IM')
|
||
|
table.insert(procedure_lines, 'Lzma IM')
|
||
|
table.insert(procedure_lines, '_Lzma IM')
|
||
|
-- String Manager
|
||
|
table.insert(procedure_lines, 'VirtualString::VirtualString( AM')
|
||
|
table.insert(procedure_lines, 'VirtualString:: AVN')
|
||
|
table.insert(procedure_lines, 'VirtualStringList:: AVN')
|
||
|
table.insert(procedure_lines, 'StringManager:: AVN')
|
||
|
table.insert(procedure_lines, 'ExportedDecryptString AMR')
|
||
|
table.insert(procedure_lines, 'ExportedFreeString AMR')
|
||
|
-- Resource Manager
|
||
|
table.insert(procedure_lines, 'VirtualResource::Decrypt( EM')
|
||
|
table.insert(procedure_lines, 'VirtualResource:: EVN')
|
||
|
table.insert(procedure_lines, 'VirtualResourceList:: EVN')
|
||
|
table.insert(procedure_lines, 'ResourceManager:: EVN')
|
||
|
table.insert(procedure_lines, 'HookedLdrFindResource_U( EM')
|
||
|
table.insert(procedure_lines, 'HookedLdrAccessResource( EM')
|
||
|
table.insert(procedure_lines, 'HookedLoadStringA( EM')
|
||
|
table.insert(procedure_lines, 'HookedLoadStringW( EM')
|
||
|
table.insert(procedure_lines, 'ExportedLoadResource EMR')
|
||
|
table.insert(procedure_lines, 'ExportedFindResourceA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedFindResourceExA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedFindResourceW EMR')
|
||
|
table.insert(procedure_lines, 'ExportedFindResourceExW EMR')
|
||
|
table.insert(procedure_lines, 'ExportedLoadStringA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedLoadStringW EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceNamesA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceNamesW EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceLanguagesA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceLanguagesW EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceTypesA EMR')
|
||
|
table.insert(procedure_lines, 'ExportedEnumResourceTypesW EMR')
|
||
|
-- Licensing Manager
|
||
|
table.insert(procedure_lines, 'LicensingManager:: L')
|
||
|
table.insert(procedure_lines, 'ActivationRequest:: L')
|
||
|
table.insert(procedure_lines, 'DeactivationRequest:: L')
|
||
|
table.insert(procedure_lines, 'BaseRequest::Send( LVR')
|
||
|
table.insert(procedure_lines, 'ExportedSetSerialNumber LVR')
|
||
|
table.insert(procedure_lines, 'ExportedGetSerialNumberState LVR')
|
||
|
table.insert(procedure_lines, 'ExportedGetSerialNumberData LVR')
|
||
|
table.insert(procedure_lines, 'ExportedActivateLicense LVR')
|
||
|
table.insert(procedure_lines, 'ExportedDeactivateLicense LVR')
|
||
|
table.insert(procedure_lines, 'ExportedGetOfflineActivationString LVR')
|
||
|
table.insert(procedure_lines, 'ExportedGetOfflineDeactivationString LVR')
|
||
|
table.insert(procedure_lines, 'ExportedDecryptBuffer LVR')
|
||
|
-- HardwareID
|
||
|
table.insert(procedure_lines, 'HardwareID:: L')
|
||
|
table.insert(procedure_lines, 'ExportedGetCurrentHWID LVR')
|
||
|
-- File Manager
|
||
|
table.insert(procedure_lines, 'FileManager::ReadFile( BM')
|
||
|
table.insert(procedure_lines, 'FileManager::ReadImage( BM')
|
||
|
table.insert(procedure_lines, 'FileManager:: BVN')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryAttributesFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtCreateFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtOpenFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtReadFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryInformationFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryVolumeInformationFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtSetInformationFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryDirectoryFile( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtCreateSection( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtQuerySection( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtMapViewOfSection( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtUnmapViewOfSection( BM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryVirtualMemory( BM')
|
||
|
-- Registry Manager
|
||
|
table.insert(procedure_lines, 'RegistryManager:: RM')
|
||
|
table.insert(procedure_lines, 'RegistryKey:: RM')
|
||
|
table.insert(procedure_lines, 'HookedNtSetValueKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtDeleteValueKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtCreateKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtOpenKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtOpenKeyEx( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryValueKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtDeleteKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtQueryKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtEnumerateValueKey( RM')
|
||
|
table.insert(procedure_lines, 'HookedNtEnumerateKey( RM')
|
||
|
-- Hook Manager
|
||
|
table.insert(procedure_lines, 'HookManager:: AV')
|
||
|
table.insert(procedure_lines, 'HookedAPI:: AVN')
|
||
|
end
|
||
|
|
||
|
map_functions = file:mapFunctions()
|
||
|
functions = file:functions()
|
||
|
functions:clear()
|
||
|
function_params = {}
|
||
|
for _, line in ipairs(procedure_lines) do
|
||
|
if (line:len() == 0 or line:sub(1, 1) == "#") then
|
||
|
-- do nothing
|
||
|
else
|
||
|
i = line:find(" ")
|
||
|
params = ""
|
||
|
compilation_type = CompilationType.Virtualization
|
||
|
if (i) then
|
||
|
name = line:sub(1, i - 1)
|
||
|
params = line:sub(i + 1)
|
||
|
if (params:len() > 1) then
|
||
|
if (params:sub(2, 2) == "M") then
|
||
|
compilation_type = CompilationType.Mutation
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
name = line
|
||
|
end
|
||
|
is_found = false
|
||
|
for i = 1, map_functions:count() do
|
||
|
map_function = map_functions:item(i)
|
||
|
if (map_function:name():sub(1, name:len()) == name) then
|
||
|
is_found = true
|
||
|
if (not functions:itemByAddress(map_function:address())) then
|
||
|
func = functions:addByAddress(map_function:address(), compilation_type, false)
|
||
|
if (func) then
|
||
|
function_params[tostring(func:address())] = params
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if (not is_found) then
|
||
|
print(string.format("%s not found!!!", name))
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--
|
||
|
|
||
|
code_data = ""
|
||
|
|
||
|
-- process exports
|
||
|
|
||
|
export_names = {}
|
||
|
if (file:name() == ".NET") then
|
||
|
table.insert(export_names, "void VMProtect.Loader::Main()")
|
||
|
table.insert(export_names, "string VMProtect.Core::DecryptString()")
|
||
|
table.insert(export_names, "string VMProtect.Core::DecryptString()")
|
||
|
table.insert(export_names, "bool VMProtect.Core::FreeString(string&)")
|
||
|
table.insert(export_names, "valuetype VMProtect.SerialState VMProtect.Core::SetSerialNumber(string)")
|
||
|
table.insert(export_names, "valuetype VMProtect.SerialState VMProtect.Core::GetSerialNumberState()")
|
||
|
table.insert(export_names, "bool VMProtect.Core::GetSerialNumberData(class VMProtect.SerialNumberData&)")
|
||
|
table.insert(export_names, "string VMProtect.Core::GetCurrentHWID()")
|
||
|
table.insert(export_names, "valuetype VMProtect.ActivationStatus VMProtect.Core::ActivateLicense(string, string&)")
|
||
|
table.insert(export_names, "valuetype VMProtect.ActivationStatus VMProtect.Core::DeactivateLicense(string)")
|
||
|
table.insert(export_names, "valuetype VMProtect.ActivationStatus VMProtect.Core::GetOfflineActivationString(string, string&)")
|
||
|
table.insert(export_names, "valuetype VMProtect.ActivationStatus VMProtect.Core::GetOfflineDeactivationString(string, string&)")
|
||
|
table.insert(export_names, "bool VMProtect.Core::IsValidImageCRC()")
|
||
|
table.insert(export_names, "bool VMProtect.Core::IsDebuggerPresent(bool)")
|
||
|
table.insert(export_names, "bool VMProtect.Core::IsVirtualMachinePresent()")
|
||
|
table.insert(export_names, "unsigned int32 VMProtect.Core::DecryptBuffer(unsigned int32, unsigned int32, unsigned int32, unsigned int32)")
|
||
|
table.insert(export_names, "bool VMProtect.Core::IsProtected()")
|
||
|
table.insert(export_names, "unsigned int32 VMProtect.GlobalData::SessionKey()")
|
||
|
table.insert(export_names, "int32 VMProtect.VirtualMachine/Utils::Random()")
|
||
|
table.insert(export_names, "int32 VMProtect.VirtualMachine/Utils::CalcCRC(unsigned int32, unsigned int32)")
|
||
|
table.insert(export_names, "object VMProtect.VirtualMachine/Utils::BoxPointer(void*)")
|
||
|
table.insert(export_names, "void* VMProtect.VirtualMachine/Utils::UnboxPointer(object)")
|
||
|
else
|
||
|
table.insert(export_names, "SetupImage")
|
||
|
table.insert(export_names, "FreeImage")
|
||
|
table.insert(export_names, "ExportedDecryptString")
|
||
|
table.insert(export_names, "ExportedDecryptString")
|
||
|
table.insert(export_names, "ExportedFreeString")
|
||
|
table.insert(export_names, "ExportedSetSerialNumber")
|
||
|
table.insert(export_names, "ExportedGetSerialNumberState")
|
||
|
table.insert(export_names, "ExportedGetSerialNumberData")
|
||
|
table.insert(export_names, "ExportedGetCurrentHWID")
|
||
|
table.insert(export_names, "ExportedActivateLicense")
|
||
|
table.insert(export_names, "ExportedDeactivateLicense")
|
||
|
table.insert(export_names, "ExportedGetOfflineActivationString")
|
||
|
table.insert(export_names, "ExportedGetOfflineDeactivationString")
|
||
|
table.insert(export_names, "ExportedIsValidImageCRC")
|
||
|
table.insert(export_names, "ExportedIsDebuggerPresent")
|
||
|
table.insert(export_names, "ExportedIsVirtualMachinePresent")
|
||
|
table.insert(export_names, "ExportedDecryptBuffer")
|
||
|
table.insert(export_names, "ExportedIsProtected")
|
||
|
table.insert(export_names, "CalcCRC")
|
||
|
|
||
|
if file:file():format() == "PE" then
|
||
|
table.insert(export_names, "LoaderData")
|
||
|
table.insert(export_names, "ExportedLoadResource")
|
||
|
table.insert(export_names, "ExportedFindResourceA")
|
||
|
table.insert(export_names, "ExportedFindResourceExA")
|
||
|
table.insert(export_names, "ExportedFindResourceW")
|
||
|
table.insert(export_names, "ExportedFindResourceExW")
|
||
|
table.insert(export_names, "ExportedLoadStringA")
|
||
|
table.insert(export_names, "ExportedLoadStringW")
|
||
|
table.insert(export_names, "ExportedEnumResourceNamesA")
|
||
|
table.insert(export_names, "ExportedEnumResourceNamesW")
|
||
|
table.insert(export_names, "ExportedEnumResourceLanguagesA")
|
||
|
table.insert(export_names, "ExportedEnumResourceLanguagesW")
|
||
|
table.insert(export_names, "ExportedEnumResourceTypesA")
|
||
|
table.insert(export_names, "ExportedEnumResourceTypesW")
|
||
|
elseif file:file():format() == "Mach-O" then
|
||
|
table.insert(export_names, "_loader_data")
|
||
|
table.insert(export_names, "DllMain")
|
||
|
else
|
||
|
table.insert(export_names, "loader_data")
|
||
|
table.insert(export_names, "DllMain")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
count = 0
|
||
|
data = ""
|
||
|
for _, line in ipairs(export_names) do
|
||
|
export = file:exports():itemByName(line)
|
||
|
if (export) then
|
||
|
data = data .. DWordToChar(export:address() - file:imageBase())
|
||
|
count = count + 1
|
||
|
else
|
||
|
print(line .. " not found!!!")
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
|
||
|
-- process SDK
|
||
|
|
||
|
imports = file:imports()
|
||
|
|
||
|
sdk_indexes = {}
|
||
|
count = 0
|
||
|
data = ""
|
||
|
for i = 1, imports:count() do
|
||
|
import = imports:item(i)
|
||
|
if (import:isSDK()) then
|
||
|
table.insert(sdk_indexes, i)
|
||
|
for j = 1, import:count() do
|
||
|
import_function = import:item(j)
|
||
|
map_function = map_functions:itemByAddress(import_function:address())
|
||
|
if (map_function) then
|
||
|
data = data .. ByteToChar(import_function:type())
|
||
|
data = data .. DWordToChar(import_function:address() - file:imageBase())
|
||
|
count = count + 1
|
||
|
|
||
|
references = map_function:references()
|
||
|
data = data .. DWordToChar(references:count())
|
||
|
for k = 1, references:count() do
|
||
|
reference = references:item(k)
|
||
|
data = data .. DWordToChar(reference:address() - file:imageBase())
|
||
|
data = data .. DWordToChar(reference:operandAddress() - file:imageBase())
|
||
|
end
|
||
|
|
||
|
references:clear()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
|
||
|
-- process import references
|
||
|
|
||
|
count = 0
|
||
|
data = ""
|
||
|
for i = 1, imports:count() do
|
||
|
import = imports:item(i)
|
||
|
for j = 1, import:count() do
|
||
|
import_function = import:item(j)
|
||
|
map_function = map_functions:itemByAddress(import_function:address())
|
||
|
if (map_function) then
|
||
|
references = map_function:references()
|
||
|
for k = references:count(), 1, -1 do
|
||
|
reference = references:item(k)
|
||
|
is_found = false
|
||
|
for p = 1, functions:count() do
|
||
|
if (functions:item(p):itemByAddress(reference:address(), true)) then
|
||
|
is_found = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
if (is_found) then
|
||
|
sdk_count = 0;
|
||
|
for _, sdk_index in ipairs(sdk_indexes) do
|
||
|
if (i > sdk_index) then
|
||
|
sdk_count = sdk_count + 1
|
||
|
end
|
||
|
end
|
||
|
data = data .. DWordToChar(i - sdk_count) .. DWordToChar(j)
|
||
|
data = data .. DWordToChar(reference:address() - file:imageBase())
|
||
|
data = data .. DWordToChar(reference:operandAddress() - file:imageBase())
|
||
|
count = count + 1
|
||
|
|
||
|
references:delete(k)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
|
||
|
-- process strings
|
||
|
|
||
|
count = 0
|
||
|
data = ""
|
||
|
for i = 1, map_functions:count() do
|
||
|
map_function = map_functions:item(i)
|
||
|
if (map_function:type() == ObjectType.String) then
|
||
|
data = data .. DWordToChar(map_function:address() - file:imageBase())
|
||
|
data = data .. DWordToChar(map_function:address() + map_function:size() - file:imageBase())
|
||
|
count = count + 1
|
||
|
|
||
|
references = map_function:references()
|
||
|
data = data .. DWordToChar(references:count())
|
||
|
for k = 1, references:count() do
|
||
|
reference = references:item(k)
|
||
|
data = data .. DWordToChar(reference:address() - file:imageBase())
|
||
|
data = data .. DWordToChar(reference:operandAddress() - file:imageBase())
|
||
|
data = data .. ByteToChar(reference:tag())
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
|
||
|
-- process functions
|
||
|
|
||
|
count = 0
|
||
|
data = ""
|
||
|
for k = 1, functions:count() do
|
||
|
func = functions:item(k)
|
||
|
if (not func:needCompile()) then
|
||
|
count = count + 1
|
||
|
|
||
|
params = function_params[tostring(func:address())]
|
||
|
if (not params) then
|
||
|
params = ""
|
||
|
end
|
||
|
|
||
|
t = 0
|
||
|
if (params:len() > 0) then
|
||
|
if (params:sub(1, 1) == "L") then
|
||
|
t = 1
|
||
|
elseif (params:sub(1, 1) == "B") then
|
||
|
t = 2
|
||
|
elseif (params:sub(1, 1) == "R") then
|
||
|
t = 3
|
||
|
elseif (params:sub(1, 1) == "E") then
|
||
|
t = 4
|
||
|
elseif (params:sub(1, 1) == "I") then
|
||
|
t = 5
|
||
|
elseif (params:sub(1, 1) == "P") then
|
||
|
t = 6
|
||
|
end
|
||
|
end
|
||
|
|
||
|
e = 0
|
||
|
if (params:len() > 2) then
|
||
|
if (params:sub(3, 3) == "N") then
|
||
|
e = 1
|
||
|
elseif (params:sub(3, 3) == "R") then
|
||
|
e = 2
|
||
|
end
|
||
|
end
|
||
|
|
||
|
data = data .. ByteToChar(t)
|
||
|
.. ByteToChar(func:compilationType()
|
||
|
+ Ord(e == 1) * 0x10
|
||
|
+ Ord(e == 2) * 0x20
|
||
|
+ 0x80)
|
||
|
.. ByteToChar(func:type())
|
||
|
.. ByteToChar(file:cpuAddressSize())
|
||
|
.. DWordToChar(func:address() - file:imageBase())
|
||
|
|
||
|
data = data .. DWordToChar(func:count())
|
||
|
for i = 1, func:count() do
|
||
|
command = func:item(i)
|
||
|
if (file:name() == ".NET") then
|
||
|
-- IL
|
||
|
p = 0;
|
||
|
if (command:operandValue() > 0) then
|
||
|
p = 1
|
||
|
end
|
||
|
data = data .. ByteToChar(p
|
||
|
+ Ord(command:tokenReference()) * 0x08
|
||
|
+ Ord(command:size() > 255) * 0x10
|
||
|
+ Ord(command:link()) * 0x20)
|
||
|
.. DWordToChar(command:address() - file:imageBase())
|
||
|
.. WordToChar(command:type())
|
||
|
.. DWordToChar(command:options())
|
||
|
.. ByteToChar(command:alignment())
|
||
|
|
||
|
if (command:size() > 255) then
|
||
|
data = data .. WordToChar(command:size())
|
||
|
else
|
||
|
data = data .. ByteToChar(command:size())
|
||
|
end
|
||
|
|
||
|
if (command:type() == ILCommandType.Comment or command:type() == ILCommandType.Data) then
|
||
|
for j = 1, command:size() do
|
||
|
data = data .. ByteToChar(command:dump(j))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if (p > 0) then
|
||
|
data = data .. QWordToChar(command:operandValue())
|
||
|
end
|
||
|
else
|
||
|
-- Intel
|
||
|
if (command:type() == IntelCommandType.Lods or
|
||
|
command:type() == IntelCommandType.Stos or
|
||
|
command:type() == IntelCommandType.Scas or
|
||
|
command:type() == IntelCommandType.Movs or
|
||
|
command:type() == IntelCommandType.Cmps or
|
||
|
command:type() == IntelCommandType.Ins or
|
||
|
command:type() == IntelCommandType.Outs) then
|
||
|
p = 2
|
||
|
elseif (command:type() == IntelCommandType.Pusha or
|
||
|
command:type() == IntelCommandType.Popa or
|
||
|
command:type() == IntelCommandType.Pushf or
|
||
|
command:type() == IntelCommandType.Popf) then
|
||
|
p = 1
|
||
|
else
|
||
|
p = 0
|
||
|
for j = 1, 3 do
|
||
|
operand = command:operand(j)
|
||
|
if (operand:type() == OperandType.None) then
|
||
|
break
|
||
|
end
|
||
|
p = p + 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
data = data .. ByteToChar(p
|
||
|
+ Ord(command:preffix() ~= 0) * 0x8
|
||
|
+ Ord(command:size() > 255) * 0x10
|
||
|
+ Ord(command:link()) * 0x20
|
||
|
+ Ord(command:baseSegment() ~= IntelSegment.Default) * 0x40
|
||
|
+ Ord(command:flags() ~= 0) * 0x80)
|
||
|
.. DWordToChar(command:address() - file:imageBase())
|
||
|
.. WordToChar(command:type())
|
||
|
.. DWordToChar(command:options())
|
||
|
.. ByteToChar(command:alignment())
|
||
|
|
||
|
if (command:preffix() ~= 0) then
|
||
|
data = data .. WordToChar(command:preffix())
|
||
|
end
|
||
|
if (command:size() > 255) then
|
||
|
data = data .. WordToChar(command:size())
|
||
|
else
|
||
|
data = data .. ByteToChar(command:size())
|
||
|
end
|
||
|
if (command:baseSegment() ~= IntelSegment.Default) then
|
||
|
data = data .. ByteToChar(command:baseSegment())
|
||
|
end
|
||
|
if (command:flags() ~= 0) then
|
||
|
data = data .. WordToChar(command:flags())
|
||
|
end
|
||
|
|
||
|
if (command:type() == IntelCommandType.Db) then
|
||
|
for j = 1, command:size() do
|
||
|
data = data .. ByteToChar(command:dump(j))
|
||
|
end
|
||
|
else
|
||
|
r = 0
|
||
|
if (command:type() == IntelCommandType.Jmp or
|
||
|
command:type() == IntelCommandType.Call or
|
||
|
command:type() == IntelCommandType.Loop or
|
||
|
command:type() == IntelCommandType.Loope or
|
||
|
command:type() == IntelCommandType.Loopne or
|
||
|
command:type() == IntelCommandType.Jxx or
|
||
|
command:type() == IntelCommandType.Jcxz) then
|
||
|
operand = command:operand(1)
|
||
|
if (operand:type() == OperandType.Value) then
|
||
|
r = 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for j = 1, p do
|
||
|
operand = command:operand(j)
|
||
|
address_size = operand:addressSize()
|
||
|
if bit32.btest(operand:type(), OperandType.Memory) then
|
||
|
address_size = operand:addressSize()
|
||
|
else
|
||
|
address_size = 0
|
||
|
end
|
||
|
|
||
|
if operand:fixup() then
|
||
|
fixup = 1
|
||
|
elseif operand:isLargeValue() then
|
||
|
fixup = 2
|
||
|
else
|
||
|
fixup = 0
|
||
|
end
|
||
|
|
||
|
data = data .. ByteToChar(operand:size())
|
||
|
.. WordToChar(operand:type()
|
||
|
+ Ord(j == r) * 0x1000
|
||
|
+ Ord(address_size ~= file:cpuAddressSize()) * 0x2000
|
||
|
+ Ord(operand:scale() > 0) * 0x4000
|
||
|
+ Ord(fixup > 0) * 0x8000)
|
||
|
|
||
|
if (bit32.btest(operand:type(), OperandType.Registr
|
||
|
+ OperandType.SegmentRegistr
|
||
|
+ OperandType.ControlRegistr
|
||
|
+ OperandType.DebugRegistr
|
||
|
+ OperandType.FPURegistr
|
||
|
+ OperandType.HiPartRegistr
|
||
|
+ OperandType.MMXRegistr
|
||
|
+ OperandType.XMMRegistr)) then
|
||
|
data = data .. ByteToChar(operand:registr())
|
||
|
end
|
||
|
|
||
|
if (bit32.btest(operand:type(), OperandType.BaseRegistr)) then
|
||
|
data = data .. ByteToChar(operand:baseRegistr())
|
||
|
end
|
||
|
if (bit32.btest(operand:type(), OperandType.Value)) then
|
||
|
data = data .. ByteToChar(operand:valueSize())
|
||
|
if (j == r or fixup > 0) then
|
||
|
data = data .. DWordToChar(operand:value() - file:imageBase())
|
||
|
else
|
||
|
value_size = operand:valueSize()
|
||
|
if (value_size == OperandSize.Byte) then
|
||
|
data = data .. ByteToChar(operand:value())
|
||
|
elseif (value_size == OperandSize.Word) then
|
||
|
data = data .. WordToChar(operand:value())
|
||
|
elseif (value_size == OperandSize.DWord) then
|
||
|
data = data .. DWordToChar(operand:value())
|
||
|
elseif (value_size == OperandSize.QWord) then
|
||
|
data = data .. QWordToChar(operand:value())
|
||
|
end
|
||
|
end
|
||
|
if (fixup > 0) then
|
||
|
data = data .. ByteToChar(fixup)
|
||
|
end
|
||
|
end
|
||
|
if (bit32.btest(operand:type(), OperandType.Memory)) then
|
||
|
if (operand:scale() ~= 0) then
|
||
|
data = data .. ByteToChar(operand:scale())
|
||
|
end
|
||
|
if (operand:addressSize() ~= file:cpuAddressSize()) then
|
||
|
data = data .. ByteToChar(operand:addressSize())
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
data = data .. DWordToChar(func:info():count())
|
||
|
for i = 1, func:info():count() do
|
||
|
info = func:info():item(i)
|
||
|
if (info:entry()) then
|
||
|
entry_index = func:indexOf(info:entry())
|
||
|
else
|
||
|
entry_index = 0
|
||
|
end
|
||
|
|
||
|
if (info:dataEntry()) then
|
||
|
data_entry_index = func:indexOf(info:dataEntry())
|
||
|
else
|
||
|
data_entry_index = 0
|
||
|
end
|
||
|
|
||
|
data = data .. DWordToChar(info:beginAddress() - file:imageBase())
|
||
|
.. DWordToChar(info:endAddress() - file:imageBase())
|
||
|
.. ByteToChar(info:baseType())
|
||
|
if (info:baseType() == 0) then
|
||
|
data = data .. DWordToChar(info:baseValue())
|
||
|
end
|
||
|
data = data .. DWordToChar(info:prologSize())
|
||
|
.. ByteToChar(info:frameRegistr())
|
||
|
.. DWordToChar(entry_index)
|
||
|
.. DWordToChar(data_entry_index)
|
||
|
.. DWordToChar(info:unwindOpcodes():count())
|
||
|
for j = 1, info:unwindOpcodes():count() do
|
||
|
data = data .. DWordToChar(func:indexOf(info:unwindOpcodes():item(j)))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
data = data .. DWordToChar(func:ranges():count())
|
||
|
for i = 1, func:ranges():count() do
|
||
|
range = func:ranges():item(i)
|
||
|
if (range:beginEntry()) then
|
||
|
begin_index = func:indexOf(range:beginEntry())
|
||
|
else
|
||
|
begin_index = 0
|
||
|
end
|
||
|
if (range:endEntry()) then
|
||
|
end_index = func:indexOf(range:endEntry())
|
||
|
else
|
||
|
end_index = 0
|
||
|
end
|
||
|
if (range:sizeEntry()) then
|
||
|
size_index = func:indexOf(range:sizeEntry())
|
||
|
else
|
||
|
size_index = 0
|
||
|
end
|
||
|
|
||
|
data = data .. DWordToChar(range:beginAddress() - file:imageBase())
|
||
|
.. DWordToChar(range:endAddress() - file:imageBase())
|
||
|
.. DWordToChar(begin_index)
|
||
|
.. DWordToChar(end_index)
|
||
|
.. DWordToChar(size_index)
|
||
|
end
|
||
|
|
||
|
data = data .. DWordToChar(func:links():count())
|
||
|
for i = 1, func:links():count() do
|
||
|
link = func:links():item(i)
|
||
|
data = data .. DWordToChar(func:indexOf(link:from()))
|
||
|
.. ByteToChar(link:type())
|
||
|
.. ByteToChar(link:operand())
|
||
|
.. ByteToChar(Ord(link:toAddress() > 0)
|
||
|
+ Ord(link:subValue() > 0) * 0x2
|
||
|
+ Ord(link:parent()) * 0x4
|
||
|
+ Ord(link:baseInfo()) * 0x8)
|
||
|
|
||
|
if (link:toAddress() > 0) then
|
||
|
data = data .. DWordToChar(link:toAddress() - file:imageBase())
|
||
|
end
|
||
|
if (link:subValue() > 0) then
|
||
|
data = data .. DWordToChar(link:subValue() - file:imageBase())
|
||
|
end
|
||
|
if (link:parent()) then
|
||
|
data = data .. DWordToChar(func:indexOf(link:parent()))
|
||
|
end
|
||
|
if (link:baseInfo()) then
|
||
|
data = data .. DWordToChar(func:info():indexOf(link:baseInfo()))
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
|
||
|
if (file:file():format() == "PE") then
|
||
|
-- process CFG addresses
|
||
|
|
||
|
count = 0
|
||
|
data = ""
|
||
|
if (file:name() ~= ".NET") then
|
||
|
cfg_names = {}
|
||
|
table.insert(cfg_names, "_freefls")
|
||
|
table.insert(cfg_names, "__freefls@4")
|
||
|
for _, line in ipairs(cfg_names) do
|
||
|
map_function = map_functions:itemByName(line)
|
||
|
if (map_function) then
|
||
|
data = data .. DWordToChar(map_function:address() - file:imageBase())
|
||
|
count = count + 1
|
||
|
else
|
||
|
print(line .. " not found!!!")
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
code_data = code_data .. DWordToChar(count) .. data
|
||
|
end]]>
|
||
|
</Script>
|
||
|
<DLLBox />
|
||
|
<LicenseManager ProductCode="" />
|
||
|
</Document>
|