Android APK 反编译分析: Java_com_example_decryptdemo_MainActivity_checkPassword 函数解密
[0x00000468]> pdf @sym.Java_com_example_decryptdemo_MainActivity_checkPassword ┌ 102: sym.Java_com_example_decryptdemo_MainActivity_checkPassword (int16_t arg1, int16_t arg2, int16_t arg3); │ ; arg int16_t arg1 @ r0 │ ; arg int16_t arg2 @ r1 │ ; arg int16_t arg3 @ r2 │ ; var int16_t var_0h @ sp+0x0 │ ; var int8_t var_19h @ sp+0x7 │ ; var int16_t var_8h @ sp+0x8 │ ; var int16_t var_ch @ sp+0xc │ ; var int16_t var_10h @ sp+0x10 │ ; var int16_t var_14h @ sp+0x14 │ ; var int16_t var_18h @ sp+0x18 │ ; var int16_t var_1ch @ sp+0x1c │ ; var int16_t var_0h_2 @ sp+0x20 │ 0x00000510 80b5 push {r7, lr} │ 0x00000512 6f46 mov r7, sp │ 0x00000514 88b0 sub sp, 0x20 │ 0x00000516 0790 str r0, [var_1ch] ; arg1 │ 0x00000518 0691 str r1, [var_18h] ; arg2 │ 0x0000051a 0592 str r2, [var_14h] ; arg3 │ 0x0000051c 0798 ldr r0, [var_1ch] │ 0x0000051e 0168 ldr r1, [r0] │ 0x00000520 d1f8a432 ldr.w r3, [r1, 0x2a4] │ 0x00000524 0599 ldr r1, [var_14h] │ 0x00000526 0022 movs r2, 0 │ 0x00000528 0092 str r2, [sp] │ 0x0000052a 9847 blx r3 │ 0x0000052c 0490 str r0, [var_10h] │ 0x0000052e 1248 ldr r0, [0x00000578] ; [0x578:4]=0xffffff2c │ 0x00000530 7844 add r0, pc ; 0x460 ; '709<0#0' │ 0x00000532 0390 str r0, [var_ch] │ 0x00000534 0398 ldr r0, [var_ch] │ 0x00000536 5521 movs r1, 0x55 ; 'U' │ 0x00000538 00f052e8 blx fcn.000005e0 │ ; CODE XREF from fcn.00000580 @ 0x590(x) │ 0x0000053c 0146 mov r1, r0 │ ; CODE XREF from fcn.00000580 @ 0x592(x) │ 0x0000053e 0098 ldr r0, [sp] │ 0x00000540 0291 str r1, [var_8h] │ 0x00000542 07f8190c strb r0, [var_19h] │ 0x00000546 0498 ldr r0, [var_10h] │ 0x00000548 0299 ldr r1, [var_8h] │ 0x0000054a 00f052e8 blx fcn.000005f0 │ ┌─< 0x0000054e 20b9 cbnz r0, 0x55a │ ┌──< 0x00000550 ffe7 b 0x552 │ ││ ; CODE XREF from sym.Java_com_example_decryptdemo_MainActivity_checkPassword @ 0x550(x) │ └──> 0x00000552 0120 movs r0, 1 │ │ 0x00000554 07f8190c strb r0, [var_19h] │ ┌──< 0x00000558 ffe7 b 0x55a │ ││ ; CODE XREFS from sym.Java_com_example_decryptdemo_MainActivity_checkPassword @ 0x54e(x), 0x558(x) │ └└─> 0x0000055a 0298 ldr r0, [var_8h] │ 0x0000055c 00f050e8 blx fcn.00000600 │ 0x00000560 0798 ldr r0, [var_1ch] │ 0x00000562 0168 ldr r1, [r0] │ 0x00000564 d1f8a832 ldr.w r3, [r1, 0x2a8] │ 0x00000568 0599 ldr r1, [var_14h] │ 0x0000056a 049a ldr r2, [var_10h] │ 0x0000056c 9847 blx r3 │ 0x0000056e 17f8190c ldrb r0, [var_19h] │ 0x00000572 08b0 add sp, 0x20 └ 0x00000574 80bd pop {r7, pc}
解释 如何获取密码内容:根据给出的代码,获取密码的过程如下:
-
首先,从参数中获取密码的相关信息,分别存储在变量 var_1ch、var_18h 和 var_14h 中。
-
然后,通过 var_1ch 变量获取一个地址,再从该地址中获取一个值,存储在寄存器 r1 中。
-
接下来,通过 r1 这个地址加上偏移量 0x2a4,获取一个地址,再从该地址中获取一个值,存储在寄存器 r3 中。
-
将 var_14h 变量的值存储在寄存器 r1 中,将值 0 存储在栈上的位置 sp。
-
调用函数,函数地址存储在寄存器 r3 中,参数分别是 r1、r2 和 sp 的值。
-
将函数的返回值存储在变量 var_10h 中。
-
从地址 0x00000578 中加载一个值,存储在寄存器 r0 中,再将寄存器 pc 的值加上这个值,得到一个新的地址,将其存储在变量 var_ch 中。
-
将 var_ch 变量的值存储在寄存器 r0 中,将值 0x55 存储在寄存器 r1 中。
-
调用函数,函数地址存储在寄存器 r3 中,参数分别是 r0 和 r1 的值。
-
将函数的返回值存储在变量 var_8h 中。
-
将 sp 的值存储在变量 var_19h 中。
-
将变量 var_10h 的值存储在寄存器 r0 中,将变量 var_8h 的值存储在寄存器 r1 中。
-
调用函数,函数地址存储在寄存器 r3 中,参数分别是 r0 和 r1 的值。
-
判断函数的返回值是否为零,如果是,则跳转到地址 0x552,否则继续执行。
-
将值 1 存储在寄存器 r0 中。
-
将寄存器 r0 的值存储在变量 var_19h 中。
-
跳转到地址 0x55a。
-
将变量 var_8h 的值存储在寄存器 r0 中。
-
调用函数,函数地址存储在寄存器 r3 中,参数是 r0 的值。
-
将变量 var_1ch 的值存储在寄存器 r0 中,将寄存器 r0 的值存储在寄存器 r1 中。
-
通过 r1 这个地址加上偏移量 0x2a8,获取一个地址,再从该地址中获取一个值,存储在寄存器 r3 中。
-
将 var_14h 变量的值存储在寄存器 r1 中,将 var_10h 变量的值存储在寄存器 r2 中。
-
调用函数,函数地址存储在寄存器 r3 中,参数分别是 r1 和 r2 的值。
-
将变量 var_19h 的值存储在寄存器 r0 中。
-
释放栈空间。
根据代码,无法直接获取密码的明文值,因为密码的处理过程在调用的函数中进行,而具体的函数实现并未给出。因此,需要进一步查看函数 fcn.000005e0、fcn.000005f0 和 fcn.00000600 的实现来获取密码的具体处理过程。
原文地址: https://www.cveoy.top/t/topic/bFPo 著作权归作者所有。请勿转载和采集!