一个非常简单的安卓逆向练手app
本帖最后由 ogli324 于 2021-3-4 13:21 编辑## 一个非常简单的安卓逆向练手app 8
### 抓包如图所示
### base解码
### 经过定位确定在这儿
#### jadx
#### ida中直接有导出函数
```c
jstring __fastcall Java_com_goldze_mvvmhabit_utils_NativeUtils_encrypt(JNIEnv *a1, int a2, int a3)
{
char *v4; // r0
int v5; // r0
const char *v6; // r1
jstring v7; // r4
char v9; // BYREF
unsigned __int8 v10; // BYREF
_BYTE v11; // BYREF
char v12; // BYREF
_DWORD v13; // BYREF
char v14; // BYREF
char v15; // BYREF
char v16; // BYREF
_DWORD v17; // BYREF
v17 = 0;
v17 = 0;
v17 = 0;
v4 = (*a1)->GetStringUTFChars(a1, a3, 0);
std::string::basic_string<decltype(nullptr)>(v16, v4);
sub_E490(v17);
std::string::~string(v16);
v5 = time(0); // 时间戳
std::to_string(v16, v5);
sub_E4A0(v17);
join(v14, v17, 44);
sha1(v15, v14); // 初步看sha1加密
std::string::~string(v14);
v13 = 0;
v13 = 0;
v13 = 0;
sub_E4A0(v13);
sub_E4A0(v13);
join(v12, v13, 44);
std::string::basic_string(v9, v12);
b64encode(&v10, v9); //重点特征
std::string::~string(v9);
v6 = *&v11;
if ( !(v10 << 31) )
v6 = v11;
v7 = (*a1)->NewStringUTF(a1, v6);
std::string::~string(&v10);
std::string::~string(v12);
std::__vector_base<std::string>::~__vector_base(v13);
std::string::~string(v15);
std::string::~string(v16);
std::__vector_base<std::string>::~__vector_base(v17);
return v7;
}
```
### 只需要知道一点点sha1加密
```c
// sha1原型参考, 核心就是和md5差不多, hash算法,没有key。 多余的信息自行查看 https://en.wikipedia.org/wiki/SHA-1
int SHA1_Update(SHA_CTX *c, const void *data,
unsigned long len);
// 猜测对应位置 SHA1::add(a2, v6, v7);
```
### 上frida脚本测试下看看
```js
// 这是一个写好的完整脚本, 需要会frida姿势哟。
function hookjava(){
Java.perform(function(){
var encrypt = Java.use("com.goldze.mvvmhabit.utils.NativeUtils").encrypt;
encrypt.implementation = function(str){
console.log("java input:" + str)
var ret = this.encrypt(str);
console.log("java output:" + ret);
return ret;
}
})
}
function hook(){
var base = Module.findBaseAddress(lib_so);
// SHA1::add
var offset = base.add(0xF075);
Interceptor.attach(offset, {
onEnter:function(args){
console.log("native:"+ Memory.readCString(args))
}
}
)
}
var lib_so = "libnative.so"
var is_hook_libart = false;
function main(){
Interceptor.attach(Module.findExportByName(null, "dlopen"), {
onEnter: function (args) {
var pathptr = args;
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
// console.log("dlopen:", path);
if (!this.path){
return
}
if (path.indexOf(lib_so) >= 0) {
this.can_hook_libart = true;
console.log("", path);
}
}
},
onLeave: function (retval) {
if (this.can_hook_libart && !is_hook_libart) {
hook();
is_hook_libart = true;
}
}
})
Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {
onEnter: function (args) {
var pathptr = args;
if (pathptr !== undefined && pathptr != null) {
var path = ptr(pathptr).readCString();
// console.log("android_dlopen_ext:", path);
if (path.indexOf(lib_so) >= 0) {
this.can_hook_libart = true;
console.log("", path);
}
}
},
onLeave: function (retval) {
if (this.can_hook_libart && !is_hook_libart) {
hook();
is_hook_libart = true;
}
}
});
}
setImmediate(hookjava)
setImmediate(main)
```
```text
前面分析过的, 返回是个base64, 重新解码看下
```
```text
native:/api/movie,1614831596 重新sha1后结果与base64解开一样。
分析过程结束~~~
```
```text
python脚本 完结傻花~~~
```
```python
from base64 import b64encode
import hashlib
import time
import requests
def sha1(data):
m = hashlib.sha1()
m.update(data.encode())
return m.hexdigest()
def encrypt():
t = round(time.time())
text = f"/api/movie,{t}"
result = sha1(text)
text = f"{result},{t}"
token = b64encode(text.encode()).decode()
return token
def main():
token = encrypt()
url = f"https://app8.scrape.center/api/movie/?offset=0&limit=10&token={token}"
headers = {
"log-header": "I am the log request header.",
# "Host": "app8.scrape.center",
"Connection": "Keep-Alive",
"Accept-Encoding": "gzip",
"User-Agent": "okhttp/3.10.0"
}
resp = requests.get(url, headers=headers)
print(resp.json())
if __name__ == '__main__':
main()
```
```python
app和分析文件打包附件, 需要解压, 无密码。
https://wwa.lanzouj.com/iLChomh2i4d
该app来着老崔的练习网站 app8
第一次写文,小声点骂我。
``` lyl610abc 发表于 2021-3-4 13:22
先不论内容如何,排版看得有点难受
不过,还是要支持一下原创分析的
加油{:301_99 ...
{:1_923:}我以为md文档直接就识别的了, 发完一看, 哦豁, 不过好在很快重新排版好了, 没几个人会发现,偷偷的~ qwertyuiop1822 发表于 2021-3-4 14:53
大佬, 我的IDA导出函数怎么是这些
可以搜索 过滤下Java_xxxx(指适用于静态绑定的哟, 动态的不是这样的格式。)看我发的图 内容很详细 nice! 学习啦 先不论内容如何,排版看得有点难受{:301_971:}
不过,还是要支持一下原创分析的{:301_978:}
加油{:301_993:} ogli324 发表于 2021-3-4 13:24
我以为md文档直接就识别的了, 发完一看, 哦豁, 不过好在很快重新排版好了, 没几个人会发现 ...
现在看起来舒服多了,O(∩_∩)O{:301_986:} lyl610abc 发表于 2021-3-4 13:27
现在看起来舒服多了,O(∩_∩)O
:lol嘻嘻~~~ 感谢楼主分享! 感谢分享 nice! xuexi ! 学习了! 有用,感谢楼主分享。