aboutsummaryrefslogtreecommitdiff
path: root/core/runtime.vmp
diff options
context:
space:
mode:
Diffstat (limited to 'core/runtime.vmp')
-rw-r--r--core/runtime.vmp943
1 files changed, 943 insertions, 0 deletions
diff --git a/core/runtime.vmp b/core/runtime.vmp
new file mode 100644
index 0000000..f97fcf5
--- /dev/null
+++ b/core/runtime.vmp
@@ -0,0 +1,943 @@
+<?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>