unidbg 应用实例,失败的实验

实验目标


本例子的应用场景是使用自己写了个c++代码,然后使用IDA进行静态分析,再使用unidbg动态分析。

实验步骤


1:准备c++源码和编译后的源码。

我这里将使用资料进行上传,大家可以自行下载。源码如下。

#include <iostream>
int arraySum( int array[], int count )
{
    int i;
    int sum = 0;
    for(i = 0; i < count; i++)
        sum += array[i];
    return sum;
}
int main() {
    int nums[10];
    int i;

    //将1~10放入数组中
    for(i=0; i<10; i++){
        nums[i] = (i+1);
    }
    int length = sizeof(nums) / sizeof(nums[0]);

    int sum = arraySum(nums,length);
    printf("sum = %d
", sum);

    return 0;
}

源码很简单,就是一个求和函数和在main方法里调用。也可以从这里.

2:使用IDA动态分析main.exe文件

( 从这里 与上面的连接是一个地址)

3:使用unidbg进行动态hook函数sub_100401080

package com.github.unidbg.mytest;

import com.github.unidbg.Emulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.arm.backend.Unicorn2Factory;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.memory.Memory;

import java.io.File;
import java.io.IOException;

public class HelloUnidbg {

    public static void main(String[] args) throws IOException {
        new HelloUnidbg().crack();
    }

    private final Emulator<?> emulator;
    private final Module module;
    private final File executable;

    public HelloUnidbg() {
        executable = new File("unidbg-android/src/test/resources/example_binaries/main.exe");
        emulator = AndroidEmulatorBuilder.for64Bit()
                .setProcessName(executable.getName())
                .setRootDir(new File("target/rootfs"))
//                .addBackendFactory(new DynarmicFactory(true))
                .addBackendFactory(new Unicorn2Factory(true))
                .build();
        Memory memory = emulator.getMemory();
        LibraryResolver resolver = new AndroidResolver(19);
        memory.setLibraryResolver(resolver);

        module = emulator.loadLibrary(executable);
    }

    private boolean canStop;

    private void crack() {

        while (!canStop) {
            long start = System.currentTimeMillis();

            System.err.println("exit code: " + module.callEntry(emulator) + ", offset=" + (System.currentTimeMillis() - start) + "ms" );
            canStop = true;
        }
    }


}

4:结论

本来计划参考CrackMe来实现,但是执行是报错。应该是unidbg不支持exe文件调用。

Exception in thread "main" net.fornwall.jelf.ElfException: Bad magic number for file at net.fornwall.jelf.ElfFile.<init>(ElfFile.java:271) at net.fornwall.jelf.ElfFile.fromBytes(ElfFile.java:259) at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:338) at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:197) at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:63) at com.github.unidbg.spi.AbstractLoader.load(AbstractLoader.java:212) at com.github.unidbg.spi.AbstractLoader.load(AbstractLoader.java:202) at com.github.unidbg.arm.AbstractARM64Emulator.loadLibrary(AbstractARM64Emulator.java:144) at com.github.unidbg.mytest.HelloUnidbg.<init>(HelloUnidbg.java:45) at com.github.unidbg.mytest.HelloUnidbg.main(HelloUnidbg.java:26) Class transformation time: 0.058103707s for 713 classes or 8.149187517531557E-5s per class

5:总结

建议以后向android 的jni或者ios逆向方向研究。

经验分享 程序员 微信小程序 职场和发展