首页 > 作文

ollydbg使用教程注册步骤(od工具使用教程)

更新时间:2023-04-05 14:27:38 阅读: 评论:0

现在很多的app使用了so加密,以后会越来越多。爬虫工程师可能会直接逆向app,看java代码,完成java层的算法破解,但是如果遇到so该怎么办呢?可能你会直接破解so,但是真的会有很多爬虫工程师会去并且会破解so吗?有时候我们可以不用破解so,利用很多大佬写好的轮子即可完成so的调用。说到调用,就有很多方法了,比如用frida的rp中国合伙人 经典台词c、xpod+andrver、再者就是unicorn+web框架等等,今天要说的并不是这些,而是unidbg,这框架有什么好的地方呢?看看介绍。

介绍(来自逸飞)

unidbg 是一个基于 unicorn 的逆向工具,可以黑盒调用安卓和 ios 中的 so 文件。unidbg 是一个标准的 java 项目。

由于现在的大多数 app 把签名算法已经放到了 so 文件中,所以要想破解签名算法,必须能够破解 so 文件。但是我们知道,c++ 的逆向远比 java 的逆向要难得多了,所以好多时候是没法破解的,那么这个时候还可以采用 hook 的方法,直接读取程序中算出来的签名,但是这样的话,需要实际运行这个应用,需要模拟器或者真机,效率又不是很高。

unidbg 就是一个很巧妙地解决方案,他不需要直接运行 app,也无需逆向 so 文件,而是通过在 app 中找到对应的 jni 接口,然后用 unicorn 引擎直接执行这个 so 文件,所以效率也比较高。

这里重要的是目前利用unidbg+springboot做成了web服务。食用案例来自jxu2qkqyyxbwjtiwdjqumtyuma==
对于该app而言,是非常适合入门的一个app,未加固、算法简单、很容易找到so的jni。先去凯神的github上下载https://github.com/zhkl0228/unidbg下载完毕用idea打开,等待maven下载完毕。我这里已经创建好du的文件。

上个代码看着比较方便,代码中有很多注释

public class du extends abstractjni {    //arm模拟器    private final armemulator emulator;    //vm    private final vm vm;    //载入的模块    private final module module;    private final dvmclass ttencryptutils;    //初始化    public du() throws ioexception {        //创建app进程,这里其实可以不用写的,我这里是随便写的,使用app本身的进程就可以绕过进程检测        emulator = new androidarmemulator("com.du.du");        memory memory = emulator.getmemory();        //作者支持19和23两个sdk        memory.tlibraryresolver(new androidresolver(23));        memory.tcallinitfunction();        //创建dalvikvm,利用apk本身,可以为null        //如果用apk文件加载so的话,会自动处理签名方面的jni,具体可看abstractjni,利用apk加载的好处,//        vm = emulator.createdalvikvm(new file("src/test/resources/du/du4160.apk"));我这里没有用到apk,主要是没有检测其他因素。        vm = emulator.createdalvikvm(null);        //加载so,使用armv8-64速度会快很多,这里是so的文件路径,其实也可以利用apk自身的。        dalvikmodule dm = vm.loadlibrary(new file("src/test/resources/du/libjniencrypt.so"), fal);        //调用jni        dm.calljni_onload(emulator);        module = dm.getmodule();        //加载so的那个类        ttencryptutils = vm.resolveclass("com/duapp/aesjni/aencrypt");    }    //关闭模拟器    private void destroy() throws ioexception {        emulator.clo();        system.out.println("destroy");    }    public static void main(string[] args) throws ioexception {        du t = new du();        t.encodebyte();        t.destroy();    }    private string encodebyte() {        //调试        // 这里还支持gdb调试,        //emulator.attach(debuggertype.gdb_rver);        //附加调试器//        emulator.attach(debuggertype.simple);//        emulator.tracecode();        //这里是打断点,原地址0x00005028->新地址0x40005028 新地址需要改成0x4 //        emulator.attach().addbreakpoint(null, 0x40001188);//encode地址//        emulator.attach().addbreakpoint(null, 0x40000d10);        number ret = ttencryptutils.callstaticjnimethod(emulator, "getbytevalues()ljava/la古诗的特点ng/string;");        long hash = ret.intvalue() & 0xffffffffl;        stringobject st1 = vm.getobject(hash);        //*这里要处理下字符串        str课文詹天佑ing bytestring = st1.getvalue();        stringbuilder builder = new stringbuilder(bytestring.length());        for (int i = 0; i < bytestring.length(); i++) {            if精神风貌 (bytestring.charat(i) == '0') {                builder.append('1');            } el {                builder.append('0');            }        }        //获取encodebyte地址        ret = ttencryptutils.callstaticjnimethod(emulator, "encodebyte(ljava/lang/string;ljava/lang/string;)ljava/lang/string;",                //传参,这里需要两个字符串,所以就传入两个参数                vm.addlocalobject(new stringobject(vm, "要加密的值")),                vm.addlocalobject(new stringobject(vm, builder.tostring())));        //ret 返回的是地址,        hash = ret.intvalue() & 0xffffffffl;        //获得其值        stringobject str = vm.getobject(hash);        system.out.println(str.getvalue());        return str.getvalue();    }}

上边代码有jni的类是哪一个需要知道,就是下面这个类,这个其实是和加载so有关系的。

ttencryptutils =白水之恋 vm.resolveclass(“com/*/aesjni/aencrypt”);
我们需要逆向app,这里不细说如何在app中寻找加载so的类。如下图,encodebyte是该app调用native层加密的入口,loadlibrary是java加载so的方法,这个类就是上述代码中填写的。

然后再看”encodebyte(ljava/lang/string;ljava/lang/string;)ljava/lang/string;”这里,这是smali写法,不补基础,后面跟上需要传的参数,
getbytevalues 这个方法是毒获取的一个01字符串,并且在java层进行了处理,然后再传进encodebyte里面,encodebyte这个方法最后获取的其实并不是最终需要的,需要md5才是最后的newsign。可以验证一下下。

测试结果通过。

最后

启动java文件时候注意这个改成自己的平台!!!

vm options: -djava.library.path=prebuilt/os -djna.library.path=prebuilt/oswhere os may: linux64, win32, win64, osx64

本文发布于:2023-04-05 14:27:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/09c224ebe06a653317931fd8597f8adc.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:ollydbg使用教程注册步骤(od工具使用教程).doc

本文 PDF 下载地址:ollydbg使用教程注册步骤(od工具使用教程).pdf

标签:文件   加载   地址   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图