IDA Pro 入门 动态调试 so

编写测试的 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 {

// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}

private boolean flag = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Example of a call to a native method
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);
}
}
});
// tv.setText(getMd5(stringFromJNI()));
}

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();
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
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

load in

设置调试选项

debugger

附加到进程

progress

断点

附加后, 会自动到 libc.so 暂停

Android 系统中 libc.so 是 c 层中最基本的函数库, libc 中封装了io、file、socket 等基本系统调用, 所有上层的调用都需要经过libc封装层, 所以libc.so是最基本的, 所以会断在这里

pause

选择库后, 点击函数

funcation

按下 F5 转成 C 代码后, 打下断点

breakpoint

随后在 App 内输入 testing 然后点击 Encrypt

input

接下来, 程序会在断点处暂停

pause

查看寄存器的值, 可以看到 tesing 字样

view

得到的值 testingMLMh5D5e

value

继续让程序运行, 得到输出的结果

result

验算一下

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)))

#to remove hyphens and downcase letters add:
$hash = $hash.ToLower() -replace '-', ''
echo $hash

得到的结果与 App 的一样为 dcc1a90bca9d6533298b8c1e6a66511a

修改值

断到点后右键修改值

modify

这里修改为 text 后, 最后应用程序 App 计算出的值符合

result


IDA Pro 入门 动态调试 so
https://blog.forgiveher.cn/posts/2182936139/
Author
Mikey
Posted on
January 23, 2021
Licensed under