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

wmajia 2012-11-09 05:19:27
不懂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
...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HMGuardian 2012-11-10
  • 打赏
  • 举报
回复
嗯,确实是一个参数的话type ret可以作为临时变量,因为在使用前它被赋0值,所以即便是参数也应该不会该函数有影响。type x的话,如果是参数的话对该程序是有影响的。如果不是参数的话,那么这个值应该是_encrypt_open_km(0, 0044c0fc, x);通过引用参数返回的一个东西……
wmajia 2012-11-10
  • 打赏
  • 举报
回复
十分感谢! 我现在通过单独写一个进程调用该函数,然后对这个进程文件进行加密处理,执行这个文件之前解密。 这样避免被这个函数定位。 另外。这个函数确确定定是一个char * buf,我在程序中都有调用使用。就是因为被别人拿来定位关键算法,才想重写功能。
引用 8 楼 JQGuardian 的回复:
呵呵,说下理解,纯娱乐! 这个函数应该有三个参数,一个是buf;另个两个的类型未知,但从程序上来看不会超出4字节的大小,它们分别是“add r6, sp, #8”这与之前入栈的对照是r1,“str r3, [sp, #12]”这与之前入栈的对照是r2,而r0,r1,r2,r3在arm中都是用于函数调用传参的,不过最让人不解的是r2(即sp + 12)的使用,这个参数在使用前先清空为0,然后又将_……
HMGuardian 2012-11-10
  • 打赏
  • 举报
回复
呵呵,说下理解,纯娱乐! 这个函数应该有三个参数,一个是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;
}
wmajia 2012-11-09
  • 打赏
  • 举报
回复
44d7a0: e1a01006 mov r1, r6 44d7a4: e28d000c add r0, sp, #12 ; 0xc 44d7a8: ebfffd74 bl 44cd80 <_encrypt_close_km> 这些是怎么调用的,都没有
wmajia 2012-11-09
  • 打赏
  • 举报
回复
楼上的我先测试一下,测试通过联系你。先谢过了!! 这个是库中的代码(方案商是不提供源代码的),我的目标不是替换这个函数,而是自己的程序中一定要调用库中这个函数 而现在有人盯上我们的程序,就是通过这个函数定位到我的算法,所以,我必须实现一个功能一样的就可以的,但名字变了的函数。这样他就没办法定位到我的一段关键代码。
引用 4 楼 JQGuardian 的回复:
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……
HMGuardian 2012-11-09
  • 打赏
  • 举报
回复
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代码也是编译不成程序的……而且不能编译就不能调试,谁也不可能保证转出来的代码对……
wmajia 2012-11-09
  • 打赏
  • 举报
回复
我只需要把这一段代码还原成C,里面调用什么函数,原样调用。 这个函数的参数 是传进一个char * buff进去,退出时,往buff写16个字节的数据出来。 可以付费!
wmajia 2012-11-09
  • 打赏
  • 举报
回复
里面调用的自定义函数不需要你改写啊,只要把这50行改成C啊 自定义的,也就在C里面直接调用啊,名字都有的。
HMGuardian 2012-11-09
  • 打赏
  • 举报
回复
估计木有这样无聊的人,写出来也很难调试,因为调用了很多自定义的函数。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