首页
社区
课程
招聘
[原创]360安全招聘_无线攻防第二题
发表于: 2014-5-14 17:47 22261

[原创]360安全招聘_无线攻防第二题

2014-5-14 17:47
22261
刚刚看到有兄弟发了第一题的,我来发个第二题先。第一次玩

题目要求
-------------
1.请以重打包的形式将qihootest2.apk的程序包名改为 "com.qihoo.crack.StubApplication",使得在同一手机上面可以重复安装并正确运行;
2.请写个Application类,并在Manifest里面注册你的Application。同时要求使用该Application加载原包的Application;
3.本题3分,以非重打包的方式达到同等效果的不计分。
-------------
题还是很简单的,简单提提就好了
1)改包名:
改包名,简单吧,
   1.Manifest : package ,application name,provider 要改
   2.smail
       a) smail 里面的目录 test -> crack.
       b) smail 文件批量替换 com/qihoo/test/ - > com/qihoo/crack
   3.so
       这个程序有个so里面硬编码了包名,如果目标包名长度短点的话,直接改so就好了,但是他要求改成crack.
       我的办法是: 不改so . 写个stub类 com.qihoo.test.MainActivity
----------
            android.app.Activity
                         ^
                         |
         com.qihoo.test.MainActivity
                         ^
                         |
        com.qihoo.crack.MainActivity
-------------
native 方法还是放在 com.qihoo.test.MainActivity中
如下:
com.qihoo.test.MainActivity:
.class public Lcom/qihoo/test/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"


# direct methods
.method static constructor <clinit>()V
    .locals 1

    .prologue
    .line 12
    const-string v0, "qihooTest"

    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

    .line 13
    return-void
.end method

.method public constructor <init>()V
    .locals 0

    .prologue
    .line 10
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method




.method public native applicatioNameCheck()V
.end method


.method public native packageNameCheck()V
.end method


com.qihoo.crack.MainActivity:
.class public Lcom/qihoo/crack/MainActivity;
.super Lcom/qihoo/test/MainActivity;
.source "MainActivity.java"


# instance fields
.field private app:Lcom/qihoo/crack/StubApplication;

........................
........................

这就差不多了

2)写个Application

那就写个呗。

.class public Lcom/qihoo/crack/XiaoApplication;
.super Landroid/app/Application;
.source "XiaoApplication.java"


# instance fields
.field private stubapp:Lcom/qihoo/crack/StubApplication;


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 5
    invoke-direct {p0}, Landroid/app/Application;-><init>()V

    return-void
.end method



.method public onCreate()V
    .locals 1

    .prologue
    .line 14
    invoke-super {p0}, Landroid/app/Application;->onCreate()V 
    new-instance v0, Lcom/qihoo/crack/StubApplication;
    invoke-direct {v0}, Lcom/qihoo/crack/StubApplication;-><init>()V
    iput-object v0,p0, Lcom/qihoo/crack/XiaoApplication;->stubapp:Lcom/qihoo/crack/StubApplication;
    invoke-virtual {v0}, Lcom/qihoo/crack/StubApplication;->getvalue()[I
    move-result-object v0

    .line 15
    return-void
.end method

.method public onLowMemory()V
    .locals 0

    .prologue
    .line 25
    invoke-super {p0}, Landroid/app/Application;->onLowMemory()V

    .line 26
    return-void
.end method

.method public onTerminate()V
    .locals 0

    .prologue
    .line 32
    invoke-super {p0}, Landroid/app/Application;->onTerminate()V

    .line 33
    return-void
.end method



完。

大家也来讨论下自己的思路。
下面请大家畅所欲言.

更新:
-------------
1) 5/14 21:22 添加rebuild apk
-------------

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
占沙发,支持
2014-5-14 17:48
0
雪    币: 35
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持一个!
2014-5-14 18:02
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
4
楼主,能贴一下你的测试样图吗?
2014-5-14 18:51
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
什么图,运行截屏么?
2014-5-14 19:32
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
第三题一运行就崩了~
2014-5-14 21:21
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
楼主改Application不彻底,很多地方能发现Application不是原来的
2014-5-14 21:24
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
第三题待有空点了再整理下,
关于你说的第三题运行崩溃的问题,出题人更新了附件
http://aqkg6ljr44.l14.yunpan.cn/lk/QNNLZInYrxyjZ

happy crack ^-^
2014-5-14 21:26
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩,Application 本来就不是原来的啊,题目好像没其他要求吧
方便说说你的想法么,多谢斧正。
2014-5-14 21:30
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
我也是第一次玩android的修改,当时参考了
http://blogs.360.cn/blog/proxydelegate-application/
替换API层的所有Application引用
baseContext.mOuterContext
baseContext.mPackageInfo.mApplication
baseContext.mPackageInfo.mActivityThread.mInitialApplication
baseContext.mPackageInfo.mActivityThread.mAllApplications
2014-5-14 22:37
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
时间都快结束了才更新,囧~
我当时纠结在崩溃问题很久~
2014-5-14 22:39
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
力挺360,免费进行到底
2014-5-14 22:56
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
13
楼主,你这样修改貌似有问题。 我试了一下你修改的apk,有错误,找不到native方法,报NULL指针。

