首页
社区
课程
招聘
[求助]UPX中使用的UCL库 汇编源码转换问题
发表于: 2013-2-5 14:14 4582

[求助]UPX中使用的UCL库 汇编源码转换问题

2013-2-5 14:14
4582
近日把UPX 3.08 源码编译了一下, 发现期中的UCL库有点意思
其中 原始汇编代码 是 使用 符合 nasm 编译器语法写的, 但最后 通过某种自动工具 将代码转化成masm可以编译的东西.
小弟很想知道是神马工具,和其中转化的原理,求解?
附 其中 CRC 算法的 汇编源码. :

// nasm 汇编源码

%include "conf.ash"

        .text

%define USE_MOVZX

%macro CRC_CORE 0
  %ifdef USE_MOVZX
        movzx   ebx, al
  %else
        mov     bl, al
  %endif
        shr     eax, 8
        xor     eax, [edi + 4*ebx]
%endmacro


%macro CRC 0
        xor     al, [esi]
        inc     esi
        CRC_CORE
%endmacro


; /***********************************************************************
; // ucl_crc32_asm(unsigned crc, const void *buf, unsigned len, const unsigned *tab)
; ************************************************************************/

UCL_PUBLIC ucl_crc32_asm

        push_cregs
        xor     eax, eax
%ifndef USE_MOVZX
        xor     ebx, ebx
%endif
        mov     esi, [esp + cregs_size + 8]     ; esi = buf
        mov     ecx, [esp + cregs_size + 12]    ; ecx = len
        mov     edi, [esp + cregs_size + 16]    ; edi = crc32_table
        test    esi, esi
        jz      return
        mov     eax, [esp + cregs_size + 4]     ; eax = crc
        not     eax

%if 1
        test    ecx, ecx
        jz      done
; the first 0..3 bytes (until esi is dword aligned)
align_loop:
        test     esi, 3
        jz      .break
        CRC
        dec     ecx
        jnz     align_loop
.break:
%endif


; the unrolled loop - 8 bytes per loop
        mov     edx, ecx
        shr     edx, 3
        jz      remainder

        align_code 16
unrolled_loop:
    %rep 2
        xor     eax, [esi]
        add     esi, byte 4
        CRC_CORE
        CRC_CORE
        CRC_CORE
        CRC_CORE
    %endrep
        dec     edx
        jnz     unrolled_loop


; the remaining 0..7 bytes
remainder:
        and     ecx, byte 7
        jz      done
small_loop:
        CRC
        dec     ecx
        jnz     small_loop

done:
        not     eax
return:
        pop_cregs
        ret

UCL_PUBLIC_END ucl_crc32_asm


; vi:ts=8:et



// masm 可编译的代码

;  Markus F.X.J. Oberhumer
;  <markus@oberhumer.com>
;  http://www.oberhumer.com/opensource/ucl/
;

; /***** DO NOT EDIT - GENERATED AUTOMATICALLY *****/

include asminit.def
public _ucl_crc32_asm
_ucl_crc32_asm:
db 85,87,86,83,81,82,49,192,139,116,36,32,139,76,36,36
db 139,124,36,40,133,246,15,132,159,0,0,0,139,68,36,28
db 247,208,133,201,15,132,143,0,0,0,247,198,3,0,0,0
db 116,15,50,6,70,15,182,216,193,232,8,51,4,159,73,117
db 233,137,202,193,234,3,116,93,144,141,180,38,0,0,0,0
db 51,6,131,198,4,15,182,216,193,232,8,51,4,159,15,182
db 216,193,232,8,51,4,159,15,182,216,193,232,8,51,4,159
db 15,182,216,193,232,8,51,4,159,51,6,131,198,4,15,182
db 216,193,232,8,51,4,159,15,182,216,193,232,8,51,4,159
db 15,182,216,193,232,8,51,4,159,15,182,216,193,232,8,51
db 4,159,74,117,171,131,225,7,116,15,50,6,70,15,182,216
db 193,232,8,51,4,159,73,117,241,247,208,90,89,91,94,95
db 93,195,144,144,144,144,144,144,144,144,144,144,144,144,144,144
end

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
关注。。会不会是nasm编译出来的二进制,直接用转成db的
2013-2-5 14:32
0
雪    币: 3
活跃值: (353)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
应该是编译出来的二进制了
2013-2-7 21:39
0
游客
登录 | 注册 方可回帖
返回
//