示例#1
0
int main(int argc, char **argv, char **envp)
{
	// dynamically load shared library
#ifdef DYNLOAD
    if (!uc_dyn_load(NULL, 0)) {
        printf("Error dynamically loading shared library.\n");
        printf("Please check that unicorn.dll/unicorn.so is available as well as\n");
        printf("any other dependent dll/so files.\n");
        printf("The easiest way is to place them in the same directory as this app.\n");
        return 1;
    }
#endif
    
    // test memleak
    while(1) {
        test_mips_eb();
        test_mips_el();
    }

    // dynamically free shared library
#ifdef DYNLOAD
    uc_dyn_free();
#endif
    
    return 0;
}
示例#2
0
int main(int argc, char **argv, char **envp)
{
	// dynamically load shared library
#ifdef DYNLOAD
    if (!uc_dyn_load(NULL, 0)) {
        printf("Error dynamically loading shared library.\n");
        printf("Please check that unicorn.dll/unicorn.so is available as well as\n");
        printf("any other dependent dll/so files.\n");
        printf("The easiest way is to place them in the same directory as this app.\n");
        return 1;
    }
#endif
    
	if (argc == 2) {
        if (!strcmp(argv[1], "-32")) {
            test_i386();
            test_i386_map_ptr();
            test_i386_inout();
            test_i386_context_save();
            test_i386_jump();
            test_i386_loop();
            test_i386_invalid_mem_read();
            test_i386_invalid_mem_write();
            test_i386_jump_invalid();
        }

        if (!strcmp(argv[1], "-64")) {
            test_x86_64();
            test_x86_64_syscall();
        }

        if (!strcmp(argv[1], "-16")) {
            test_x86_16();
        }
    } else {
        printf("Syntax: %s <-16|-32|-64>\n", argv[0]);
    }

    // dynamically free shared library
#ifdef DYNLOAD
    uc_dyn_free();
#endif
    
    return 0;
}
int main(int argc, char **argv, char **envp)
{
    uc_engine *uc;
    uc_err err;
    uc_hook hhc;
    uint32_t val;

    // dynamically load shared library
#ifdef DYNLOAD
    uc_dyn_load(NULL, 0);
#endif

    // Initialize emulator in MIPS 32bit little endian mode
    printf("uc_open()\n");
    err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc);
    if (err)
    {
        printf("Failed on uc_open() with error returned: %u\n", err);
        return err;
    }

    // map in a page of mem
    printf("uc_mem_map()\n");
    err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL);
    if (err)
    {
        printf("Failed on uc_mem_map() with error returned: %u\n", err);
        return err;
    }

    // hook all instructions by having @begin > @end
    printf("uc_hook_add()\n");
    uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, (uint64_t)1, (uint64_t)0);
    if( err )
    {
        printf("Failed on uc_hook_add(code) with error returned: %u\n", err);
        return err;
    }


    // write test1 code to be emulated to memory
    test_num = 1;
    printf("\nuc_mem_write(1)\n");
    err = uc_mem_write(uc, addr, test_code_1, sizeof(test_code_1));
    if( err )
    {
        printf("Failed on uc_mem_write() with error returned: %u\n", err);
        return err;
    }
    // start executing test code 1
    printf("uc_emu_start(1)\n");
    uc_emu_start(uc, addr, addr+sizeof(test_code_1), 0, 0);
    // read the value from a0 when finished executing
    uc_reg_read(uc, UC_MIPS_REG_A0, &val);	printf("a0 is %X\n", val);
    if( val != 0 )
        test1_delayslot_executed = true;


    // write test2 code to be emulated to memory
    test_num = 2;
    printf("\nuc_mem_write(2)\n");
    err = uc_mem_write(uc, addr, test_code_2, sizeof(test_code_2));
    if( err )
    {
        printf("Failed on uc_mem_write() with error returned: %u\n", err);
        return err;
    }
    // start executing test code 2
    printf("uc_emu_start(2)\n");
    uc_emu_start(uc, addr, addr+sizeof(test_code_2), 0, 0);
    // read the value from a0 when finished executing
    uc_reg_read(uc, UC_MIPS_REG_A0, &val);	printf("a0 is %X\n", val);
    if( val != 0 )
        test2_delayslot_executed = true;


    // free resources
    printf("\nuc_close()\n");
    uc_close(uc);


    // print test results
    printf("\n\nTest 1 SHOULD execute the delay slot instruction:\n");
    printf("  Emulator %s execute the delay slot:  %s\n",
            test1_delayslot_executed ? "did" : "did not",
            test1_delayslot_executed ? "CORRECT" : "WRONG");
    printf("  Emulator %s hook the delay slot:  %s\n",
            test1_delayslot_hooked ? "did" : "did not",
            test1_delayslot_hooked ? "CORRECT" : "WRONG");

    printf("\n\nTest 2 SHOULD NOT execute the delay slot instruction:\n");
    printf("  Emulator %s execute the delay slot:  %s\n",
            test2_delayslot_executed ? "did" : "did not",
            !test2_delayslot_executed ? "CORRECT" : "WRONG");
    printf("  Emulator %s hook the delay slot:  %s\n",
            test2_delayslot_hooked ? "did" : "did not",
            !test2_delayslot_hooked ? "CORRECT" : "WRONG");


    // test 1 SHOULD execute the instruction in the delay slot
    if( test1_delayslot_hooked == true && test1_delayslot_executed == true )
        printf("\n\nTEST 1 PASSED!\n");
    else
        printf("\n\nTEST 1 FAILED!\n");

    // test 2 SHOULD NOT execute the instruction in the delay slot
    if( test2_delayslot_hooked == false && test2_delayslot_executed == false )
        printf("TEST 2 PASSED!\n\n");
    else
        printf("TEST 2 FAILED!\n\n");


    // dynamically free shared library