我当时做第一小问也是这个思路,不过不行。后面我换另一种方式来实现的。
第二小问我也是按照: 正happy 这位兄弟给出的那篇360的博文思路实现的。最后我得到的测试结果是:
上传的附件:
2014-5-14 23:01
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
14
这位兄弟,第三题你做出来了吧,来发一贴吧。
2014-5-14 23:02
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这文看见过,不过我果断按照最简单的理解做了这个题,
2014-5-14 23:22
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这。。这个在我手机上确实是可以运行的啊,现在还在装着呢,截了半天图没截下Toast。
另,可不可以说下你第一问的解决办法。

--
Android 4.2 Samsung 没问题,
找了个 2.3 miui 试了下,死了。,,
----

第二问我确实是考虑简单了,我这样做没什么意义 可以怪题目没描述清除么

^-^
2014-5-14 23:26
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
延长了时间的
关于崩溃的问题,我觉得应该是动了手脚的吧。
.init_array 里面的函数引用了后面算se会用的的一个函数把 .lfxtext 段的代码给处理了下。

所以加载后 verify JNI_OnLoad 的代码已经面目全非了,只要处理掉这里就能起来了。
^-^
2014-5-14 23:32
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我做的也没完善,况且也是硬着头皮写出来的,怕发出来丢人,等我整理整理。
2014-5-14 23:34
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
19
隔几天,找个空闲时间,把东西好好整理后再写出来。
--------------------------------------------------------------------------------
第一小问思路:反编译APK之后,直接查找替换,更改所有文件的包名以及文件夹的目录结构。这里关键是要处理jni调用。JNI分为静态注册和动态注册。若采用静态注册,那么native方法名一定是:Java_包名__fun();动态注册,则在Register方法中。不管是哪种方式,包名一定要正确。
在MainActivity.smali文件中,可以看到如下两个native方法的声明。
.method private native applicatioNameCheck()V
.end method

.method private native packageNameCheck()V
.end method
(以packageNameCheck为例子)如果采用静态注册,那么更改包名后,静态注册函数名变为:Java_com_qihoo_crack_StubApplication_packageNameCheck,而原来.so库文件函数名是:Java_com_qihoo_test_packageNameCheck,直接使用原来的.so文件,肯定找不到。(这里说得有点罗嗦,望不喷)

使用nm查看.so文件,发现apk是动态注册native方法的。

当时做题的时候,开始思路和楼主一样,想通过保留原来的包,删减MainActiviy类,保留native方法。然后在更改包后的MainActiviy中new一个对象并调用native方法即可。理论上分析是可行的,其实是可行的!!!(顺便更正下前面的回复,这种方法是可行的,不好意思)刚做了实验,不管是静态还是动态,都是可行的。(我仔细查看了我以前修改的代码,发现犯了一个错误,在修改后的MainActivity中没有删除native方法的声明,调用时也调用错了,故出现了NULL错误).

后面,我采用另外一种方法:通过自己创建一个与修改后的包名想对应.so文件,再在这个.so文件去调用原来的.so文件中的这两个native函数。

自建.so文件关键代码(packageNameCheck为例子):
        void*  filehandle = dlopen("/data/data/com.qihoo.crack.stubapplication/lib/libqihooTest.so", RTLD_LAZY );
        if(filehandle)
        {
                void (*packageNameCheck)(JNIEnv *,jobject);
                packageNameCheck = (void (*)(JNIEnv *,jobject)) dlsym(filehandle, "packageNameCheck"); //找到.so文件中的函数
                if(packageNameCheck)
                {
                        packageNameCheck(env, obj); //传递参数调用
                        return ;
                }
                else
                {
                        LOGI("packageNameCheck is null");
                }
        }
Android.mk文件编写:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := qihooTest
LOCAL_SRC_FILES := libqihooTest.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= CallqihooTest.c
LOCAL_C_INCLUDES := /$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_LDLIBS := -L . -ldl -llog
LOCAL_MODULE := CallqihooTest
include $(BUILD_SHARED_LIBRARY)

再修改MainActivity.smali文件中加载的.so文件名即可实现第一小问的要求,修改代码很少,就不附上来了吧。

第二小问:
直接参看: http://blogs.360.cn/blog/proxydelegate-application/ ,把博客中略过的东西补全即可实现。
最后测试结果已经在前面的回帖中贴出,这里就不贴了。
2014-5-14 23:55
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
第一问我是直接patch的so,理论上你的方式是可以的,利用继承关系。

第三题,汇编指令版本是V5的,坑
2014-5-15 09:12
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
请教 这个程序有个so里面硬编码了包名,直接改so里的包名  用什么方法或者什么工具 ?                                 我问这个问题和楼主给的题目没什么关系,大家勿喷 ,想知道怎么修改so里面的内容 ,然后生成新的so
2014-5-15 23:46
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
挺好的办法,给个赞
2014-5-16 13:45
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
同求。。。。
2014-5-16 13:46
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
24
弱弱问下,楼主参加比赛的昵称是:xiao 吗?
2014-5-16 14:34
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
其实这题,改包名只是一小部分。真正重要的是要用新application去加载原包application。这里不能直接new一个,然后oncreate的。那样没有生命周期的
2014-5-16 20:22
0
游客
登录 | 注册 方可回帖
返回
//