首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用soot进行Android意图分析

使用soot进行Android意图分析
EN

Stack Overflow用户
提问于 2016-10-04 19:30:29
回答 1查看 446关注 0票数 0

我需要分析各种android apks,找到执行意图的方法,然后获得意图的操作名称,如"ACTION_VIEW“等。

我能够检索所有相关的方法,如startActivity()、startActivityForResult()和onCreate()。但我无法在相应的局部变量(意图引用)中获取操作名称或常量。是否可以以某种方式将Intent.java类加载到场景中(添加为基类是否已经可以做到这一点?)然后将Local转换为Intent对象?或者你能推荐我一种完全不同的使用soot的方法吗?

下面是我当前自定义烟灰类的列表:

代码语言:javascript
复制
Options.v().set_src_prec(Options.src_prec_apk);
Options.v().set_whole_program(true);
Options.v().set_output_format(Options.output_format_none);

Scene.v().addBasicClass("java.lang.Object");          
Scene.v().addBasicClass("android.content.Intent");

    PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new BodyTransformer() {

        @Override
        protected void internalTransform(Body b, String phaseName, Map options) {
            final PatchingChain<Unit> units = b.getUnits();

            //important to use snapshotIterator here
            for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) {
                final Unit u = iter.next();
                u.apply(new AbstractStmtSwitch() {

                    // getting invoke statements
                    public void caseInvokeStmt(InvokeStmt stmt) {
                        InvokeExpr invokeExpr = stmt.getInvokeExpr();
                        // getting intent respective methods
                        if(invokeExpr.getMethod().getName().equals("onCreate") ||
                                invokeExpr.getMethod().getName().equals("startActivity") ||
                                invokeExpr.getMethod().getName().equals("startActivityForResult")) {

                            System.out.println(invokeExpr.getMethod().getSignature());

                            // get value 0, always an Intent in those methods
                            Value val = invokeExpr.getArg(0); // references Intent
                            if(val.getType() instanceof RefType) {
                                RefType rt = (RefType) val.getType();

                                // Cast to android.content.Intent here..
                                // Intent in = (Intent) val;

                                System.out.println(rt.getClassName());
                            }       
                        }   
                    }
                });
            }
        }
    }));

对于一些示例apk,输出以下内容:

代码语言:javascript
复制
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void startActivityForResult(android.content.Intent,int)>
android.content.Intent
<android.app.Activity: void onCreate(android.os.Bundle)>
android.os.Bundle
<android.content.Context: void startActivity(android.content.Intent)>
android.content.Intent
EN

回答 1

Stack Overflow用户

发布于 2017-06-14 04:08:54

您必须考虑到Soot对目标进行“静态”分析。这意味着作为参数传递的实际值不能(简单地)访问。您的代码打印参数的“类型”(类android.content.Intent)。原因是Java (Dalvik或ART)字节码是类型化的。因此,这些信息是静态可用的。据我所知,如果您想检索实际值,您有两种方法:切换到动态分析(例如,您可以在测试期间检测调用并打印其参数)或执行数据流分析。第二种方法可能非常复杂,可扩展性也很差。您可能希望了解一下基于程序切片的技术或抽象解释框架。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39851132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档