美文网首页
Unidbg + Web = Unidbg-server 手把

Unidbg + Web = Unidbg-server 手把

作者: fenfei331 | 来源:发表于2021-07-26 07:20 被阅读0次

    一、目标

    爆肝+熬夜,终于把so用unidbg跑起来了,总不能放在硬盘里发霉吧。我们得在生成环境下用起来。

    最方便的方式就是租台云服务器,然后把Unidbg部署上去,就可以给我们的工作者程序提供云签名服务了。

    • unidbg
    • Unidbg-server

    二、步骤

    Unidbg-server

    玩Unidbg还得是java老艺术家才行,cxapython大佬提供了一个springboot运行unidbg的方案:

    https://github.com/cxapython/unidbg-server

    git clone 下来,然后导入到idea

    ide.png

    然后、编译、运行......

    ffMac:unidbgweb fenfei$ python3 send.py
    {'X-Khronos': '1627183488', 'X-Gorgon': '0401007008006c494547b54e36413a81b1a8118d238f2dffd9b3'}
    

    跑一下作者提供的例子

    yyds.jpeg

    我去,一套行云流水,顺利跑通。现在做开源的大佬都这么拼了? 简直开箱即用

    Unidbg在哪里

    我们只下载了Unidbg-server的代码,并没有下载Unidbg的代码?为啥直接就能跑起来?

    奥秘在pom.xml里面,加载了线上的unidbg模块,所以可以直接跑起来。

    加点料

    通过前面的学习,我们对Unidbg已经有一定的熟悉了,所以可能维护了一份定制的修改。这样问题就来了,可不可以不加载线上的Unidbg的代码,而加载我们本机修改过的版本?

    jar.png

    把定制版的unidbg编译生成的一堆jar包拷进去

    • 修改 pom.xml
    // 删除这两个段, 不使用线上的unidbg
    <dependency>
        <groupId>com.github.zhkl0228</groupId>
        <artifactId>unidbg-api</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.github.zhkl0228</groupId>
        <artifactId>unidbg-android</artifactId>
        <version>0.9.0</version>
    </dependency>
    
    // 增加这一个段,使用本地的unidbg
    <dependency>
        <groupId>unidbg</groupId>
        <artifactId>unidbg</artifactId>
        <version>0.9.5</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/unidbg-parent.jar</systemPath>
    </dependency>
    
    • 然后在左侧工程窗口点右键 Maven -> Reload project

    • 重新编译下。 报错了,我就知道不会这么顺利。

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instanceiate [com .damei.xhs.xhsshield.controller.Xhs668Controller]:构造函数抛出异常;嵌套异常是 java.lang.NoSuchFieldError: OSX_ARM64
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:225)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
    at org .springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1308)
    ... 18 更多
    引起:java.lang.NoSuchFieldError:OSX_ARM64
    
    • 这是为啥呀,百思不得其姐。算了问问谷哥吧。

    在Unidbg的github上有个兄弟提了一个issues,和我们遇到的问题一样。 目前作者还木有解决方案。不过这个老兄说: 我用了之前的 0.9.2 没有这个问题,0.9.3 就出现了这个问题

    再仔细看看Unidbg-server作者的玩法,他用的是Unidbg的 0.9.0版本。

    好吧,目前的权宜之计是把0.9.2的版本Unidbg代码下载回来,然后加入我们的定制代码。再编译一下,顺利跑过。

    有点慢?再优化一把

    生产环境下的性能瓶颈可能在unidbg的模拟器初始化上,我们可以只初始化一个模拟器,然后每次做签名的时候只需要调用指定的函数就行。

    在controller目录下创建一个 FenfeiController.java

    public class FenfeiController {
        public static DouyinSign instance;
    
        static {
            instance = new DouyinSign();
        }
    
        @RequestMapping(value="dySignEx",method =  {RequestMethod.GET,RequestMethod.POST})
        @ResponseBody
        public String dySign(@RequestParam("url") String url) {
            Map<String,String> result= instance.crack(url);
            String jsonString = JSON.toJSONString(result);
    
            return jsonString;
        }
    }
    

    这样模拟器只初始化了一次,感觉能快一些了。

    不过又引入了一个新问题,模拟器是被共享了,并发的时候是会出问题的,这也难不倒我们,加个锁就行了

    public String dySign(@RequestParam("url") String url) {
            synchronized (this) {
                Map<String, String> result = instance.crack(url);
                String jsonString = JSON.toJSONString(result);
    
                return jsonString;
            }
        }
    

    完美收工,上鲜啤。

    三、总结

    可以通过application.properties自行修改服务的地址和端口, 目前我使用的结果是只改端口就行,ip地址就保持 0.0.0.0就可以了。

    开源程序的版本搭配也很重要,发现和最新代码不兼容的时候,可以研究下回退一两个版本。

    开箱可用,是大佬们努力的结果。不过我们不能只满足于开箱就用,大概原理还是要了解一下的。不然稍微定制下就抓瞎了。

    Unidbg-server编译成jar包,请参考 http://91fans.com.cn/post/unidbgone/

    ffshow.jpeg

    我们生来彷徨

    相关文章

      网友评论

          本文标题:Unidbg + Web = Unidbg-server 手把

          本文链接:https://www.haomeiwen.com/subject/jiewmltx.html