1. test3.apk 安装到手机

2. 发现其实际逻辑和之前的test2.apk基本一致,逆向so查看到加入了一些检查逻辑

代码:

jstring __fastcall fuck(JNIEnv *env, jclass jcls, jstring str_)
{
...... if ( !str_ )
return 0;
src = (unsigned __int8 *)_JNIEnv::GetStringUTFChars(env, str_, 0);
v20 = "REAL";
clazz = _JNIEnv::FindClass(env, "android/os/Build");
fieldID = _JNIEnv::GetStaticFieldID(env, clazz, "FINGERPRINT", "Ljava/lang/String;");
StaticObjectField = (_jstring *)_JNIEnv::GetStaticObjectField(env, clazz, fieldID);
if ( function_check_tracerPID()
|| system_getproperty_check()
|| (StringUTFChars = (char *)_JNIEnv::GetStringUTFChars(env, StaticObjectField, 0), strstr(StringUTFChars, "aosp")) )
{
v20 = "FAKE";
}
strcat((char *)src, v20); obj = (_jobject *)j_o0OoOOOO(env, src);
Class = _JNIEnv::FindClass(env, "java/security/MessageDigest");
methodID = _JNIEnv::GetStaticMethodID(env, Class, "getInstance", "(Ljava/lang/String;)Ljava/security/MessageDigest;");
v4 = j_o0OoOOOO(env, "MD5");
v14 = _JNIEnv::CallStaticObjectMethod(env, Class, methodID, v4);
v13 = _JNIEnv::GetMethodID(env, Class, "digest", "([B)[B");
v12 = _JNIEnv::FindClass(env, "java/lang/String");
v11 = _JNIEnv::GetMethodID(env, v12, "getBytes", "()[B");
v10 = _JNIEnv::CallObjectMethod(env, obj, v11);
array = (_jbyteArray *)_JNIEnv::CallObjectMethod(env, v14, v13, v10);
ByteArrayElements = _JNIEnv::GetByteArrayElements(env, array, 0);
for ( i = 0; i <= 15; ++i )
sprintf((char *)&v27[i], "%02x", (unsigned __int8)ByteArrayElements[i]);
v26 = (char *)j_ll11l1l1ll(src);
strcat(v26, (const char *)v27);
v6 = j_o0OoOOOO(env, (const unsigned __int8 *)v26);
_JNIEnv::ReleaseStringUTFChars(env, str_, src);
free(v26);
return v6;
}

从这里可以看到,增加了一个检查system_getproperty_checkstrstr(StringUTFChars, "aosp"),如果满足条件就会把 REAL 改为 FAKE,追加到字符串后面,那么就怎么都不会成功得到正确结果了

就不会进入到if块中;方案一是strcat的入参,让第二个参数传入时永远是REAL

方案一代码:

function main() {
Java.perform(function () {
hookCheck()
var MainActivityHandler = Java.use('com.roysue.easyso1.MainActivity') for (var i = 87650; i <= 87700; i++) {
var str = i + ""
var ret = MainActivityHandler.Sign(str)
if (i % 1000 == 0) {
console.log("now is", str);
}
//console.log(ret)
if (ret == "57fdeca2cac0509b2e9e5c52a5b573c1608a33ac1ffb9e8210d2e129557e7f1b") {
console.log("find it : " + str)
break
}
} console.log("end : ")
}) } function hookCheck() {
var lib_hanlder = Process.findModuleByName("libroysue.so");
console.log("lib_handler: " + lib_hanlder) if (lib_hanlder) {
var addr_hook = lib_hanlder.base.add(0x00037226 + 0x1) Interceptor.attach(addr_hook,{
onEnter: function(args) {
console.log(" === hook before")
console.log("=== r1:" + this.context.r1.readCString())
Memory.protect(this.context.r1, 1024, 'rw-')
this.context.r1.writeUtf8String("REAL")
console.log("=== r1:" + this.context.r1.readCString())
},
onLeave:function(retVal) {
console.log(" === hook after: ")
//print_dump(retVal, 128)
console.log("=== after r1:" + this.context.r1.readCString()) }
})
}
} setTimeout(main, 2000)

关键汇编代码

