首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

肯求好手帮忙把一个50行汇编代码的ARM 函数改成C语言(成了请到东莞HAPPY:P,哈哈)

2013-01-05 
肯求高手帮忙把一个50行汇编代码的ARM 函数改成C语言(成了请到东莞HAPPY:P,哈哈)不懂ARM汇编,有一个函数,

肯求高手帮忙把一个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;
}

热点排行