爆肝+熬夜,终于把so用unidbg跑起来了,总不能放在硬盘里发霉吧。咱们得在生成环境下用起来。java
最方便的方式就是租台云服务器,而后把Unidbg部署上去,就能够给咱们的工做者程序提供云签名服务了。python
玩Unidbg还得是java老艺术家才行,cxapython大佬提供了一个springboot运行unidbg的方案:android
git clone 下来,而后导入到ideagithub
而后、编译、运行......web
ffMac:unidbgweb fenfei$ python3 send.py
{'X-Khronos': '1627183488', 'X-Gorgon': '0401007008006c494547b54e36413a81b1a8118d238f2dffd9b3'}
复制代码
跑一下做者提供的例子spring
我去,一套行云流水,顺利跑通。如今作开源的大佬都这么拼了? 简直开箱即用。json
咱们只下载了Unidbg-server的代码,并无下载Unidbg的代码?为啥直接就能跑起来?api
奥秘在pom.xml里面,加载了线上的unidbg模块,因此能够直接跑起来。安全
经过前面的学习,咱们对Unidbg已经有必定的熟悉了,因此可能维护了一份定制的修改。这样问题就来了,可不能够不加载线上的Unidbg的代码,而加载咱们本机修改过的版本?
首先把咱们定制版的unidbg编译成jar包,参考 91fans.com.cn/post/unidbg…
在 Unidbg-server工程的根目录下(和pom.xml同级目录)新建 libs 目录
把定制版的unidbg编译生成的一堆jar包拷进去
// 删除这两个段, 不使用线上的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包,请参考 91fans.com.cn/post/unidbg…
咱们生来彷徨
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,若是有人利用本文技术去进行非法商业获取利益带来的法律责任都是操做者本身承担,和本文以及做者不要紧,本文涉及到的代码项目能够去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一块儿学习探讨技术。有问题能够加我wx: fenfei331 讨论下。
关注微信公众号: 奋飞安全,最新技术干货实时推送