.text:00037220 24 91                         STR             R1, [SP,#0xD8+var_48]
.text:00037222 26 98 LDR R0, [SP,#0xD8+var_40] ; char *
.text:00037224 24 99 LDR R1, [SP,#0xD8+var_48] ; char *
.text:00037226 FC F7 00 ED BLX strcat
这里的 0x00037226 就是 strcat 对应的偏移地址,其实也可以hook 0x00037224,结果是一样的(hook的这一行相当于是执行后进入onEnter)

日志:

 === hook before
=== r1:FAKE
=== r1:REAL
=== hook before
=== r1:REAL
=== r1:REAL
=== hook before
=== r1:REAL
=== r1:REAL
=== hook before
=== r1:REAL
=== r1:REAL
=== hook before
=== r1:REAL
=== r1:REAL
find it : 87654
end :

从日志上课 onLeave没执行,原因是这里不是一个标准的函数特征,所以没有入栈出栈逻辑,所以就onLeave没执行

【Android逆向】破解看雪test3.apk方案一的更多相关文章

  1. Android逆向破解表单注册程序

    Android逆向破解表单注册程序 Android开发 ADT: android studio(as) 程序界面如下,注册码为6位随机数字,注册成功时弹出通知注册成功,注册失败时弹出通知注册失败. 布 ...

  2. Android逆向破解表单登录程序

    Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...

  3. Android逆向——破解水果大战

    最近公司需要测试安卓app安全,但安卓基本上0基础,决定开始学习下安卓逆向根据吾爱破解上教程 <教我兄弟学Android逆向系列课程+附件导航帖> https://www.52pojie. ...

  4. Android逆向 破解第一个Android程序

    这节正式开始破解编写的第一个Android工程,打开Android Killer,把第一节自己编写的Android apk拖入Android Killer. PS: 如果Android Killer不 ...

  5. Android逆向破解:Android Killer使用

    目录   目录 软件介绍 Android Killer是一款可以对APK进行反编译的工具,它能够对反编译后的Smali文件进行修改,并将修改后的文件进行打包. 软件下载 这里用的是@昨夜星辰2012 ...

  6. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  7. Android 逆向实战篇(加密数据包破解)

    1. 实战背景由于工作需要,要爬取某款App的数据,App的具体名称此处不便透露,避免他们发现并修改加密逻辑我就得重新破解了. 爬取这款App时发现,抓包抓到的数据是加密过的,如图1所示(原数据较长, ...

  8. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  9. Android逆向分析(2) APK的打包与安装

    http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...

  10. 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...

随机推荐

  1. [转帖]linux之iftop命令

    https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 ...

  2. [转帖]RocketMQ - nameSrv和Broker

    RocketMQ RocketMQ是一个统一的消息传递引擎,轻量级的数据处理平台. Name Server Name Server充当路由消息的提供者,生产者(Producer)或消费者(Custom ...

  3. [转帖]HTTP2 Sampler for JMeter

    https://www.cnblogs.com/a00ium/p/10462572.html 今天开发大大说能不能帮忙压一下HTTP2的链接,便去查了一下相关的东西. HTTP 2.0 的出现,相比于 ...

  4. [转帖]实战瓶颈定位-我的MySQL为什么压不上去

    https://plantegg.github.io/2023/06/20/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88% ...

  5. [转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)

    https://www.jianshu.com/p/fd46652f247e 摘要:Linux,crontab整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志 cron ...

  6. [转帖]xsos - Summarize system info from sosreports

    https://github.com/ryran/rsar I'M LOOKING FOR RSAR SCREEN SHOTS INTRO INSTALLATION EXAMPLES IN ACTIO ...

  7. [转帖]一次python服务的性能优化经历

    https://juejin.cn/post/7208708762265616421 问题背景: ​ 在我们的业务中,有一些推荐的场景会需要走到集团研究院的算法推荐服务,对一些用户进行个性化的课件推荐 ...

  8. TCP内核参数与Nginx配置的简单测试

    背景 昨天晚上整理了下几个TCP内核的参数. 学习到了一点内核参数的影响. 但是因为时间比较晚了没有继续钻研与nginx的关系 今天想着继续研究一下TCP的部分参数与nginx的关系 每个系统都不一样 ...

  9. Operating.System.Concepts.10th.Edition中文翻译

    <操作系统概念>是一本很好的书,主要介绍了操作系统的各个层面的概念,包含CPU调度,内存处理,文件系统等,目前已经出到第10版,是一本非常经典的书籍,从第1版至今被国内外众多高校选作教材, ...

  10. RabbitMQ集成系统文章01---ABP VNext 分布式事务Event Bus 集成RabbitMQ

    1.在两个应用中都配置好要连接的RabbitMQ "RabbitMQ": { "Connections": { "Default": { & ...