(4.2.33.1)Android上玩玩Hook(2):Cydia Substrate演练

选自:

  1. 跟着鬼哥学android java hook(二)
  2. 简单android病毒分析并实现其效果

插桩的概念是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改;
而hook则不需要再编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种动态的篡改

根据上文的内容,我们基本可以总结出Cydia Substrate的使用步骤,在本章节继续做一些演练

Cydia Substrate的使用一般步骤

  1. AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
  2. 获取欲勾的第三方包的类名
  3. 主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口
  4. 安装测试

实战演练c:金额修改——勾他人应用

http://pan.baidu.com/s/1c27c1EC

在本环节,我们创建一个as工程,而后用hook去修改他的值,主要是修改正常软件中方法的返回值

  • 正常程序

代码很简单,模拟一般游戏的get方法,返回一个int类型的数据,一般用来当作游戏中的金币数量。

然后在onCreate中调用这个方法:

在调用方法前后,对数据都有打印,这样我们就可以很方便的查看数据是否改变了。

package com.example.testhook;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        System.out.println("开始执行了");


        int bb=getMoney();

        System.out.println("现在是新版本的aa为-->"+bb); 


    }



    public int getMoney(){

        int aa=10;

        System.out.println("这里还是初始化的aa为-->"+aa);

        return aa;
    }
}

好了,测试工程基本就这样了,那么我们安装看一下log日志:

这里写图片描述

  1. AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
  2. 获取欲勾的第三方包的类名
    com.example.testhook.MainActivity
  3. 主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口
package com.example.cydiaexample;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

import android.util.Log;
import android.widget.Toast;

import com.saurik.substrate.MS;
import com.saurik.substrate.MS.ClassLoadHook;

//hook 方法

public class Main {

   public static void initialize() {

      //定义我们需要hook的类
      MS.hookClassLoad("com.example.testhook.MainActivity", new MS.ClassLoadHook() {

        @Override
        public void classLoaded(Class<?> arg0) {
            // TODO Auto-generated method stub

            //定义方法
            Method log;

            try { 
                //hook getMoney的方法
                log=arg0.getMethod("getMoney", null);

            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                log=null;
                e.printStackTrace();
            }

            if(log!=null){

                final MS.MethodPointer old = new MS.MethodPointer();

                MS.hookMethod(arg0, log, new MS.MethodHook() {

                    @Override
                    public Object invoked(Object arg0, Object... arg1)
                            throws Throwable {
                        // TODO Auto-generated method stub

                        System.out.println("i am in---------->");

                        System.out.println("i am going to fuck ---->");

                        //调用原getMoney方法,将原方法的返回值放到aa中
                        int aa=(Integer) old.invoke(arg0, arg1);

                        //修改aa为999999,即原方法返回值已经修改掉了
                        aa=9999999;

                        //返回aa
                        return aa;
                    }

                },old);

            }


        }
    });


   }
}
  1. 安装测试
    这里写图片描述

实战演练d: 简单android病毒分析并实现其效果——修改系统api

今天在群里看到大家发的一个链接,一个病毒的显示方式,挺好玩的,模仿写了下。http://mt.sohu.com/20150517/n413220620.shtml?qq-pf-to=pcqq.c2c

这里写图片描述

  • AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
  • 获取欲勾的第三方包的类名根据截图来看,主要也就是文字方面的更改,那么我们可以直接考虑Android中如何给TextView进行赋值的操作。TextView.setText(CharSequence)
    android.widget.TextView

  • 主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口

public class Main {  

      public static void initialize() {  


          MS.hookClassLoad("android.widget.TextView", new MS.ClassLoadHook() {  

            @Override  
            public void classLoaded(Class<?> arg0) {  
                // TODO Auto-generated method stub  

                Method smstest ;  

                try {     

                    smstest=arg0.getMethod("setText", CharSequence.class);  

                } catch (SecurityException e) {  
                    // TODO Auto-generated catch block  
                    smstest=null;  
                    e.printStackTrace();  
                } catch (NoSuchMethodException e) {  
                    // TODO Auto-generated catch block   
                    smstest=null;  
                    e.printStackTrace();   
                }  

                if(smstest!=null){        

                    final MS.MethodPointer old = new MS.MethodPointer();  

                    MS.hookMethod(arg0, smstest, new MS.MethodHook() {  

                        @Override  
                        public Object invoked(Object arg0, Object... arg1)  
                                throws Throwable {        
                            // TODO Auto-generated method stub    

                            Log.d("ggz","i am hook in------->");  

                            String bb=(String)arg1[0];  

                            Log.d("ggz","string is----->"+bb);         

                            bb="爱破解,爱鬼哥";  

                            Log.d("ggz","now string is --->"+bb);  

                            return old.invoke(arg0, bb);                                      

                        }  

                    }, old);   

                }  

            }       

      });  

      }  



}  
  • 安装测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值