第二篇来了 对某旅行APP的检测以及参数计算分析【新手向-Simplesign篇】(二)
本文预计共会写3到4篇文章,总结学习过程中遇到的问题与解决的思路。
涉及到的so主要有两个,一个是libmsaoaidsec.so 另一个是scmain.so
版本为今年过年期间的版本。
本篇主要会涉及到anti frida、socket抓包定位、simpxxxxxx参数的前置准备。
frida 版本: 16.1.0
f.a()
继续深入,到一个接口类,可以用frida来查找实现类,也可以在jadx中搜索:impelements f.b
继续点,最后到这里
刚才我们说过,先看参数内容,发现第一个参数是一个函数,查看
到此,我们基本定位好收发包的大体流程了。下一步对GzipUtil、SecurityUtil等类进行hook就可以把参数拼接过程找到,此app还用了protobuf,不过这些都可以自行解决了。Request也可以用此方式定位的到,包括压缩、解压、异或运算等。抓包内容到此告一段落,主要就是多hook,多分析就能找到。
将此代码放到r0capture
的script.js中,hook init_array中以spawn启动.
IDA 7.7
Library : libscmain.so
Frida Stalker
Frida Hook Libart : hook_RegisterNatives.js
Target Parm : simpleSign
本篇文章暂时不对生成过程的细节做分析学习,先了解如何分析,怎么分析。
第一次发分享内容,有一些东西可能有疏漏,欢迎指出。
下一篇分享分析simplesign 75位结果的前32位的生成过程。
function
nop(addr) {
Memory.patchCode(ptr(addr), 4, code => {
const cw =
new
Arm64Writer(code, { pc: ptr(addr) });
cw.putNop();
cw.putNop();
cw.putNop();
cw.putNop();
cw.flush();
});
}
function
antiPthread_create(){
let module = Process.findModuleByName(
"libmsaoaidsec.so"
)
nop(module.base.add(0x17FC8))
nop(module.base.add(0x16EF4))
nop(module.base.add(0x16A74))
}
function
nop(addr) {
Memory.patchCode(ptr(addr), 4, code => {
const cw =
new
Arm64Writer(code, { pc: ptr(addr) });
cw.putNop();
cw.putNop();
cw.putNop();
cw.putNop();
cw.flush();
});
}
function
antiPthread_create(){
let module = Process.findModuleByName(
"libmsaoaidsec.so"
)
nop(module.base.add(0x17FC8))
nop(module.base.add(0x16EF4))
nop(module.base.add(0x16A74))
}
if
(Process.pointerSize == 4) {
var
linker = Process.findModuleByName(
"linker"
);
}
else
{
var
linker = Process.findModuleByName(
"linker64"
);
}
var
addr_call_function =
null
;
var
addr_g_ld_debug_verbosity =
null
;
var
addr_async_safe_format_log =
null
;
if
(linker) {
var
symbols = linker.enumerateSymbols();
for
(
var
i = 0; i < symbols.length; i++) {
var
name = symbols[i].name;
if
(name.indexOf(
"call_function"
) >= 0) {
addr_call_function = symbols[i].address;
}
else
if
(name.indexOf(
"g_ld_debug_verbosity"
) >= 0) {
addr_g_ld_debug_verbosity = symbols[i].address;
ptr(addr_g_ld_debug_verbosity).writeInt(2);
}
else
if
(name.indexOf(
"async_safe_format_log"
) >= 0 && name.indexOf(
'va_list'
) < 0) {
addr_async_safe_format_log = symbols[i].address;
}
}
}
if
(addr_async_safe_format_log) {
Interceptor.attach(addr_async_safe_format_log, {
onEnter:
function
(args) {
this
.log_level = args[0];
this
.tag = ptr(args[1]).readCString()
this
.fmt = ptr(args[2]).readCString()
if
(
this
.fmt.indexOf(
"c-tor"
) >= 0 &&
this
.fmt.indexOf(
'Done'
) < 0) {
this
.function_type = ptr(args[3]).readCString(),
this
.so_path = ptr(args[5]).readCString();
var
strs =
new
Array();
strs =
this
.so_path.split(
"/"
);
this
.so_name = strs.pop();
this
.so_base_addr = Module.findBaseAddress(
this
.so_name);
if
(
this
.so_name.indexOf(
"libmsaoaidsec.so"
) != -1) {
console.log(
"start hook!"
);
}
}
},
onLeave:
function
(retval) {
}
})
}
if
(Process.pointerSize == 4) {
var
linker = Process.findModuleByName(
"linker"
);
}
else
{
var
linker = Process.findModuleByName(
"linker64"
);
}
var
addr_call_function =
null
;
var
addr_g_ld_debug_verbosity =
null
;
var
addr_async_safe_format_log =
null
;
if
(linker) {
var
symbols = linker.enumerateSymbols();
for
(
var
i = 0; i < symbols.length; i++) {
var
name = symbols[i].name;
if
(name.indexOf(
"call_function"
) >= 0) {
addr_call_function = symbols[i].address;
}
else
if
(name.indexOf(
"g_ld_debug_verbosity"
) >= 0) {
addr_g_ld_debug_verbosity = symbols[i].address;
ptr(addr_g_ld_debug_verbosity).writeInt(2);
}
else
if
(name.indexOf(
"async_safe_format_log"
) >= 0 && name.indexOf(
'va_list'
) < 0) {
addr_async_safe_format_log = symbols[i].address;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-2-25 10:58
被我是红领巾编辑
,原因: