编写测试的 App 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 package com.app.nativejni;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.util.Random;public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib" ); } private boolean flag = false ; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.sample_text); EditText et = findViewById(R.id.editTextTextPersonName); Button bt = findViewById(R.id.button); bt.setOnClickListener(new View .OnClickListener() { @Override public void onClick (View v) { if (flag) { tv.setText("" ); flag = false ; } else { tv.setText(getMd5(et.getText().toString() + getRandomString(8 ))); flag = true ; } if (flag) { bt.setText(R.string.clear); } else { bt.setText(R.string.encrypt); } } }); } public static String getRandomString (int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ; Random random = new Random (); StringBuffer sb = new StringBuffer (); for (int i = 0 ; i < length; i++) { int number = random.nextInt(62 ); sb.append(str.charAt(number)); } return sb.toString(); } public native String stringFromJNI () ; public native String getMd5 (String str) ; }
App 实现一个字符串加密的思路为
获取加密的字符串
-> 追加一个长度为 8 的随机字符串
-> 计算 md5
最后直接得到结果, 已知的条件有:
未知的部分则为 长度为 8 的随机字符串
使用 IDA Pro 动态调试断点得出未知的 长度为 8 的随机字符串
开始 运行 android_server64
且 转发出端口
1 adb forward tcp:23946 tcp:23946
使用 IDA 载入 libnative-lib.so
设置调试选项
附加到进程
断点 附加后, 会自动到 libc.so
暂停
Android 系统中 libc.so
是 c 层中最基本的函数库, libc 中封装了io、file、socket 等基本系统调用, 所有上层的调用都需要经过libc封装层, 所以libc.so是最基本的, 所以会断在这里
选择库后, 点击函数
按下 F5
转成 C 代码后, 打下断点
随后在 App 内输入 testing
然后点击 Encrypt
接下来, 程序会在断点处暂停
查看寄存器的值, 可以看到 tesing
字样
得到的值 testingMLMh5D5e
继续让程序运行, 得到输出的结果
验算一下
1 2 3 4 5 6 7 8 $someString = "testingMLMh5D5e" $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider$utf8 = new-object -TypeName System.Text.UTF8Encoding$hash = [System.BitConverter ]::ToString($md5 .ComputeHash($utf8 .GetBytes($someString )))$hash = $hash .ToLower() -replace '-' , '' echo $hash
得到的结果与 App 的一样为 dcc1a90bca9d6533298b8c1e6a66511a
修改值 断到点后右键修改值
这里修改为 text
后, 最后应用程序 App 计算出的值符合