#ifdef DYNLOAD
    uc_dyn_free();
#endif

    return 0;
}
int main(int argc, char **argv, char **envp)
{
    uc_engine *uc;
    uc_err err;
	uc_hook hhc;
	uint32_t val;

	// dynamically load shared library
#ifdef DYNLOAD
	uc_dyn_load(NULL, 0);
#endif

	// Initialize emulator in MIPS 32bit little endian mode
    err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc);
    if (err)
	{
        printf("Failed on uc_open() with error returned: %u\n", err);
        return err;
    }

	// map in a page of mem
	err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL);
    if (err)
	{
        printf("Failed on uc_mem_map() with error returned: %u\n", err);
        return err;
    }

	// write machine code to be emulated to memory
    err = uc_mem_write(uc, addr, loop_test_code, sizeof(loop_test_code));
	if( err )
	{
        printf("Failed on uc_mem_write() with error returned: %u\n", err);
        return err;
    }
	
    // hook all instructions by having @begin > @end
    uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, (uint64_t)1, (uint64_t)0);
	if( err )
	{
        printf("Failed on uc_hook_add(code) with error returned: %u\n", err);
        return err;
    }
	
    // execute code
	printf("---- Executing Code ----\n");
	err = uc_emu_start(uc, addr, addr + sizeof(loop_test_code), 0, 0);
    if (err)
	{
        printf("Failed on uc_emu_start() with error returned %u: %s\n",
                err, uc_strerror(err));
		return err;
    }

	// done executing, print some reg values as a test
	printf("---- Execution Complete ----\n\n");
	uc_reg_read(uc, UC_MIPS_REG_PC, &val);	printf("pc is %X\n", val);
	uc_reg_read(uc, UC_MIPS_REG_A0, &val);	printf("a0 is %X\n", val);
	
	// free resources
	uc_close(uc);
	
	if( test_passed_ok )
		printf("\n\nTEST PASSED!\n\n");
	else
		printf("\n\nTEST FAILED!\n\n");

	// dynamically free shared library
#ifdef DYNLOAD
    uc_dyn_free();
#endif

	return 0;
}
示例#5
0
int main(int argc, char **argv, char **envp)
{
    uc_engine *uc;
    uc_err err;
	int ret;
	uc_hook hhc;
	uint32_t val;
	EmuStarterParam_t starter_params;
#ifdef _WIN32
	HANDLE th = (HANDLE)-1;
#else
	pthread_t th;
#endif

	// dynamically load shared library
#ifdef DYNLOAD
	uc_dyn_load(NULL, 0);
#endif

	// Initialize emulator in MIPS 32bit little endian mode
    printf("uc_open()\n");
	err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc);
    if (err)
	{
        printf("Failed on uc_open() with error returned: %u\n", err);
        return err;
    }

	// map in a page of mem
	printf("uc_mem_map()\n");
	err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL);
    if (err)
	{
        printf("Failed on uc_mem_map() with error returned: %u\n", err);
        return err;
    }

	// write machine code to be emulated to memory
	printf("uc_mem_write()\n");
    err = uc_mem_write(uc, addr, loop_test_code, sizeof(loop_test_code));
	if( err )
	{
        printf("Failed on uc_mem_write() with error returned: %u\n", err);
        return err;
    }
	
    // hook all instructions by having @begin > @end
	printf("uc_hook_add()\n");
    uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, 1, 0);
	if( err )
	{
        printf("Failed on uc_hook_add(code) with error returned: %u\n", err);
        return err;
    }
	
	
	// start background thread
	printf("---- Thread Starting ----\n");
	starter_params.uc = uc;
	starter_params.startAddr = addr;
	starter_params.endAddr = addr + sizeof(loop_test_code);

#ifdef _WIN32
	// create thread
	th = (HANDLE)_beginthreadex(NULL, 0, win32_emu_starter, &starter_params, CREATE_SUSPENDED, NULL);
	if(th == (HANDLE)-1)
	{
		printf("Failed on _beginthreadex() with error returned: %u\n", _errno());
		return -1;
	}
	// start thread
	ret = ResumeThread(th);
	if( ret == -1 )
	{
		printf("Failed on ResumeThread() with error returned: %u\n", _errno());
		return -2;
	}
	// wait 3 seconds
	Sleep(3 * 1000);
#else
	// add posix code to start the emu_starter() thread
	ret = pthread_create(&th, NULL, posix_emu_starter, &starter_params);
	if( ret )
	{
		printf("Failed on pthread_create() with error returned: %u\n", err);
		return -2;
	}
	// wait 3 seconds
	sleep(3);
#endif


	// Stop the thread after it has been let to run in the background for a while
	printf("---- Thread Stopping ----\n");
	printf("uc_emu_stop()\n");
	err = uc_emu_stop(uc);
	if( err )
	{
        printf("Failed on uc_emu_stop() with error returned: %u\n", err);
        return err;
    }
	test_passed_ok = true;
	

	// done executing, print some reg values as a test
	uc_reg_read(uc, UC_MIPS_REG_PC, &val);	printf("pc is %X\n", val);
	uc_reg_read(uc, UC_MIPS_REG_A0, &val);	printf("a0 is %X\n", val);
	
	// free resources
	printf("uc_close()\n");
	uc_close(uc);
	
	if( test_passed_ok )
		printf("\n\nTEST PASSED!\n\n");
	else
		printf("\n\nTEST FAILED!\n\n");

	// dynamically free shared library
#ifdef DYNLOAD
    uc_dyn_free();
#endif

	return 0;
}