肯求高手帮忙把一个50行汇编代码的ARM 函数改成C语言(成了请到东莞HAPPY:P,哈哈)
不懂ARM汇编,有一个函数,有50行的汇编代码,我想还原成C语言,可惜不懂ARM汇编指令。
如果您在深圳,或者方便去东莞或者去惠州淡水,一定请你去HAPPY,绝不食言 :)
0044d6f8 <get_cust_id>:
44d6f8: e92d41ff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
44d6fc: e1a08000 mov r8, r0
44d700: e3a00010 mov r0, #16 ; 0x10
44d704: ebff4a6a bl 4200b4 <malloc>
44d708: e2504000 subs r4, r0, #0 ; 0x0
44d70c: 0a000005 beq 44d728 <get_cust_id+0x30>
44d710: e3a00010 mov r0, #16 ; 0x10
44d714: ebff4a66 bl 4200b4 <malloc>
44d718: e2505000 subs r5, r0, #0 ; 0x0
44d71c: 1a000004 bne 44d734 <get_cust_id+0x3c>
44d720: e1a00004 mov r0, r4
44d724: ebff491f bl 41fba8 <free>
44d728: e59f0098 ldr r0, [pc, #152] ; 44d7c8 <get_cust_id+0xd0>
44d72c: ebff3c74 bl 41c904 <debug_stmt>
44d730: ea000021 b 44d7bc <get_cust_id+0xc4>
44d734: e3a01000 mov r1, #0 ; 0x0
44d738: e3a02010 mov r2, #16 ; 0x10
44d73c: ebff0db4 bl 410e14 <memset>
44d740: e59f1084 ldr r1, [pc, #132] ; 44d7cc <get_cust_id+0xd4>
44d744: e3a02010 mov r2, #16 ; 0x10
44d748: e1a00004 mov r0, r4
44d74c: ebff0dab bl 410e00 <memcpy>
44d750: e28d6008 add r6, sp, #8 ; 0x8
44d754: e3a03000 mov r3, #0 ; 0x0
44d758: e1a00003 mov r0, r3
44d75c: e59f106c ldr r1, [pc, #108] ; 44d7d0 <get_cust_id+0xd8>
44d760: e1a02006 mov r2, r6
44d764: e58d300c str r3, [sp, #12]
44d768: ebfffdde bl 44cee8 <_encrypt_open_km>
44d76c: e3500000 cmp r0, #0 ; 0x0
44d770: e58d000c str r0, [sp, #12]
44d774: 0a00000c beq 44d7ac <get_cust_id+0xb4>
44d778: e1a03004 mov r3, r4
44d77c: e3a07010 mov r7, #16 ; 0x10
44d780: e3a01001 mov r1, #1 ; 0x1
44d784: e3a02002 mov r2, #2 ; 0x2
44d788: e88d00a0 stm sp, {r5, r7}
44d78c: ebfffc80 bl 44c994 <_encrypt_km_vendor_cipher>
44d790: e1a01005 mov r1, r5
44d794: e1a00008 mov r0, r8
44d798: e1a02007 mov r2, r7
44d79c: ebff0d97 bl 410e00 <memcpy>
44d7a0: e1a01006 mov r1, r6
44d7a4: e28d000c add r0, sp, #12 ; 0xc
44d7a8: ebfffd74 bl 44cd80 <_encrypt_close_km>
44d7ac: e1a00004 mov r0, r4
44d7b0: ebff48fc bl 41fba8 <free>
44d7b4: e1a00005 mov r0, r5
44d7b8: ebff48fa bl 41fba8 <free>
44d7bc: e3a00000 mov r0, #0 ; 0x0
44d7c0: e28dd010 add sp, sp, #16 ; 0x10
44d7c4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
44d7c8: 00d52bf1 ldrsheq r2, [r5], #177
44d7cc: 0162d48c cmneq r2, ip, lsl #9
44d7d0: 0044c0fc strdeq ip, [r4], #-12
[解决办法]
void get_cust_id(char *buf)
{
char * c, *d;
__arm__(push {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr});
c = (char *)malloc(16);
if (c != NULL)
{
if ((d != (char *)malloc(16)) != NULL)
memset(d, 0, 16);
memcpy(c, 0162d48c, 16);
else
free(c);
}
else
{
debug_stmt(00d52bf1)
}
}
无聊,搞了一点点。看吧,没意义的,函数参数都是程序中由链接器生成的值,代码稍有变动就作费了,这样的c代码也是编译不成程序的……而且不能编译就不能调试,谁也不可能保证转出来的代码对……
[解决办法]
呵呵,说下理解,纯娱乐!
这个函数应该有三个参数,一个是buf;另个两个的类型未知,但从程序上来看不会超出4字节的大小,它们分别是“add r6, sp, #8”这与之前入栈的对照是r1,“str r3, [sp, #12]”这与之前入栈的对照是r2,而r0,r1,r2,r3在arm中都是用于函数调用传参的,不过最让人不解的是r2(即sp + 12)的使用,这个参数在使用前先清空为0,然后又将_encrypt_open_km的返回值给了它,在整个程序中看不出有什么重要作用,除非是用于对km这个东西的互斥。
还有就是这个函数的返回值总是0,执行失败也是,这…………
int get_cust_id(char *buf_out, type x, type ret)
{
char *ptr_1, *prt_2;
if((ptr_1 = (char *)malloc(16)) == NULL)
{
debug_stmt(00d52bf1);
return 0;
}
if((ptr_2 = (char *)malloc(16)) == NULL)
{
free(ptr_1);
debug_stmt(00d52bf1);
return 0;
}
memset(ptr_2, 0, 16);
memcpy(ptr_1, 0162d48c, 16);
ret = _encrypt_open_km(0, 0044c0fc, x);
if(ret != 0)
{
_encrypt_km_vendor_chipher(ret, 1, 2, ptr_1, ptr_2, 16);
memcpy(buf_out, ptr_2, 16);
_encrypt_close_km(ret, x);
}
free(ptr_1);
free(ptr_2);
return 0;
}