[*] Binary protection state of feature-flag-service
Full RELRO Canary found NX enabled PIE enabled No RPATH No RUNPATH No Symbols
[*] Function system tear down of feature-flag-service
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x2a20 */
| #include <stdint.h>
|
; (fcn) fcn.00002a20 () | void fcn_00002a20 (int16_t arg_140h, int16_t arg_238h, int16_t arg1, int16_t arg2) {
| int16_t var_0h;
| int16_t var_4h;
| r0 = arg1;
| r1 = arg2;
| /* [13] -r-x section size 30132 named .text */
0x00002a20 ldr r2, [pc, 0x78] |
0x00002a22 ldr r3, [pc, 0x7c] | r3 = *(0x2aa2);
0x00002a24 push {r4, r5, r6, r7, lr} |
0x00002a26 add.w r6, r0, 8 | r6 = r0 + 8;
0x00002a2a add r2, pc | r2 = 0x54ca;
0x00002a2c sub sp, 0xc |
0x00002a2e ldr r3, [r2, r3] |
0x00002a30 ldr r3, [r3] | r3 = *(0x54ca);
0x00002a32 str r3, [sp, 4] | var_4h = r3;
0x00002a34 mov.w r3, 0 | r3 = 0;
0x00002a38 str r6, [r0] | *(r0) = r6;
| if (r1 == 0) {
0x00002a3a cbz r1, 0x2a94 | goto label_0;
| }
0x00002a3c mov r4, r0 | r4 = r0;
0x00002a3e mov r0, r1 | r0 = r1;
0x00002a40 mov r5, r1 | r5 = r1;
0x00002a42 blx 0x28f0 | r0 = fcn_000028f0 ();
0x00002a46 cmp r0, 0xf |
0x00002a48 add.w r7, r5, r0 | r7 = r5 + r0;
0x00002a4c str r0, [sp] | *(sp) = r0;
0x00002a4e bhi 0x2a7c |
| while (1) {
0x00002a50 mov r2, r7 | r2 = r7;
0x00002a52 mov r1, r5 | r1 = r5;
0x00002a54 mov r0, r6 | r0 = r6;
0x00002a56 blx 0x2784 | sym ();
0x00002a5a ldr r3, [sp] | r3 = *(sp);
0x00002a5c movs r1, 0 | r1 = 0;
0x00002a5e ldr r2, [r4] | r2 = *(r4);
0x00002a60 str r3, [r4, 4] | *((r4 + 4)) = r3;
0x00002a62 strb r1, [r2, r3] | *((r2 + r3)) = r1;
0x00002a64 ldr r2, [pc, 0x3c] |
0x00002a66 ldr r3, [pc, 0x38] | r3 = *(0x2aa2);
0x00002a68 add r2, pc | r2 = 0x5510;
0x00002a6a ldr r3, [r2, r3] | r3 = *(0x5510);
0x00002a6c ldr r2, [r3] | r2 = *(0x5510);
0x00002a6e ldr r3, [sp, 4] | r3 = var_4h;
0x00002a70 eors r2, r3 | r2 ^= r3;
0x00002a72 mov.w r3, 0 | r3 = 0;
| if (r2 != r3) {
0x00002a76 bne 0x2a90 | goto label_1;
| }
0x00002a78 add sp, 0xc |
0x00002a7a pop {r4, r5, r6, r7, pc} |
0x00002a7c movs r2, 0 | r2 = 0;
0x00002a7e mov r1, sp | r1 = sp;
0x00002a80 mov r0, r4 | r0 = r4;
0x00002a82 blx 0x2950 | fcn_00002950 ();
0x00002a86 ldr r3, [sp] | r3 = *(sp);
0x00002a88 mov r6, r0 | r6 = r0;
0x00002a8a str r0, [r4] | *(r4) = r0;
0x00002a8c str r3, [r4, 8] | *((r4 + 8)) = r3;
0x00002a8e b 0x2a50 |
| }
| label_1:
0x00002a90 blx 0x279c | sd_bus_message_new_signal ();
| label_0:
0x00002a94 ldr r0, [pc, 0x10] |
0x00002a96 add r0, pc | r0 = 0x5542;
0x00002a98 blx 0x2688 | cxa_free_exception ();
0x00002a9c str r3, [sp, 0x238] | *(arg_238h) = r3;
0x00002a9e movs r1, r0 | r1 = r0;
0x00002aa0 lsls r4, r1, 7 | r4 = r1 << 7;
0x00002aa2 movs r0, r0 |
0x00002aa4 str r3, [sp, 0x140] | *(arg_140h) = r3;
0x00002aa6 movs r1, r0 | r1 = r0;
0x00002aa8 strb r6, [r2, 0x17] | *((r2 + 0x17)) = r6;
0x00002aaa movs r0, r0 |
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x4344 */
| #include <stdint.h>
|
; (fcn) fcn.00004344 () | void fcn_00004344 (int16_t arg1, int16_t arg2, int16_t arg3) {
| int16_t var_0h;
| r0 = arg1;
| r1 = arg2;
| r2 = arg3;
| if (? >= ?) {
0x00004344 ldrlt r4, [r0], -0xb14 | r4 = *(r0);
| r0 += -0xb14;
| }
0x00004348 ldrd r4, r2, [r1] | __asm ("ldrd r4, r2, [r1]");
0x0000434c add r3, pc | r3 += pc;
0x0000434e ldr r1, [pc, 0x4c] |
0x00004350 adds r3, 8 | r3 += 8;
0x00004352 str r3, [r0] | *(r0) = r3;
0x00004354 strd r4, r2, [r0, 4] | __asm ("strd r4, r2, [r0, 4]");
0x00004358 add r1, pc | r1 = 0x86fa;
| if (r2 != 0) {
0x0000435a cbz r2, 0x436a |
0x0000435c ldr r3, [pc, 0x40] | r3 = *(0x43a0);
0x0000435e ldr r3, [r1, r3] | r3 = *((r1 + r3));
0x00004360 ldrb r3, [r3] | r3 = *(r3);
| if (r3 == 0) {
0x00004362 cbz r3, 0x437c | goto label_1;
| }
0x00004364 ldr r3, [r2, 4] | r3 = *((r2 + 4));
0x00004366 adds r3, 1 | r3++;
0x00004368 str r3, [r2, 4] | *((r2 + 4)) = r3;
| }
| label_0:
0x0000436a ldr r3, [pc, 0x38] |
0x0000436c movs r2, 0 | r2 = 0;
0x0000436e ldr r4, [sp], 4 | r4 = *(sp);
| sp += 4;
0x00004372 strd r2, r2, [r0, 0x10] | __asm ("strd r2, r2, [r0, 0x10]");
0x00004376 add r3, pc | r3 = 0x8720;
0x00004378 str r3, [r0, 0xc] | *((r0 + 0xc)) = r3;
0x0000437a bx lr | return;
| label_1:
0x0000437c adds r2, 4 | r2 += 4;
0x0000437e dmb ish | __asm ("dmb ish");
| do {
0x00004382 ldrex r3, [r2] | __asm ("ldrex r3, [r2]");
0x00004386 adds r3, 1 | r3++;
0x00004388 strex r1, r3, [r2] | __asm ("strex r1, r3, [r2]");
0x0000438c cmp r1, 0 |
0x0000438e bne 0x4382 |
| } while (r1 != 0);
0x00004390 dmb ish | __asm ("dmb ish");
0x00004394 b 0x436a | goto label_0;
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x7868 */
| #include <stdint.h>
|
| #define BIT_MASK(t,v) ((t)(-((v)!= 0)))&(((t)-1)>>((sizeof(t)*CHAR_BIT)-(v)))
|
; (fcn) fcn.00007868 () | void fcn_00007868 (int16_t arg1, int16_t arg2, int16_t arg3) {
| int16_t var_0h;
| int16_t var_4h;
| r0 = arg1;
| r1 = arg2;
| r2 = arg3;
0x00007868 push.w {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x0000786c mov r4, r2 | r4 = r2;
0x0000786e ldrd sl, r8, [r0] | __asm ("ldrd sl, r8, [r0]");
0x00007872 movw r2, 0x4ec5 |
0x00007876 movt r2, 0xc4ec | r2 = 0xc4ec4ec5;
0x0000787a sub sp, 0xc |
0x0000787c sub.w r3, r8, sl | r3 = r8 - sl;
0x00007880 asrs r3, r3, 2 | r3 >>= 2;
0x00007882 mul r3, r2, r3 | r3 = r2 * r3;
0x00007886 movw r2, 0x2762 |
0x0000788a movt r2, 0x276 | r2 = 0x2762762;
0x0000788e cmp r3, r2 |
| if (r3 == r2) {
0x00007890 beq.w 0x7adc | goto label_6;
| }
0x00007894 cmp r3, 1 |
0x00007896 mov r7, r1 | r7 = r1;
0x00007898 mov r1, r3 | r1 = r3;
0x0000789a it lo |
| if (r3 >= 1) {
0x0000789c movlo r1, 1 | r1 = 1;
| }
0x0000789e adds r3, r3, r1 | r3 += r1;
0x000078a0 mov sb, r0 | sb = r0;
0x000078a2 sub.w r6, r7, sl | r6 = r7 - sl;
0x000078a6 str r3, [sp, 4] | var_4h = r3;
| if (r3 >= r3) {
0x000078a8 bhs.w 0x7ab8 | goto label_7;
| }
0x000078ac cmp r3, 0 |
| if (r3 != 0) {
0x000078ae bne.w 0x7aca | goto label_8;
| }
0x000078b2 str r3, [sp] | *(sp) = r3;
| label_4:
0x000078b4 ldr r0, [sp] | r0 = *(sp);
0x000078b6 ldrd r1, r2, [r4] | __asm ("ldrd r1, r2, [r4]");
0x000078ba adds r5, r0, r6 | r5 = r0 + r6;
0x000078bc add.w r3, r5, 8 | r3 = r5 + 8;
0x000078c0 add r2, r1 | r2 += r1;
0x000078c2 str r3, [r0, r6] | *((r0 + r6)) = r3;
0x000078c4 mov r0, r5 | r0 = r5;
0x000078c6 bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x000078ca ldrd r1, r2, [r4, 0x18] | __asm ("ldrd r1, r2, [r4, 0x18]");
0x000078ce add.w r3, r5, 0x20 | r3 = r5 + 0x20;
0x000078d2 add.w r0, r5, 0x18 | r0 = r5 + 0x18;
0x000078d6 str r3, [r5, 0x18] | *((r5 + 0x18)) = r3;
0x000078d8 add r2, r1 | r2 += r1;
0x000078da bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x000078de ldrh r3, [r4, 0x30] | r3 = *((r4 + 0x30));
0x000078e0 cmp r7, sl |
0x000078e2 strh r3, [r5, 0x30] | *((r5 + 0x30)) = r3;
0x000078e4 it eq |
| if (r7 != sl) {
0x000078e6 ldreq r5, [sp] | r5 = *(sp);
| }
| if (r7 == sl) {
0x000078e8 beq 0x79c0 | goto label_9;
| }
0x000078ea ldr r3, [sp] | r3 = *(sp);
0x000078ec add.w fp, sl, 8 |
0x000078f0 add.w r4, sl, 0x20 | r4 = sl + 0x20;
0x000078f4 movs r2, 0 | r2 = 0;
0x000078f6 mov r5, fp | r5 = fp;
0x000078f8 add.w r6, r3, 0x34 | r6 = r3 + 0x34;
0x000078fc b 0x7970 |
| while (r3 != r5) {
0x000078fe str r3, [r6, -0x34] | *((r6 - 0x34)) = r3;
0x00007902 ldr r3, [r4, -0x18] | r3 = *((r4 - 0x18));
0x00007906 str r3, [r6, -0x2c] | *((r6 - 0x2c)) = r3;
| label_0:
0x0000790a ldr r3, [r4, -0x1c] | r3 = *((r4 - 0x1c));
0x0000790e sub.w r1, r6, 0x14 | r1 = r6 - 0x14;
0x00007912 strd r5, r2, [r4, -0x20] | __asm ("strd r5, r2, [r4, -0x20]");
0x00007916 str r3, [r6, -0x30] | *((r6 - 0x30)) = r3;
0x0000791a strb r2, [r4, -0x18] | *((r4 - 0x18)) = r2;
0x0000791e str r1, [r6, -0x1c] | *((r6 - 0x1c)) = r1;
0x00007922 ldr r3, [r4, -0x8] | r3 = *((r4 - 0x8));
0x00007926 cmp r3, r4 |
| if (r3 == r4) {
0x00007928 beq 0x79a0 | goto label_10;
| }
0x0000792a str r3, [r6, -0x1c] | *((r6 - 0x1c)) = r3;
0x0000792e ldr r3, [r4] | r3 = *(r4);
0x00007930 str r3, [r6, -0x14] | *((r6 - 0x14)) = r3;
| label_1:
0x00007934 ldr r3, [r4, -0x4] | r3 = *((r4 - 0x4));
0x00007938 ldr r0, [r4, -0x20] | r0 = *((r4 - 0x20));
0x0000793c str r3, [r6, -0x18] | *((r6 - 0x18)) = r3;
0x00007940 ldrb r3, [r4, 0x10] | r3 = *((r4 + 0x10));
0x00007942 cmp r0, r5 |
0x00007944 strb r3, [r6, -0x4] | *((r6 - 0x4)) = r3;
0x00007948 ldrb r3, [r4, 0x11] | r3 = *((r4 + 0x11));
0x0000794a strb r3, [r6, -0x3] | *((r6 - 0x3)) = r3;
| if (r0 != r5) {
0x0000794e beq 0x795c |
0x00007950 ldr r1, [r4, -0x18] | r1 = *((r4 - 0x18));
0x00007954 adds r1, 1 | r1++;
0x00007956 blx 0x267c | sym ();
0x0000795a movs r2, 0 | r2 = 0;
| }
0x0000795c add.w r3, r4, 0x34 | r3 = r4 + 0x34;
0x00007960 adds r4, 0x14 | r4 += 0x14;
0x00007962 cmp r7, r4 |
0x00007964 add.w r6, r6, 0x34 | r6 += 0x34;
0x00007968 add.w r5, r5, 0x34 | r5 += 0x34;
| if (r7 == r4) {
0x0000796c beq 0x79be | goto label_11;
| }
0x0000796e mov r4, r3 | r4 = r3;
0x00007970 sub.w r1, r6, 0x2c | r1 = r6 - 0x2c;
0x00007974 mov fp, r6 |
0x00007976 str r1, [r6, -0x34] | *((r6 - 0x34)) = r1;
0x0000797a ldr r3, [r4, -0x20] | r3 = *((r4 - 0x20));
0x0000797e cmp r3, r5 |
0x00007980 bne 0x78fe |
| }
0x00007982 ldr.w lr, [r5] |
0x00007986 ldr.w ip, [r5, 4] | ip = *((r5 + 4));
0x0000798a ldr r0, [r5, 8] | r0 = *((r5 + 8));
0x0000798c ldr r3, [r5, 0xc] | r3 = *((r5 + 0xc));
0x0000798e str lr, [r6, -0x2c] |
0x00007992 str ip, [r6, -0x28] | *((r6 - 0x28)) = ip;
0x00007996 str r0, [r6, -0x24] | *((r6 - 0x24)) = r0;
0x0000799a str r3, [r6, -0x20] | *((r6 - 0x20)) = r3;
0x0000799e b 0x790a | goto label_0;
| label_10:
0x000079a0 ldr.w lr, [r4] |
0x000079a4 ldr.w ip, [r4, 4] | ip = *((r4 + 4));
0x000079a8 ldr r0, [r4, 8] | r0 = *((r4 + 8));
0x000079aa ldr r3, [r4, 0xc] | r3 = *((r4 + 0xc));
0x000079ac str lr, [r6, -0x14] |
0x000079b0 str ip, [r6, -0x10] | *((r6 - 0x10)) = ip;
0x000079b4 str r0, [r6, -0xc] | *((r6 - 0xc)) = r0;
0x000079b8 str r3, [r6, -0x8] | *((r6 - 0x8)) = r3;
0x000079bc b 0x7934 | goto label_1;
| label_11:
0x000079be mov r5, fp | r5 = fp;
| label_9:
0x000079c0 cmp r7, r8 |
0x000079c2 add.w r4, r5, 0x34 | r4 = r5 + 0x34;
| if (r7 == r8) {
0x000079c6 beq 0x7a8c | goto label_12;
| }
0x000079c8 add.w r3, r5, 0x3c | r3 = r5 + 0x3c;
0x000079cc add.w r2, r7, 0x20 | r2 = r7 + 0x20;
0x000079d0 mov r1, r7 | r1 = r7;
0x000079d2 movs r5, 0 | r5 = 0;
0x000079d4 b 0x7a2e |
| while (r0 != r6) {
0x000079d6 str r6, [r3, -0x8] | *((r3 - 0x8)) = r6;
0x000079da ldr r6, [r2, -0x18] | r6 = *((r2 - 0x18));
0x000079de str r6, [r3] | *(r3) = r6;
| label_2:
0x000079e0 str r0, [r2, -0x20] | *((r2 - 0x20)) = r0;
0x000079e4 add.w r6, r3, 0x18 | r6 = r3 + 0x18;
0x000079e8 ldr r0, [r2, -0x1c] | r0 = *((r2 - 0x1c));
0x000079ec strb r5, [r2, -0x18] | *((r2 - 0x18)) = r5;
0x000079f0 str r6, [r3, 0x10] | *((r3 + 0x10)) = r6;
0x000079f2 str r0, [r3, -0x4] | *((r3 - 0x4)) = r0;
0x000079f6 ldr r0, [r2, -0x8] | r0 = *((r2 - 0x8));
0x000079fa str r5, [r2, -0x1c] | *((r2 - 0x1c)) = r5;
0x000079fe cmp r0, r2 |
| if (r0 == r2) {
0x00007a00 beq 0x7a5c | goto label_13;
| }
0x00007a02 str r0, [r3, 0x10] | *((r3 + 0x10)) = r0;
0x00007a04 ldr r0, [r2] | r0 = *(r2);
0x00007a06 str r0, [r3, 0x18] | *((r3 + 0x18)) = r0;
| label_3:
0x00007a08 ldr r0, [r2, -0x4] | r0 = *((r2 - 0x4));
0x00007a0c adds r1, 0x34 | r1 += 0x34;
0x00007a0e cmp r1, r8 |
0x00007a10 add.w r2, r2, 0x34 | r2 += 0x34;
0x00007a14 add.w r3, r3, 0x34 | r3 += 0x34;
0x00007a16 lsls r4, r6, 0xc | r4 = r6 << 0xc;
0x00007a18 str r0, [r3, -0x20] | *((r3 - 0x20)) = r0;
0x00007a1c ldrb r0, [r2, -0x24] | r0 = *((r2 - 0x24));
0x00007a20 strb r0, [r3, -0xc] | *((r3 - 0xc)) = r0;
0x00007a24 ldrb r0, [r2, -0x23] | r0 = *((r2 - 0x23));
0x00007a28 strb r0, [r3, -0xb] | *((r3 - 0xb)) = r0;
| if (r4 == r6) {
0x00007a2c beq 0x7a6e | goto label_14;
| }
0x00007a2e ldr r6, [r2, -0x20] | r6 = *((r2 - 0x20));
0x00007a32 add.w r0, r1, 8 | r0 = r1 + 8;
0x00007a36 str r3, [r3, -0x8] | *((r3 - 0x8)) = r3;
0x00007a3a cmp r0, r6 |
0x00007a3c bne 0x79d6 |
| }
0x00007a3e ldr.w fp, [r1, 8] | fp = *((r1 + 8));
0x00007a42 ldr.w lr, [r0, 4] |
0x00007a46 ldr.w ip, [r0, 8] | ip = *((r0 + 8));
0x00007a4a ldr r6, [r0, 0xc] | r6 = *((r0 + 0xc));
0x00007a4c str.w fp, [r3] | __asm ("str.w fp, [r3]");
0x00007a50 str.w lr, [r3, 4] | __asm ("str.w lr, [r3, 4]");
0x00007a54 str.w ip, [r3, 8] | __asm ("str.w ip, [r3, 8]");
0x00007a58 str r6, [r3, 0xc] | *((r3 + 0xc)) = r6;
0x00007a5a b 0x79e0 | goto label_2;
| label_13:
0x00007a5c ldr r0, [r2] | r0 = *(r2);
0x00007a5e str r0, [r3, 0x18] | *((r3 + 0x18)) = r0;
0x00007a60 ldr r0, [r2, 4] | r0 = *((r2 + 4));
0x00007a62 str r0, [r3, 0x1c] | *((r3 + 0x1c)) = r0;
0x00007a64 ldr r0, [r2, 8] | r0 = *((r2 + 8));
0x00007a66 str r0, [r3, 0x20] | *((r3 + 0x20)) = r0;
0x00007a68 ldr r0, [r2, 0xc] | r0 = *((r2 + 0xc));
0x00007a6a str r0, [r3, 0x24] | *((r3 + 0x24)) = r0;
0x00007a6c b 0x7a08 | goto label_3;
| label_14:
0x00007a6e subs r3, r1, r7 | r3 = r1 - r7;
0x00007a70 movw r2, 0x4ec5 |
0x00007a74 subs r3, 0x34 | r3 -= 0x34;
0x00007a76 movt r2, 0x4ec | r2 = 0x4ec4ec5;
0x00007a7a lsrs r3, r3, 2 | r3 >>= 2;
0x00007a7c mul r3, r2, r3 | r3 = r2 * r3;
0x00007a80 movs r2, 0x34 | r2 = 0x34;
0x00007a82 bic r3, r3, 0xc0000000 | r3 = BIT_MASK (r3, 0xc0000000);
0x00007a86 mla r2, r3, r2, r2 | __asm ("mla r2, r3, r2, r2");
0x00007a8a add r4, r2 | r4 += r2;
| label_12:
0x00007a8c cmp.w sl, 0 |
| if (sl != 0) {
0x00007a90 beq 0x7aa0 |
0x00007a92 ldr.w r1, [sb, 8] | r1 = *((sb + 8));
0x00007a96 mov r0, sl | r0 = sl;
0x00007a98 sub.w r1, r1, sl | r1 -= sl;
0x00007a9c blx 0x267c | sym ();
| }
0x00007aa0 ldr r2, [sp] | r2 = *(sp);
0x00007aa2 movs r3, 0x34 | r3 = 0x34;
0x00007aa4 ldr r1, [sp, 4] | r1 = var_4h;
0x00007aa6 str.w r2, [sb] | __asm ("str.w r2, [sb]");
0x00007aaa mla r3, r3, r1, r2 | __asm ("mla r3, r3, r1, r2");
0x00007aae strd r4, r3, [sb, 4] | __asm ("strd r4, r3, [sb, 4]");
0x00007ab2 add sp, 0xc |
0x00007ab4 pop.w {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| label_7:
0x00007ab8 movw r0, 0xffe8 |
0x00007abc str r2, [sp, 4] | var_4h = r2;
0x00007abe movt r0, 0x7fff | r0 = 0x7fffffe8;
| do {
0x00007ac2 blx 0x24f0 | sym ();
0x00007ac6 str r0, [sp] | *(sp) = r0;
0x00007ac8 b 0x78b4 | goto label_4;
| label_8:
0x00007aca ldr r3, [sp, 4] | r3 = var_4h;
0x00007acc movs r0, 0x34 | r0 = 0x34;
0x00007ace cmp r3, r2 |
0x00007ad0 it hs |
| if (r3 < r2) {
0x00007ad2 movhs r3, r2 | r3 = r2;
| }
0x00007ad4 mul r0, r3, r0 | r0 = r3 * r0;
0x00007ad8 str r3, [sp, 4] | var_4h = r3;
0x00007ada b 0x7ac2 |
| } while (1);
| label_6:
0x00007adc ldr r0, [pc, 0x44] |
0x00007ade add r0, pc | r0 = 0xf606;
0x00007ae0 blx 0x260c | fcn_0000260c ();
| do {
0x00007ae4 blx 0x2594 | fcn_00002594 ();
0x00007ae8 ldr r3, [sp] | r3 = *(sp);
| if (r3 != 0) {
0x00007aea cbnz r3, 0x7b0a | goto label_15;
| }
0x00007aec add.w r0, r5, 0x18 | r0 = r5 + 0x18;
0x00007af0 blx 0x2800 | fcn_00002800 ();
0x00007af4 mov r0, r5 | r0 = r5;
0x00007af6 blx 0x2800 | fcn_00002800 ();
| label_5:
0x00007afa blx 0x28d8 | r0 = fcn_000028d8 ();
0x00007afe mov r4, r0 | r4 = r0;
0x00007b00 mov r0, r5 | r0 = r5;
0x00007b02 blx 0x2800 | fcn_00002800 ();
0x00007b06 mov r0, r4 | r0 = r4;
0x00007b08 b 0x7ae4 |
| } while (1);
| label_15:
0x00007b0a ldrd r0, r3, [sp] | __asm ("ldrd r0, r3, [sp]");
0x00007b0e movs r1, 0x34 | r1 = 0x34;
0x00007b10 mul r3, r1, r3 | r3 = r1 * r3;
0x00007b14 mov r1, r3 | r1 = r3;
0x00007b16 blx 0x267c | sym ();
0x00007b1a b 0x7afa | goto label_5;
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x7b28 */
| #include <stdint.h>
|
; (fcn) fcn.00007b28 () | void fcn_00007b28 (int16_t arg1, int16_t arg2, int16_t arg3) {
| int16_t var_0h;
| int16_t var_4h;
| r0 = arg1;
| r1 = arg2;
| r2 = arg3;
0x00007b28 push.w {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x00007b2c mov r7, r0 | r7 = r0;
0x00007b2e ldr r5, [r0] | r5 = *(r0);
0x00007b30 sub sp, 0xc |
0x00007b32 mov r4, r1 | r4 = r1;
0x00007b34 mov r8, r2 | r8 = r2;
0x00007b36 cmp r5, 0 |
| if (r5 == 0) {
0x00007b38 beq.w 0x7cba | goto label_5;
| }
0x00007b3c movs r3, 0 | r3 = 0;
0x00007b3e str r3, [sp, 4] | var_4h = r3;
| label_4:
0x00007b40 ldr r4, [r4, 8] | r4 = *((r4 + 8));
0x00007b42 cmp r4, 0 |
| if (r4 == 0) {
0x00007b44 beq 0x7bd6 | goto label_0;
| }
0x00007b46 ldr.w r6, [r8] | r6 = *(r8);
0x00007b4a cmp r6, 0 |
| if (r6 == 0) {
0x00007b4c beq 0x7bdc | goto label_6;
| }
0x00007b4e ldr r0, [r6, 0x34] | r0 = *((r6 + 0x34));
0x00007b50 add.w sb, r6, 0x3c | sb = r6 + 0x3c;
0x00007b54 ldr r3, [r6] | r3 = *(r6);
0x00007b56 mov r5, r6 | r5 = r6;
0x00007b58 cmp r0, sb |
0x00007b5a str.w r3, [r8] | __asm ("str.w r3, [r8]");
0x00007b5e mov.w r3, 0 | r3 = 0;
0x00007b62 str r3, [r5], 4 | *(r5) = r3;
| r5 += 4;
| if (r0 != sb) {
0x00007b66 beq 0x7b70 |
0x00007b68 ldr r1, [r6, 0x3c] | r1 = *((r6 + 0x3c));
0x00007b6a adds r1, 1 | r1++;
0x00007b6c blx 0x267c | sym ();
| }
0x00007b70 ldr r0, [r6, 0x1c] | r0 = *((r6 + 0x1c));
0x00007b72 add.w sl, r6, 0x24 | sl = r6 + 0x24;
0x00007b76 cmp r0, sl |
| if (r0 != sl) {
0x00007b78 beq 0x7b82 |
0x00007b7a ldr r1, [r6, 0x24] | r1 = *((r6 + 0x24));
0x00007b7c adds r1, 1 | r1++;
0x00007b7e blx 0x267c | sym ();
| }
0x00007b82 ldr r0, [r6, 4] | r0 = *((r6 + 4));
0x00007b84 add.w fp, r6, 0xc |
0x00007b88 cmp r0, fp |
| if (r0 != fp) {
0x00007b8a beq 0x7b94 |
0x00007b8c ldr r1, [r6, 0xc] | r1 = *((r6 + 0xc));
0x00007b8e adds r1, 1 | r1++;
0x00007b90 blx 0x267c | sym ();
| }
0x00007b94 str.w fp, [r6, 4] | __asm ("str.w fp, [r6, 4]");
0x00007b98 mov r0, r5 | r0 = r5;
0x00007b9a ldrd r1, r2, [r4, 4] | __asm ("ldrd r1, r2, [r4, 4]");
0x00007b9e add r2, r1 | r2 += r1;
0x00007ba0 bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007ba4 str.w sl, [r6, 0x1c] | __asm ("str.w sl, [r6, 0x1c]");
0x00007ba8 add.w sl, r6, 0x1c | sl = r6 + 0x1c;
0x00007bac ldrd r1, r2, [r4, 0x1c] | __asm ("ldrd r1, r2, [r4, 0x1c]");
0x00007bb0 mov r0, sl | r0 = sl;
0x00007bb2 add r2, r1 | r2 += r1;
0x00007bb4 bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007bb8 mov r0, r6 | r0 = r6;
0x00007bba str sb, [r0, 0x34]! | *((r0 += 0x34)) = sb;
0x00007bbe ldrd r1, r2, [r4, 0x34] | __asm ("ldrd r1, r2, [r4, 0x34]");
0x00007bc2 add r2, r1 | r2 += r1;
0x00007bc4 bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007bc8 ldrh.w r3, [r4, 0x4c] | r3 = *((r4 + 0x4c));
0x00007bcc ldr r0, [r4, 0x50] | r0 = *((r4 + 0x50));
0x00007bce strh.w r3, [r6, 0x4c] | *((r6 + 0x4c)) = r3;
0x00007bd2 str r0, [r6, 0x50] | *((r6 + 0x50)) = r0;
0x00007bd4 b 0x7be8 |
| while (1) {
| label_0:
0x00007bd6 add sp, 0xc |
0x00007bd8 pop.w {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| label_6:
0x00007bdc adds r0, r4, 4 | r0 = r4 + 4;
0x00007bde bl 0x6c04 | r0 = fcn_00006c04 (r0);
0x00007be2 mov r6, r0 | r6 = r0;
0x00007be4 ldr r0, [r4, 0x50] | r0 = *((r4 + 0x50));
0x00007be6 str r0, [r6, 0x50] | *((r6 + 0x50)) = r0;
0x00007be8 ldr r1, [r7, 4] | r1 = *((r7 + 4));
0x00007bea str r6, [r7, 8] | *((r7 + 8)) = r6;
0x00007bec blx 0x25a0 | fcn_000025a0 ();
0x00007bf0 mov r3, r7 | r3 = r7;
0x00007bf2 ldr r2, [r3], 8 | r2 = *(r3);
| r3 += 8;
0x00007bf6 str.w r3, [r2, r1, lsl 2] | __asm ("str.w r3, [r2, r1, lsl 2]");
0x00007bfa ldr r5, [r4] | r5 = *(r4);
0x00007bfc cmp r5, 0 |
| if (r5 != 0) {
0x00007bfe bne 0x7ca2 | goto label_7;
| }
0x00007c00 b 0x7bd6 |
| }
| label_1:
0x00007c02 ldr r0, [r4, 0x34] | r0 = *((r4 + 0x34));
0x00007c04 add.w sl, r4, 0x3c | sl = r4 + 0x3c;
0x00007c08 ldr r3, [r4] | r3 = *(r4);
0x00007c0a mov sb, r4 | sb = r4;
0x00007c0c cmp r0, sl |
0x00007c0e str.w r3, [r8] | __asm ("str.w r3, [r8]");
0x00007c12 mov.w r3, 0 | r3 = 0;
0x00007c16 str r3, [sb], 4 | *(sb) = r3;
| sb += 4;
| if (r0 != sl) {
0x00007c1a beq 0x7c24 |
0x00007c1c ldr r1, [r4, 0x3c] | r1 = *((r4 + 0x3c));
0x00007c1e adds r1, 1 | r1++;
0x00007c20 blx 0x267c | sym ();
| }
0x00007c24 ldr r0, [r4, 0x1c] | r0 = *((r4 + 0x1c));
0x00007c26 add.w fp, r4, 0x24 |
0x00007c2a cmp r0, fp |
| if (r0 != fp) {
0x00007c2c beq 0x7c36 |
0x00007c2e ldr r1, [r4, 0x24] | r1 = *((r4 + 0x24));
0x00007c30 adds r1, 1 | r1++;
0x00007c32 blx 0x267c | sym ();
| }
0x00007c36 ldr r0, [r4, 4] | r0 = *((r4 + 4));
0x00007c38 add.w r3, r4, 0xc | r3 = r4 + 0xc;
0x00007c3c cmp r0, r3 |
| if (r0 != r3) {
0x00007c3e beq 0x7c4c |
0x00007c40 ldr r1, [r4, 0xc] | r1 = *((r4 + 0xc));
0x00007c42 str r3, [sp] | *(sp) = r3;
0x00007c44 adds r1, 1 | r1++;
0x00007c46 blx 0x267c | sym ();
0x00007c4a ldr r3, [sp] | r3 = *(sp);
| }
0x00007c4c str r3, [r4, 4] | *((r4 + 4)) = r3;
0x00007c4e mov r0, sb | r0 = sb;
0x00007c50 ldrd r1, r2, [r5, 4] | __asm ("ldrd r1, r2, [r5, 4]");
0x00007c54 add r2, r1 | r2 += r1;
0x00007c56 bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007c5a str.w fp, [r4, 0x1c] | __asm ("str.w fp, [r4, 0x1c]");
0x00007c5e add.w fp, r4, 0x1c |
0x00007c62 ldrd r1, r2, [r5, 0x1c] | __asm ("ldrd r1, r2, [r5, 0x1c]");
0x00007c66 mov r0, fp | r0 = fp;
0x00007c68 add r2, r1 | r2 += r1;
0x00007c6a bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007c6e mov r0, r4 | r0 = r4;
0x00007c70 str sl, [r0, 0x34]! | *((r0 += 0x34)) = sl;
0x00007c74 ldrd r1, r2, [r5, 0x34] | __asm ("ldrd r1, r2, [r5, 0x34]");
0x00007c78 add r2, r1 | r2 += r1;
0x00007c7a bl 0x6b6c | fcn_00006b6c (r0, r1, r2);
0x00007c7e ldrh.w r3, [r5, 0x4c] | r3 = *((r5 + 0x4c));
0x00007c82 strh.w r3, [r4, 0x4c] | *((r4 + 0x4c)) = r3;
| label_2:
0x00007c86 ldr r0, [r5, 0x50] | r0 = *((r5 + 0x50));
0x00007c88 ldr r1, [r7, 4] | r1 = *((r7 + 4));
0x00007c8a str r4, [r6] | *(r6) = r4;
0x00007c8c str r0, [r4, 0x50] | *((r4 + 0x50)) = r0;
0x00007c8e blx 0x25a0 | fcn_000025a0 ();
0x00007c92 ldr r3, [r7] | r3 = *(r7);
0x00007c94 ldr.w r2, [r3, r1, lsl 2] | offset_0 = r1 << 2;
| r2 = *((r3 + offset_0));
| if (r2 == 0) {
0x00007c98 cbz r2, 0x7cb4 | goto label_8;
| }
| label_3:
0x00007c9a ldr r5, [r5] | r5 = *(r5);
0x00007c9c cmp r5, 0 |
| if (r5 == 0) {
0x00007c9e beq 0x7bd6 | goto label_0;
| }
0x00007ca0 mov r6, r4 | r6 = r4;
| label_7:
0x00007ca2 ldr.w r4, [r8] | r4 = *(r8);
0x00007ca6 cmp r4, 0 |
| if (r4 != 0) {
0x00007ca8 bne 0x7c02 | goto label_1;
| }
0x00007caa adds r0, r5, 4 | r0 = r5 + 4;
0x00007cac bl 0x6c04 | r0 = fcn_00006c04 (r0);
0x00007cb0 mov r4, r0 | r4 = r0;
0x00007cb2 b 0x7c86 | goto label_2;
| label_8:
0x00007cb4 str.w r6, [r3, r1, lsl 2] | __asm ("str.w r6, [r3, r1, lsl 2]");
0x00007cb8 b 0x7c9a | goto label_3;
| label_5:
0x00007cba ldr r6, [r0, 4] | r6 = *((r0 + 4));
0x00007cbc cmp r6, 1 |
0x00007cbe ittt eq |
| if (r6 != 1) {
0x00007cc0 moveq r3, r0 | r3 = r0;
| }
| if (r6 != 1) {
0x00007cc2 streq r5, [r3, 0x18]! | *((r3 += 0x18)) = r5;
| }
| if (r6 == 1) {
0x00007cc6 str r3, [sp, 4] | var_4h = r3;
| }
| if (r6 != 1) {
0x00007cc8 beq 0x7ce2 |
0x00007cca cmp.w r6, 0x20000000 |
| if (r6 >= 0x20000000) {
0x00007cce bhs 0x7ce8 | goto label_9;
| }
0x00007cd0 lsls r6, r6, 2 | r6 <<= 2;
0x00007cd2 mov r0, r6 | r0 = r6;
0x00007cd4 blx 0x24f0 | sym ();
0x00007cd8 mov r2, r6 | r2 = r6;
0x00007cda mov r1, r5 | r1 = r5;
0x00007cdc str r0, [sp, 4] | var_4h = r0;
0x00007cde blx 0x2660 | fcn_00002660 ();
| }
0x00007ce2 ldr r3, [sp, 4] | r3 = var_4h;
0x00007ce4 str r3, [r7] | *(r7) = r3;
0x00007ce6 b 0x7b40 | goto label_4;
| label_9:
0x00007ce8 cmp.w r6, 0x40000000 |
| if (r6 > 0x40000000) {
0x00007cec blo 0x7cf2 |
0x00007cee blx 0x26f4 | sd_bus_release_name_async ();
| }
0x00007cf2 blx 0x2564 | fcn_00002564 ();
| do {
0x00007cf6 blx 0x2594 | fcn_00002594 ();
0x00007cfa movs r1, 0x54 | r1 = 0x54;
0x00007cfc mov r0, r4 | r0 = r4;
0x00007cfe blx 0x267c | sym ();
0x00007d00 ldc p7, c15, [lr], 0x3e8 | __asm ("ldc p7, c15, [lr], 0x3e8");
0x00007d04 stcl p6, c4, [sl, 0x14]! | __asm ("stcl p6, c4, [sl, 0x14]!");
0x00007d08 mov r0, sb | r0 = sb;
0x00007d0a blx 0x2800 | fcn_00002800 ();
0x00007d0e mov r0, r5 | r0 = r5;
0x00007d10 b 0x7cf6 |
| } while (1);
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x7f7c */
| #include <stdint.h>
|
; (fcn) fcn.00007f7c () | void fcn_00007f7c (int16_t arg1) {
| r0 = arg1;
0x00007f7c push {r3, r4, r5, lr} |
0x00007f7e mov r5, r0 | r5 = r0;
0x00007f80 ldr r4, [r0, 4] | r4 = *((r0 + 4));
| if (r4 != 0) {
0x00007f82 cbz r4, 0x7fc2 |
0x00007f84 ldr r0, [r4, 0x34] | r0 = *((r4 + 0x34));
0x00007f86 add.w r3, r4, 0x3c | r3 = r4 + 0x3c;
0x00007f8a cmp r0, r3 |
| if (r0 != r3) {
0x00007f8c beq 0x7f96 |
0x00007f8e ldr r1, [r4, 0x3c] | r1 = *((r4 + 0x3c));
0x00007f90 adds r1, 1 | r1++;
0x00007f92 blx 0x267c | sym ();
| }
0x00007f96 ldr r0, [r4, 0x1c] | r0 = *((r4 + 0x1c));
0x00007f98 add.w r3, r4, 0x24 | r3 = r4 + 0x24;
0x00007f9c cmp r0, r3 |
| if (r0 != r3) {
0x00007f9e beq 0x7fa8 |
0x00007fa0 ldr r1, [r4, 0x24] | r1 = *((r4 + 0x24));
0x00007fa2 adds r1, 1 | r1++;
0x00007fa4 blx 0x267c | sym ();
| }
0x00007fa8 ldr r0, [r4, 4] | r0 = *((r4 + 4));
0x00007faa add.w r3, r4, 0xc | r3 = r4 + 0xc;
0x00007fae cmp r0, r3 |
| if (r0 != r3) {
0x00007fb0 beq 0x7fba |
0x00007fb2 ldr r1, [r4, 0xc] | r1 = *((r4 + 0xc));
0x00007fb4 adds r1, 1 | r1++;
0x00007fb6 blx 0x267c | sym ();
| }
0x00007fba movs r1, 0x54 | r1 = 0x54;
0x00007fbc mov r0, r4 | r0 = r4;
0x00007fbe blx 0x267c | sym ();
| }
0x00007fc2 mov r0, r5 | r0 = r5;
0x00007fc4 pop {r3, r4, r5, pc} |
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/patool_extraction/rootfs.img_unblob_extracted/rootfs.img_extract/0-50593792.squashfs_v4_le_extract/usr/bin/feature-flag-service @ 0x97a8 */
| #include <stdint.h>
|
; (fcn) fcn.000097a8 () | void fcn_000097a8 (int16_t arg1, int16_t arg2) {
| r0 = arg1;
| r1 = arg2;
0x000097a8 invalid |
0x000097ac lsls r0, r2, 0xc | r0 = r2 << 0xc;
0x000097ae ldr r5, [r1, 4] | r5 = *((r1 + 4));
0x000097b0 mov r4, r1 | r4 = r1;
0x000097b2 movs r7, 0 | r7 = 0;
0x000097b4 mov r6, r0 | r6 = r0;
0x000097b6 ldr r1, [r1, 0xc] | r1 = *((r1 + 0xc));
0x000097b8 strd r7, r5, [r0] | __asm ("strd r7, r5, [r0]");
0x000097bc cmp r5, 1 |
0x000097be str r7, [r0, 8] | *((r0 + 8)) = r7;
0x000097c0 str r1, [r0, 0xc] | *((r0 + 0xc)) = r1;
0x000097c2 ldm.w r3, {r0, r1} | r0 = *(r3);
| r1 = *((r3 + 4));
0x000097c6 add.w r3, r6, 0x10 | r3 = r6 + 0x10;
0x000097ca stm.w r3, {r0, r1} | *(r3) = r0;
| *((r3 + 4)) = r1;
0x000097ce str r7, [r6, 0x18] | *((r6 + 0x18)) = r7;
0x000097d0 it eq |
| if (r5 != 1) {
0x000097d2 addeq r7, r6, 0x18 | r7 = r6 + 0x18;
| }
| if (r5 != 1) {
0x000097d6 beq 0x97f0 |
0x000097d8 cmp.w r5, 0x20000000 |
| if (r5 >= 0x20000000) {
0x000097dc bhs 0x984a | goto label_1;
| }
0x000097de lsls r5, r5, 2 | r5 <<= 2;
0x000097e0 mov r0, r5 | r0 = r5;
0x000097e2 blx 0x24f0 | sym ();
0x000097e6 mov r1, r7 | r1 = r7;
0x000097e8 mov r2, r5 | r2 = r5;
0x000097ea mov r7, r0 | r7 = r0;
0x000097ec blx 0x2660 | fcn_00002660 ();
| }
0x000097f0 ldr r5, [r4, 8] | r5 = *((r4 + 8));
0x000097f2 str r7, [r6] | *(r6) = r7;
| if (r5 == 0) {
0x000097f4 cbz r5, 0x9846 | goto label_2;
| }
0x000097f6 adds r0, r5, 4 | r0 = r5 + 4;
0x000097f8 bl 0x851c | fcn_0000851c (r0);
0x000097fc ldr r3, [r5, 0x50] | r3 = *((r5 + 0x50));
0x000097fe mov r4, r0 | r4 = r0;
0x00009800 ldr r1, [r6, 4] | r1 = *((r6 + 4));
0x00009802 str r3, [r0, 0x50] | *((r0 + 0x50)) = r3;
0x00009804 mov r0, r3 | r0 = r3;
0x00009806 str r4, [r6, 8] | *((r6 + 8)) = r4;
0x00009808 blx 0x25a0 | fcn_000025a0 ();
0x0000980c mov r3, r6 | r3 = r6;
0x0000980e ldr r2, [r3], 8 | r2 = *(r3);
| r3 += 8;
0x00009812 str.w r3, [r2, r1, lsl 2] | __asm ("str.w r3, [r2, r1, lsl 2]");
| do {
0x00009816 ldr r5, [r5] | r5 = *(r5);
| if (r5 == 0) {
0x00009818 cbz r5, 0x9846 | goto label_2;
| }
| label_0:
0x0000981a adds r0, r5, 4 | r0 = r5 + 4;
0x0000981c mov r7, r4 | r7 = r4;
0x0000981e bl 0x851c | fcn_0000851c (r0);
0x00009822 ldr r3, [r5, 0x50] | r3 = *((r5 + 0x50));
0x00009824 mov r4, r0 | r4 = r0;
0x00009826 ldr r1, [r6, 4] | r1 = *((r6 + 4));
0x00009828 str r0, [r7] | *(r7) = r0;
0x0000982a mov r0, r3 | r0 = r3;
0x0000982c str r3, [r4, 0x50] | *((r4 + 0x50)) = r3;
0x0000982e blx 0x25a0 | fcn_000025a0 ();
0x00009832 ldr r3, [r6] | r3 = *(r6);
0x00009834 ldr.w r2, [r3, r1, lsl 2] | offset_0 = r1 << 2;
| r2 = *((r3 + offset_0));
0x00009838 cmp r2, 0 |
0x0000983a bne 0x9816 |
| } while (r2 != 0);
0x0000983c str.w r7, [r3, r1, lsl 2] | __asm ("str.w r7, [r3, r1, lsl 2]");
0x00009840 ldr r5, [r5] | r5 = *(r5);
0x00009842 cmp r5, 0 |
| if (r5 != 0) {
0x00009844 bne 0x981a | goto label_0;
| }
| label_2:
0x00009846 mov r0, r6 | r0 = r6;
0x00009848 pop {r3, r4, r5, r6, r7, pc} |
| label_1:
0x0000984a cmp.w r5, 0x40000000 |
| if (r5 > 0x40000000) {
0x0000984e blo 0x9854 |
0x00009850 blx 0x26f4 | sd_bus_release_name_async ();
| }
0x00009854 blx 0x2564 | fcn_00002564 ();
0x00009858 blx 0x2594 | fcn_00002594 ();
0x0000985c mov r0, r6 | r0 = r6;
0x0000985e bl 0x6630 | fcn_00006630 (r0, r1);
0x00009862 mov r0, r6 | r0 = r6;
0x00009864 bl 0x7850 | r0 = fcn_00007850 (r0);
0x00009868 blx 0x28d8 | fcn_000028d8 ();
0x0000986c blx 0x2914 | fcn_00002914 ();
0x00009870 blx 0x27b4 | g_key_file_set_boolean ();
| }
[*] Function system used 1 times feature-flag-service