首页
社区
课程
招聘
[求助]android 下的hook
发表于: 2012-6-7 17:34 21301

[求助]android 下的hook

2012-6-7 17:34
21301
最近看apk程序,经常看到这个文件:SmaliHook.java,里面有这个方法可疑:public static Object invokeHook(Method paramMethod, Object paramObject, Object[] paramArrayOfObject),想问下,它是干什么的,android下的方法hook么,给一个方法名,调用时执行自己的方法,做自己的事??

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
你这么牛X都不懂,偶们更不懂
2012-6-7 17:43
0
雪    币: 110
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
求文件 求样本
2012-6-7 19:03
0
雪    币: 2307
活跃值: (988)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
是的,这是AntiLVL提供的通过HOOK过掉安卓LVL(License Verification Library)完美解决方案,对签名、包名、设备ID进行过滤欺骗达到完美破解的目的!
2012-6-7 20:36
0
雪    币: 166
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非虫大神,能否给出详细的说明?
2012-6-8 08:39
0
雪    币: 632
活跃值: (93)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
SmaliHook文件源码

-----------------------------
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.util.Log;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class SmaliHook extends Activity
{
  private static boolean DEBUG = false;
  private static boolean DUMP_STACK = false;
  private static String LOG_TAG = "lohan";

  public static void DumpStackIfWeShould()
  {
    if (!DUMP_STACK)
      return;
    StackTraceElement[] arrayOfStackTraceElement = Thread.currentThread().getStackTrace();
    String str = "Stack trace:\n";
    for (int i = 4; ; i++)
    {
      if (i >= arrayOfStackTraceElement.length)
      {
        Log.d(LOG_TAG, str);
        break;
      }
      str = str + "  " + arrayOfStackTraceElement[i].toString() + "\n";
    }
  }

  public static int checkSignatures()
  {
    if (DEBUG)
      Log.d(LOG_TAG, "checkSignatures returning true");
    DumpStackIfWeShould();
    return 0;
  }

  public static int checkSignatures(String paramString1, String paramString2)
  {
    if (DEBUG)
      Log.d(LOG_TAG, "checkSignatures returning true");
    DumpStackIfWeShould();
    return 0;
  }

  public static int getApplicationEnabledSetting(PackageManager paramPackageManager, String paramString)
  {
    try
    {
      int j = paramPackageManager.getApplicationEnabledSetting(paramString);
      i = j;
      if (i == 2)
        i = 0;
      if (DEBUG)
        Log.d(LOG_TAG, "enabledSetting returning " + i);
      DumpStackIfWeShould();
      return i;
    }
    catch (IllegalArgumentException localIllegalArgumentException)
    {
      while (true)
        int i = 0;
    }
  }

  public static String getInstallerPackageName(String paramString)
  {
    if (DEBUG)
      Log.d(LOG_TAG, "getInstallerPackageName returning " + "com.google.android.feedback");
    DumpStackIfWeShould();
    return "com.google.android.feedback";
  }

  public static PackageInfo getPackageInfo(PackageManager paramPackageManager, String paramString, int paramInt)
    throws PackageManager.NameNotFoundException
  {
    try
    {
      PackageInfo localPackageInfo2 = paramPackageManager.getPackageInfo(paramString, paramInt);
      localPackageInfo1 = localPackageInfo2;
      if ((paramInt & 0x40) == 64)
      {
        arrayOfSignature = spoofSignatures();
        i = 0;
        if (i >= localPackageInfo1.signatures.length)
        {
          if (DEBUG)
            Log.d(LOG_TAG, "spoofing signatures for " + paramString);
          DumpStackIfWeShould();
        }
      }
      else
      {
        return localPackageInfo1;
      }
    }
    catch (PackageManager.NameNotFoundException localNameNotFoundException)
    {
      while (true)
      {
        Signature[] arrayOfSignature;
        int i;
        if ((!paramString.toLowerCase().contains("pro")) && (!paramString.toLowerCase().contains("full")) && (!paramString.toLowerCase().contains("donate")) && (!paramString.toLowerCase().endsWith("key")))
          throw new PackageManager.NameNotFoundException();
        PackageInfo localPackageInfo1 = paramPackageManager.getPackageInfo("com.sp.protector", paramInt);
        continue;
        localPackageInfo1.signatures[i] = arrayOfSignature[i];
        i++;
      }
    }
  }

  public static Object invokeHook(Method paramMethod, Object paramObject, Object[] paramArrayOfObject)
    throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, PackageManager.NameNotFoundException
  {
    String str1 = paramMethod.getName();
    String str2;
    String str3;
    int k;
    Object localObject3;
    label72: Object localObject5;
    if (paramObject != null)
    {
      str2 = paramObject.getClass().getName();
      if (DEBUG)
      {
        str3 = "Invoke Hook: " + str2 + "." + str1 + "(";
        if (paramArrayOfObject == null)
          break label572;
        int j = paramArrayOfObject.length;
        k = 0;
        localObject3 = "";
        if (k < j)
          break label182;
        if (((String)localObject3).length() <= 2)
          break label565;
        localObject5 = ((String)localObject3).substring(0, ((String)localObject3).length() - 2);
      }
    }
    label103: for (String str4 = str3 + (String)localObject5; ; str4 = str3)
    {
      Log.d(LOG_TAG, str4 + ")");
      DumpStackIfWeShould();
      Object localObject1;
      if (1 == 0)
        localObject1 = paramMethod.invoke(paramObject, paramArrayOfObject);
      while (true)
      {
        return localObject1;
        str2 = paramMethod.getDeclaringClass().getName();
        break;
        Object localObject4 = paramArrayOfObject[k];
        String str5 = localObject3 + localObject4.getClass().getName() + ":" + localObject4 + ", ";
        k++;
        localObject3 = str5;
        break label72;
        if ((str2.equals("android.app.ContextImpl$ApplicationPackageManager")) || (str2.equals("android.app.ApplicationContext$ApplicationPackageManager")) || (str2.equals("android.content.pm.PackageManager")) || (str2.contains("ApplicationPackageManager")))
        {
          if (str1.equals("getInstallerPackageName"))
          {
            localObject1 = getInstallerPackageName((String)paramArrayOfObject[0]);
            continue;
          }
          if (str1.equals("getPackageInfo"))
          {
            int i = ((Integer)paramArrayOfObject[1]).intValue();
            if (str2.equals("android.content.pm.PackageManager"))
            {
              localObject1 = getPackageInfo((PackageManager)paramObject, (String)paramArrayOfObject[0], i);
              continue;
            }
            try
            {
              Object localObject2 = paramMethod.invoke(paramObject, paramArrayOfObject);
              localObject1 = localObject2;
              if ((i & 0x40) != 64)
                continue;
              Signature[] arrayOfSignature = spoofSignatures();
              ((PackageInfo)localObject1).signatures[0] = arrayOfSignature[0];
            }
            catch (Exception localException)
            {
              while (true)
              {
                Object[] arrayOfObject = new Object[1];
                arrayOfObject[0] = "com.sp.protector";
                localObject1 = paramMethod.invoke(paramObject, arrayOfObject);
              }
            }
          }
          if (str1.equals("getApplicationEnabledSetting"))
          {
            localObject1 = Integer.valueOf(getApplicationEnabledSetting((PackageManager)paramObject, (String)paramArrayOfObject[0]));
            continue;
          }
          if (str1.equals("checkSignatures"))
          {
            localObject1 = Integer.valueOf(checkSignatures((String)paramArrayOfObject[0], (String)paramArrayOfObject[1]));
            continue;
          }
        }
        else if ((str2.equals("java.io.File")) && (shouldSpoofFileInfo((File)paramObject)))
        {
          if (str1.equals("length"))
          {
            localObject1 = Long.valueOf(length((File)paramObject));
            continue;
          }
          if (str1.equals("lastModified"))
          {
            localObject1 = Long.valueOf(lastModified((File)paramObject));
            continue;
          }
        }
        localObject1 = paramMethod.invoke(paramObject, paramArrayOfObject);
      }
      localObject5 = localObject3;
      break label103;
    }
  }

  public static long lastModified(File paramFile)
  {
    long l = Long.parseLong("1297973242171");
    if (DUMP_STACK)
      Thread.dumpStack();
    if (!shouldSpoofFileInfo(paramFile))
    {
      l = paramFile.lastModified();
      if (DEBUG)
        Log.d(LOG_TAG, "spoofing file modified of " + paramFile.getName() + " with " + l);
      DumpStackIfWeShould();
    }
    return l;
  }

  public static long length(File paramFile)
  {
    long l = Long.parseLong("353384");
    if (!shouldSpoofFileInfo(paramFile))
    {
      l = paramFile.length();
      if (DEBUG)
        Log.d(LOG_TAG, "spoofing file length of " + paramFile.getName() + " with " + l);
      DumpStackIfWeShould();
    }
    return l;
  }

  private static boolean shouldSpoofFileInfo(File paramFile)
  {
    int i = 0;
    if (paramFile.exists())
      i = 0;
    if (paramFile.getName().contains("com.sp.protector"))
      i = 1;
    return i;
  }

  public static Signature[] spoofSignatures()
  {
    int i = Integer.parseInt("55");
    Signature[] arrayOfSignature = new Signature[i];
    for (int j = 0; ; j++)
    {
      if (j >= i)
        return arrayOfSignature;
      arrayOfSignature[j] = new Signature("308201e930820152a00302010202044c7b6c58300d06092a864886f70d01010505003038310b3009060355040613026b6f3110300e06035504071307496e6368656f6e311730150603550403130e596f756e672d48616b204a756e673020170d3130303833303038333132305a180f32303630303831373038333132305a3038310b3009060355040613026b6f3110300e06035504071307496e6368656f6e311730150603550403130e596f756e672d48616b204a756e6730819f300d06092a864886f70d010101050003818d0030818902818100866ee8f701db04c2ff4272f837280cab955bce9fa87e4f6b7040f58cf94e83235080013093d121be49a7abab8eee67bba6770c9a50d5648aecca5f82f9ba5b1b409968e02976873efe6fb6a8c8494972d4da5fe80e2102a780353a11807df9979a88a292d51cf5ad80df344f79470235bb1ed782e94d9877d73d54c9638bf5290203010001300d06092a864886f70d01010505000381810031dc83cbcc282afb27df81dcca9b91fcf6fcb63f72325bf71dd82429644537f0ef6b3b3b769bf1967ff14cc782991df01d6bcebbfeba2a6ba058334d44af31fdb0ab2635496a319b86210a43ad9dc9ac4de2ccb57f2b4f770fb97219f264020328763fd1840b528966c4f3c7c74fc62a98a8db2938da8c0844d3933328af9ede");
    }
  }
}
2012-6-8 09:28
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还是搞不懂!!!
2012-7-14 00:49
0
雪    币: 4
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
持续关注......
2012-9-12 15:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
持续关注中...
2012-9-18 17:36
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
http://androidcracking.blogspot.com/p/antilvl_01.html
2012-9-19 05:12
0
雪    币: 227
活跃值: (120)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
11
nice
LS起的好早啊
2012-9-19 10:12
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
关注下。。。。。。。。。。。。。。。。。。。。。。。。
2012-9-19 18:45
0
雪    币: 298
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
要爬墙耶~~~thx
2013-2-1 12:27
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
持续关注,好像真的要爬墙才行哦
2013-2-4 12:40
0
游客
登录 | 注册 方可回帖
返回
//