工具:IDA6.6,不会发图,只能用文字描述了。

研究过《遇见》登录的同学可能都知道,只要修改过APK,在登录时都会提示软件盗版。

经研究登录时safecode字段有问题,可能是验证了签名。在libiaroundnet.so中Java_net_iaround_utils_NativeLibUtil_aaa实现。

步骤1:下载  http://gdown.baidu.com/data/wisegame...yujian_570.apk

将yujian_570.apk改名为yujian_570.zip,将lib目录下的lib\armeabi\libiaroundnet.so提取出来拖入IDA中。

步骤2:

拖进来后发现SHA1Input,SHA1Output这样带有SHA1的函数,断定SO中用到了SHA1加密算法。

步骤3:

查看Java_net_iaround_utils_NativeLibUtil_aaa函数按F5出来C的伪代码,此时代码还不易读懂,不如像“v9 = (*(int (**)(void))(v8 + 124))()”,这样的代码。但是看到这个我们是不是应该想到C++里面的内存的寻址?,成员变量的首地址=对象的首地址+成员变量在类中的偏移.

假如

Struct node

{

int,x,y;

};

node a;如果A的首地址是0x00000000,那么a.x的地址是0x00000000,a.y的地址是0x00000004;

由C伪代码我们不难得出:v8是JNIEnv *类型,查看jni.h并计算我们不难发现v8 + 124是GetObjectClass函数指针,同理我们可以计算出其他类似的调用。

步骤4:

有了步骤三的基础,我们可以想到一个简便的方法就是导入jni.h,从而确定JNIEnv类的结构,借助IDA直接识别函数。下载jni.h(虫大大书上修改JNI.H的方法貌似不好使,我自己改了个):http://pan.baidu.com/s/1sj3EaTn,然后File->Load File->parse C header file... 选择下载好的jni.h确定。然后在structures页面里按下insert键

->add standard structure->滑到最下方选择"JNIEnv_",然后确定。

步骤5:

返回伪代码界面,鼠标点击Java_net_iaround_utils_NativeLibUtil_aaa的第一个参数,右键->convert to struct*->选择jnienv_*,这时,伪代码中不明函数的调用已经出来。

刚刚的(*(int (**)(void))(v8 + 124))()已经变成 ((int (*)(void))v8->GetObjectClass)();

这时只要仔细阅读伪代码就知道该函数做了啥,逆向的C代码为:

代码:

