android脱壳记录

今天需要脱一个APP的壳,网上找了好多资料,发现脱壳这个东西还是比较复杂,如果完全自己弄,需要好多知识点。网上的教程,能不能拖也是看运气了,因为有版本不一样,效果也不一样。

 

参考资料:

https://www.jianshu.com/p/138c9de2c987

注意不要找错目录,开始因为我的不能脱壳,后面发现可以,注意脱壳可能多个dex,其中一个是360 dex,所以自己分析就知道了。通过这一点目前能脱应该是360免费用的加固,所以如果真的怕别人破解还是用收费的。

注意因为加固导致很多的application 被替换,所以注意全局替换,同时注意activity 里面有调用加了的com.stub.app(360的自己app类),所以要去掉,不然导致找不到这个method, 所以脱壳了还要不停的看报错日志,来分析什么情况,然后还要出自身APP的防御,所以破解感觉真是一个体力活。。。。

补充
后面发现Activity的OnCreate代码都被替换到so里面去了,我通过逻辑推测出来大概的逻辑,然后重写那部分逻辑,勉强能够运行达到我的目的,因为一般代码都会封装到函数里面去,所以自己也可以大概猜测出他的行文,一些第三方so的初始化,自己百度一下资料然后下载demo,然后自己去猜测实现就可以了,但不一定百分百可行,毕竟代码不可控制。

android 报毒解决思路

背景:

开发一些android程序如果出现报毒,怎么处理?(或多或少可能接触到)

原理:

通过报毒软件核心思路,无非是抓取特征值和行为分析,但这个android里面基本没有太多行为分析,因为杀毒软件没有具备这样的能力,每个anroid都是沙箱,每个都是隔离所以无法分析其中行为。所以基本都是分析特征值。

 

特征值:

1:AndroidManifest.xml(这个是重点哦)

2:实际代码模块

3:资源文件

处理:

因为APK可以通过代码模块进行加固,那么代码模块和资源文件其实无法获取特征值,那么通过加固就可以解决过掉2,3点,那么AndroidManifest.xml 怎么过呢?因为xml报毒无非就是字符串特征值,杀毒引擎无法提取关键字作为评判的标准,所以我们只要修改server或者activity的名字,达到过滤的规则即可,但记住修改名字不要在原来名字直接加字符,因为他们查找关键字可能只是strstr()而已,那么包含也是报毒的。
所以我一直觉得android杀毒软件其实没有太多作用,现在android 系统自身防止软件后台运行做的很好了,如果一个新的所谓的病毒运行在你的手机,你只要一键清理(每个有给开机启动或者给APP加锁的功能,基本病毒APP就不能运行,所以现在的杀毒软件干的就是清理垃圾和拦截通知等弱鸡功能而已),自己多多练练手就可以了。

资源报毒:

常见就是图片,通过图片Md5修改工具,进行批量的修改即可。

 

自动解决报毒方案思路:

xml动态自己随机名字,后台定时打各种APK,用户下载时候随机下载一个包即可,这样子主要代码要跑起来的话,需要具备一定语法的替换,容易出现替换错误的情况。

android沙箱之路1-核心技术点

##classloader 的hook
没有hook classloader 没法生成对应的实体
##这个过程过掉android 对Activity 在 AndroidMainifest.xml 没有注册Activity验证
1:hook ActivityManager 服务,当ta StartActivity替换插件的Activity
2:hook ActivityThread mHandler 替换成我们要启动插件
##资源hook
如果我们没有HOOK Context,那么资源也要hook
##Context Hook
这个必须分析整个Context 构造的过程
1:Activity Context
2: Service Context (基本和Activity Context)
3:App Context
这个是重点,因为android Context 特别重要,很多数据获取都和这个有关系,那么插件里面代码用到一些数据,如果没有hook到就会崩溃
##文件路径HOOK
因为插件改变了路径,如果还是原来路径就会有问题
##APK包的解析
因为我们要知道APK的所有的入口和包名。
本质不管Activity service都java 里面的类,我们只要反射生成对应的就和我们自己代码差不多少。
所以我们可以用调用APK的包的代码,我们可用DexClassLoader加载代码
这篇文章应该持续更新,慢慢在自己下班时间写一个android 沙箱工具。MyDroidPlugin 准备这个名字来命名自己的工程, 感谢DroidPlugin 开源能够引流整个技术,带来很多很多有意思的产品,虽然android 不这么认为,但起码多开程序带来很多方便。

android 7.0 辅助服务部分节点不能点击问题

网上介绍文章:

https://blog.csdn.net/qq_24641847/article/details/77683826?locationNum=3&fps=1

自己在写一个项目的时候,发现7.0 和 6.0 的有差别,同样的代码6.0 能点击但到了7.0就不能点击。

知乎看到了:

(1)这个问题不是android 7的问题,AccessibilityService 可监听 点击事件,但通过ontouch实现的点击事件,是获取不到的。

(2)微信包括淘宝,一些重要的点击功能 不想让AccessibilityService监听到,就通过ontouch实现了,避免一些人搞灰色应用。

(3)这时候还想获取的话,需要root再通过app_process即可实现点击,这个方式比较更稳定,如果实现了,扩展比较强。我刚好做完了,可用。

(4)AccessibilityService 个人觉得功能很有限,所以需要一些辅助手段来完善

应该不是2点导致,因为同样代码在同一个版本的APP在不同操作系统却效果不一样,可能是还是系统版本导致的吧。

然后我就找到上面链接文章,那个文章说明,7.0 android系统引入新的api:

boolean dispatchGesture (GestureDescription gesture, AccessibilityService.GestureResultCallback callback, Handler handler)

这个API就强大,可以在非ROOT实现模拟手势,那么就可以模拟点击,滑动。只能说66666。那么7.0 手机可以实现非ROOT实现远程控制,那么teamview ,向日葵应该会使用该技术吧,因为以前模拟点击都是需要ROOT。

 

我的测试点击代码:

Log.d(TAG, "printTree: bound:" + rect);
Point position = new Point(rect.left+10, rect.top + 10);
GestureDescription.Builder builder = new GestureDescription.Builder();
Path p = new Path();
p.moveTo(position.x, position.y);
builder.addStroke(new GestureDescription.StrokeDescription(p, 0L, 100L));
GestureDescription gesture = builder.build();
boolean isDispatched = dispatchGesture(gesture, new GestureResultCallback() {
    @Override
    public void onCompleted(GestureDescription gestureDescription) {
        super.onCompleted(gestureDescription);
        Log.d(TAG, "onCompleted: 完成..........");
    }

    @Override
    public void onCancelled(GestureDescription gestureDescription) {
        super.onCancelled(gestureDescription);
        Log.d(TAG, "onCompleted: 取消..........");
    }
}, null);