VMProtect/unit-tests/il_tests.cc

91 lines
3.4 KiB
C++

#include "../runtime/crypto.h"
#include "../core/objects.h"
#include "../core/osutils.h"
#include "../core/streams.h"
#include "../core/core.h"
#include "../core/files.h"
#include "../core/processors.h"
#include "../core/pefile.h"
#include "../core/il.h"
#include "../core/dotnetfile.h"
#include "testfileil.h"
TEST(ILTest, DisasmSmoke)
{
uint8_t buf[] = {
/*
.method public hidebysig static bool TakesSingleByteArgument(valuetype System.Reflection.Emit.OpCode inst) cil managed
SIG: 00 01 02 11 92 88
{
// Method begins at RVA 0x94b60
// Code size 45 (0x2D)
.maxstack 2
.locals init (valuetype System.Reflection.Emit.OperandType V_0)
*/
0x2D * 4 + 2, // Tiny header
0x0F, 0x00, // IL_0000: ldarga.s inst
0x7B, 0x04, 0x00, 0x16, 0xF8, // IL_0002: ldfld valuetype System.Reflection.Emit.OperandType System.Reflection.Emit.OpCode::m_operand
0x0A, // IL_0007: stloc.0
0x06, // IL_0008: ldloc.0
0x1F, 0x0F, // IL_0009: ldc.i4.s 15
0x59, // IL_000b: sub
0x45, 0x04, 0x00, 0x00, 0x00, // IL_000c: switch (
0x02, 0x00, 0x00, 0x00, // IL_0023,
0x02, 0x00, 0x00, 0x00, // IL_0023,
0x04, 0x00, 0x00, 0x00, // IL_0025,
0x02, 0x00, 0x00, 0x00, // IL_0023)
0x2B, 0x02, // IL_0021: br.s IL_0025
0x17, // IL_0023: ldc.i4.1
0x2A, // IL_0024: ret
0x16, // IL_0025: ldc.i4.0
0xFE, 0x13, // IL_0026: volatile.?
0x2A, // IL_0027: ret
//} end of method OpCodes::TakesSingleByteArgument
};
//ILFunction *func;
//MapFunctionList *map_function_list;
//MapFunction *map_function;
//ILCommand *command;
/*
TestFile test_file(osDWord);
TestArchitecture &arch = *test_file.item(0);
TestSegmentList *segment_list = arch.segment_list();
uint64_t addr = 0x004B58EC;
TestSegment *segment = segment_list->Add(addr, 0x10000, ".text", mtReadable | mtExecutable);
segment->set_physical_size(sizeof(buf));
test_file.OpenFromMemory(buf, sizeof(buf));
arch.runtime_function_list()->AddObject(
new NETRuntimeFunction(arch.runtime_function_list(), addr, addr + (buf[0] >> 2) + 1, addr + 1, NULL, NULL));
func = reinterpret_cast<ILFunction *>(arch.function_list()->AddByAddress(addr + 1, ctVirtualization, 0, true, NULL));
ASSERT_EQ(func->count(), 13ul);
*/
/*
map_function_list = arch.map_function_list();
map_function = map_function_list->GetFunctionByName("VMProtectMarker1");
ASSERT_TRUE(map_function != NULL);
EXPECT_EQ(map_function->address(), 0x004B5906ull);
EXPECT_EQ(func->ReadFromFile(arch, map_function->address()), 45ul);
// Check CompileToNative
std::vector<uint8_t> data;
size_t i, j;
for (i = 0; i < func->count(); i++) {
command = func->item(i);
if ((command->type() == cmJmpWithFlag || command->type() == cmJmp || command->type() == cmCall) && command->dump_size() == 2)
continue;
data.clear();
for (j = 0; j < command->dump_size(); j++) {
data.push_back(command->dump(j));
}
command->CompileToNative();
EXPECT_EQ(command->dump_size(), data.size());
for (j = 0; j < command->dump_size(); j++) {
EXPECT_EQ(command->dump(j), data[j]);
}
}*/
}