问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
破解百元注册码实现内购
移动安全
从开发角度出发,并结合静态分析和动态分析,从而实现对关键函数的hook或主动调用,实现破解百元注册码实现内购。
静动态分析破解跳转和注册案例 -------------- #### 动态分析,置空函数体,实现破解跳转 进入某款罗盘 App 后,点击打马赛克的位置 ![1.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-68f58e5171b0baeccb64958f2355815c66a40d74.png) 会跳转到网站页面 ![2.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-88bb6102b7cbece4472a8416b67574fb9036b2d6.png) 如今想实现的功能是,不想让广告网页随着点击触发。 搞破解一定要站在开发的角度去考虑问题,如果开发一个跳转网站的程序,肯定就需要意图 intent。 例如,写一个跳转到打电话的页面 ```js package com.bmstd.createActivity; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bt_call = findViewById(R.id.bt_call); bt_call.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + 12345)); startActivity(intent); } }); } } ``` 要想实现页面的跳转,一定是要有一个按钮点击的,然后通过 new Intent,并 setAction 和 setData ,最后 startActivity(intent) 才可以实现跳转。 也就是说,只要最后一步 startActivity 这个函数不执行,那么就一定可以实现永不跳转到网页页面。 由上面的开发得知,此 App 一定使用了 android.content.Intent 类。 通过 objection 搜索一下这个类。 执行命令 ```php android hooking search classes android.content.Intent ``` ![3.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-99e0514a32c9f990c60827120c15d4d05259df6e.png) 从结果得知,确实存在这个类。 于是对这个类进行全面 hook ,把里面的所有方法都 hook 到 ![4.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-7fabe1a089d64d257949402e6f982637a334c761.png) hook 后再点击跳转处 此时就触发了调用 ![5.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-fc443d1e5f686b77e7929976ef01a7c2ce21f17b.png) 从调用中看出,果然调用了 setData 方法,所以和开发是一致的,此时只要 hook 住 startActivity 函数,并且不执行函数体,就算是成功了。 下一步就是找到 startActivity 的所在类,通过 api 查找发现所在类就是 android.content.Context ![6.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-43c7baf1f247c066edfe57390badd0ef3f3305cf.png) 但是这个 android.content.Context 这个类太大了,无法 hook 住他的方法。 ![7.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-b4ad980b0926d162c386d2944606b1a4d923c49d.png) 所以只能找起子类,于是定位到了,他的一个间接子类 android.app.Activity ![8.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-e72c7ca9954146c222d1c3e2962789d61a38a68b.png) 编写 Js 代码,对 android.app.Activity.startActivity 方法进行 hook ,hook 住后,不执行里面的方法,即可完成不跳转。 ```js function hook_intent() { Java.perform(function () { var Activity = Java.use("android.app.Activity"); Activity.startActivity.overload('android.content.Intent').implementation = function (intent) { }; }) } setImmediate(hook_intent) ``` 此时执行 js 代码后,无论怎样点击,都不会发生跳转。 ![9.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-969bec5f6dc3cdff638a8c0d6f27efee79b3be6b.png) #### 动静态结合加主动调用,吐出注册码 进入某款八字 App 后,会弹出"本软件需要购买注册码后方可使用"。从下图得知,这是通过机器码生成的注册码,也就是一机一码的形式。 ![10.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-84c49046b60b492c9ab71402ec226c3f25da78b1.png) 随意输入一串字符串,肯定是错误的。于是会弹出,注册码校验失败,请重新输入注册码。 ![11.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-b200d1f7ecaba4f63ae05cf9f09416d0b8f0b8e0.png) 试试闯大运,在静态反编译中找,是否有以上字符串。结果在 RegistMachine 成功找到。 ![12.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-a4e357c5a4c071902be886a787591824a8ab8d44.png) 通过上述的代码中,可知输入的字符串长度大于 6 ,就会直接提示"注册码校验失败,请重新输入注册码"。只要输入的注册码长度小于等于 6,就会进入第二个 if 语句中,只要第二个 if 语句成立,就会提示 "注册码校验成功,您可以无限制使用本软件了"。 所以把目光集中在 ```java if (RegistMachine.getFingerPrint(editText.getText().toString(), str2).equals(trim)) ``` editText.getText().toString() 就是第一个输入框的,也就是 App 本身提供给用户的 那么 str2 是什么呢? 通过源码追溯,找到 str2 是静态函数 showRegister 的参数。 ![13.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-42245a2985e26342dab33b84aaaec05423088bef.png) 再继续向上找,是谁调用了函数 showRegister 。发现是静态 show 方法。 ![14.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-9b5e7a47bc203bb05a78f28f600f339b71eeaf94.png) 再继续向上找,是谁调用了静态函数 show。找到了是 MainActivity 的 onCreate 方法调用了 show 。 ![15.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-61cc683fb6f24faa09ae1e1b36914f839d680b02.png) 于是定位出 str2 是固定的,str2 就是 a8ycuxpbz2020。 又要把目光聚焦到,刚刚的判断 ```java if (RegistMachine.getFingerPrint(editText.getText().toString(), str2).equals(trim)) ``` 如今 editText.getText().toString(), str2 已经全部确定了,不确定的就是 RegistMachine.getFingerPrint 函数的执行结果,也就是说,只要主动调用一下 RegistMachine.getFingerPrint 函数,这个函数的返回值就是注册码! 编写 js 代码 ```js function pop_up_registration_code() { Java.perform(function () { let RegistMachine = Java.use("com.xxxxx.xxxxxxxxxxxxxxx.RegistMachine"); var result_code = RegistMachine.getFingerPrint("1c470c", "a8ycuxpbz2020") console.log("result_code => ", result_code) }) } setImmediate(pop_up_registration_code) ``` 执行后,就会自吐注册码了 ![17.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-d7cdf39abc7927c5c3e285aef4343d3efdf49593.png) 将输入的注册码输入,就会提示注册码校验成功 ![16.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-f9080134a1feb8450b7effb5e13ffd2c6bc4d3bc.png) #### 动静态结合加修改逻辑,实现无视购买 同样 App 需要根本识别码,然后生成注册码。 ![18.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-534e2abfb019970c17cf0ccc8b431275a2fdc998.png) 同样根据关键字搜索,搜索到点击的类,并定位到逻辑代码。 ![19.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-7f92f633c6db0e0c231f9c8a663dd533a18b9812.png) 最关键的就是逻辑判断 ```java if (!C0424cd.m29g() || !C0424cd.m28h() || !C0424cd.m27i() || !C0424cd.m26j() || !C0424cd.m25k()) ``` 所以只要 cd.g() ,cd.h() ,cd.i(),cd.j(),cd.k() 这 5 个函数都返回 true ,那么就可以忽略掉算法细节,输入任何字符串都会注册成功。 直接编写 js 代码修改内部逻辑 ```js function registration_success() { Java.perform(function () { var cd = Java.use("com.android.xxxx.xxxxxxx.cd"); cd.g.implementation = function () { return true; }; cd.h.implementation = function () { return true; }; cd.i.implementation = function () { return true; }; cd.j.implementation = function () { return true; }; cd.k.implementation = function () { return true; }; }) } setImmediate(registration_success) ``` 这时无论输入什么字符串,都会成功注册。 ![20.png](https://shs3.b.qianxin.com/attack_forum/2023/04/attach-23f5c482e85cde208d1031f7e82184993bd8fc32.png)
发表于 2023-04-14 09:00:01
阅读 ( 5647 )
分类:
漏洞分析
0 推荐
收藏
0 条评论
请先
登录
后评论
bmstd
13 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!