JNIEXPORT jstring JNICALL Java_net_iaround_utils_NativeLibUtil_aaa(JNIEnv *env, jobject ob, jobject paramContext, jobject paramPackageInfo, jstring paramString1, jstring paramString2){  SHA1Context context;  jstring ret=0;  JNIEnv* p_env=env;  char cifferbuf[128]={0};  char buf[64]={0};  jclass obClass=env->GetObjectClass(ob);  char *pString="()Ljava/lang/String;";  jmethodID  reusltID=p_env->GetMethodID(obClass,"getPackageName","()Ljava/lang/String;");  jobject retObject=p_env->CallObjectMethod(paramContext,reusltID);  jboolean boolean=0;  const char *str=p_env->GetStringUTFChars((jstring)retObject,&boolean);  bool cmpResult=strcmp("net.iaround",str);  if(cmpResult==0)  {    ret=p_env->NewStringUTF("123456");  }  else  {    char destBuffer[128]={0};    const char* s1=p_env->GetStringUTFChars(paramString1,&boolean);    const char *s2=p_env->GetStringUTFChars(paramString2,&boolean);    __android_log_print(4, "logfromc", "%s",s1);    __android_log_print(4, "logfromc", "%s",s2);    int len1=strlen(s1);    int len2=strlen(s2);    memcpy(destBuffer,s1,len1);    memcpy(destBuffer+len1,s2,len2);    jclass packageInfo= p_env->GetObjectClass(paramPackageInfo);    ret=(jstring)packageInfo;    if(packageInfo)    {      jfieldID signatures=p_env->GetFieldID(packageInfo,"signatures","[Landroid/content/pm/Signature;");      ret=(jstring)signatures;      if(signatures)      {        jobjectArray sigarray=(jobjectArray)p_env->GetObjectField(paramPackageInfo,signatures);        if(sigarray)        {          jsize sigLength=p_env->GetArrayLength(sigarray);          if(sigLength>0)          {            jobject ob=p_env->GetObjectArrayElement(sigarray,0);            if(ob)            {              jclass jc=p_env->GetObjectClass(ob);              if(jc)              {                jmethodID id=p_env->GetMethodID(jc,"toCharsString","()Ljava/lang/String;");                if(id)                {                  jstring sigString =(jstring)p_env->CallObjectMethod(ob,id);                  const char* sigStr=p_env->GetStringUTFChars(sigString,&boolean);                  int passLen=strlen(destBuffer);                  memcpy(cifferbuf,sigStr+16,32);                  //__android_log_print(4, "logfromc", "%s",sigStr+16);                  //memcpy(cifferbuf,"a00302010202044e549d3a300d06092a",32);                  memcpy(cifferbuf+32,destBuffer,passLen);                  __android_log_print(4, "logfromc", "cifferString:%s",cifferbuf);                  SHA1Reset(&context);                  int cifferlen=strlen(cifferbuf);                  SHA1Input(&context,cifferbuf,cifferlen);                  //memset(&v51, 48, 0x29u);                  memset(buf,0,sizeof(buf));                  if(SHA1Result(&context))                  {                    sprintf(buf, "%08X%08X%08X%08X%08X", context.Message_Digest[0],context.Message_Digest[1],                        context.Message_Digest[2],context.Message_Digest[3],context.Message_Digest[4]);                  }                  else                  {                    __android_log_print(4, "logfromc", "ERROR-- could not compute message digest\n");                  }                  ret=p_env->NewStringUTF(buf);                }              }            }          }        }      }    }  }  return ret;}

这时代码的意图就明显了

一句话概括就是:将签名中取出32位+paramString1+paramString2后用SHA1加密

如果中途出错,直接返回“123456”。。。

这时可以得出该APK包是利用了签名加密后到服务器验证的。服务器计算出safecode和收到的safecode不一样时,反馈软件盗版。。

此贴只供学习,如做其它用途,后果自负。

android 逆向so,逆向Android SO,以《遇见》App为例相关推荐

  1. 【Android 逆向】Android 逆向通用工具开发 ( Android 逆向通用工具组成部分 | 各模块间的关联 )

    文章目录 一.Android 逆向通用工具组成部分 二.Android 逆向通用工具 各模块间的关联 一.Android 逆向通用工具组成部分 Android 逆向通用工具 肯定是跨平台的 , 涉及到 ...

  2. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  3. android app逆向分析,如何开始对Android应用的逆向分析?

    本文是我的关于如何开始Android逆向系列文章的第一部分.在文末提供了一个文档,你可以根据该文档说明部署同我一样的实验环境. 在了解android应用的逆向之前,你必须对android平台及其架构和 ...

  4. Android逆向笔记-使用Android Studio调试Smali代码(方式二)

    这里我使用Android Studio写了这样的一个程序: 这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: ...

  5. android逆向分析有什么用,如何开始对Android应用的逆向分析?

    本文是我的关于如何开始Android逆向系列文章的第一部分.在文末提供了一个文档,你可以根据该文档说明部署同我一样的实验环境. 在了解android应用的逆向之前,你必须对android平台及其架构和 ...

  6. Android 渗透测试学习手册 第三章 Android 应用的逆向和审计

    第三章 Android 应用的逆向和审计 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的 ...

  7. android调用完自己写的app之后如何返回原来的android应用_App逆向篇 神器之 Frida...

    说到逆向APP,很多人首先想到的都是反编译,但是单看反编译出来的代码很难得知某个函数在被调用时所传入的参数和它返回的值,极大地增加了逆向时的复杂度,有没有什么办法可以方便地知道被传入的参数和返回值呢? ...

  8. 高版本Android真机逆向测试环境搭建

    高版本Android真机逆向测试环境搭建 618购入了新机Xiaomi K50,真滴便宜又好用,续航很强界面很丝滑.正好拿来做逆向测试机? 怎么可能!这也太奢侈了!不过淘汰的Xiaomi Note 7 ...

  9. Android 应用的逆向和审计

    Android 应用程序拆解 Android 应用程序是在开发应用程序时创建的数据和资源文件的归档文件. Android 应用程序的扩展名是.apk,意思是应用程序包,在大多数情况下包括以下文件和文件 ...

  10. Android软件安全与逆向分析下载电子书pdf下载

    Android软件安全与逆向分析下载链接: https://pan.baidu.com/s/1RB8tYECoGXwNh6_vlVV8sw 提取码获取方式:关注下面微信公众号,回复关键字: 1124

最新文章

  1. Bzoj1835:[ZJOI2010]基站选址
  2. shareinstall之Android SDK集成
  3. laravel框架集成PHPExcel讲解及demo
  4. Application Desktop Toolbars 桌面工具栏
  5. 集群(四)——haproxy日志
  6. Chrome、Firefox 浏览器常用设置及操作
  7. 在sublime text 3中让.vue文件的内容变成彩色
  8. 100个实用的 Linux Shell 脚本经典案例
  9. 最新NVIDIA英伟达GPU显卡算力表
  10. 基于面积对比法的图形匹配
  11. 计算机类单位换算,计算机单位换算大全
  12. commit翻译中文_commit的意思在线翻译,解释commit中文英文含义,短语词组,音标读音,例句,词源,同义词【澳典网ODict.Net】...
  13. 深度剖析!阿里巴巴社招面试题答案总结分享,希望对大家有帮助!
  14. 专访商汤科技联合创始人林达华丨一名AI人才,需要多少栽培?
  15. Python 创建商店营业额模拟数据并对其分析
  16. Mysql(下载、安装、环境配置详细图文)
  17. 图论科学家教你如何安排婚礼座次
  18. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Kali镜像
  19. html获取微信授权以及微信支付
  20. layui 如何取得select下拉框选中的值

热门文章

  1. 需要将录音转文字在线转换,应该如何完成
  2. BP神经网络理解及公式推导
  3. c语言比php好学吗,php和c语言哪个难
  4. 程序“媛”公号,越来越少了,这次推荐俩,轻拍!
  5. IIS发生意外错误0x8ffe2740 IIS不…
  6. 银行信用卡客户价值分析(Python数据分析)
  7. 图像处理/计算机视觉/python环境下如何用滤波器、算法恢复图片,对图片去污【附代码】
  8. Unity Shader入门精要第七章 基础纹理之遮罩纹理
  9. 纯CSS3实现凹凸文字
  10. 凹凸世界手游服务器维修,凹凸世界手游进不去怎么办 解决方法介绍