In Figure 2-14, byteArray is a 256-character array whose content is byteArray[] = {0, 1, ..., 0xff}.
Here is the disassembly of the function:
Figure 2-14. Practical Reverse Engineering. © 2014 by Bruce Dang |
The ARM processor is in Thumb state. We infer that this function takes two strings, as there is byte comparisons and the null byte ends the main loop. There is a 3rd argument which can terminate the main loop early as well. The function is a pretty straightforward translation to C.
int32_t comparison(char *str1, char *str2, uint32_t count) { /* LDR R6, =byteArray */ static BYTE byteArray[] = {0, 1, ..., 0xff}; /* CMP R2, #0 */ while (count > 0) { --count; /* SUBS R2, #1 */ /* LDRB R5, [R0] */ /* CBZ R5, loc_100E352 */ if (*str1 == '\0') break; /* LDRB R3, [R1] */ /* LDRB R4, [R3,R6] */ /* LDRB R3, [R5,R6] */ /* CMP R3, R4 */ if (byteArray[*str1] != byteArray[*str2]) break; ++str1; /* ADDS R0, #1 */ ++str2; /* ADDS R1, #1 */ } /* SUBS R2, #1 */ /* CMP R2, #0 */ if ((count - 1) >= 0) { /* LDRB R2, [R3,R6] */ /* LDRB R3, [R3,R6] */ /* SUBS R0, R3, R2 */ return byteArray[*str1] - byteArray[*str2]; } return NULL; /* MOVS R0, #0 */ }
No comments :
Post a Comment