2

我正在尝试将 CrapWOW 哈希从http://www.team5150.com/~andrew/noncryptohashzoo/CrapWow.html转换为 delphi 或者更确切地说是 basm。我的asm技能非常有限,但我认为这不会太难......

无论如何,在一些关于 asm 转换的网页的帮助下,我来到了这个,但它不起作用......特别是,对于最后一部分,我不知道如何转换。这是将寄存器分配给参数和返回参数吗?

function CrapWow(key: PAnsiChar; len, seed: Cardinal): Cardinal;
//finline u32 fastcall CrapWow( const u8 *key, u32 len, u32 seed ) {
// #if !defined(__LP64__) && !defined(_MSC_VER) && ( defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) )
// // esi = k, ebx = h
//  u32 hash;
//  asm(
asm
  lea esi, 5052acdbh[ecx+esi] //leal 0x5052acdb(%ecx,%esi), %esi
  mov ebx, ecx                //movl %ecx, %ebx
  cmp ecx, 8                  //cmpl $8, %ecx
  jb @DW

@QW:                        //QW%=:
  mov eax, 5052acdbh          //movl $0x5052acdb, %eax
  mul [edi]                   //mull (%edi)                  << CRASH HERE
  add ecx, -8                 //addl $-8, %ecx
  xor ebx, eax                //xorl %eax, %ebx
  xor esi, edx                //xorl %edx, %esi
  mov eax, 57559429h          //movl $0x57559429, %eax
  mul 4[edi]                  //mull 4(%edi)
  xor esi, eax                //xorl %eax, %esi
  xor ebx, edx                //xorl %edx, %ebx
  add edi, 8                  //addl $8, %edi
  cmp ecx, 8                  //cmpl $8, %ecx
  jae @QW                     //jae QW%=

@DW:                        //DW%=:
  cmp ecx, 4                  //cmpl $4, %ecx
  jb @B                       //jb B%=
  mov eax, 5052acdbh          //movl $0x5052acdb, %eax
  mul [edi]                   //mull (%edi)
  add edi, 4                  //addl $4, %edi
  xor ebx, eax                //xorl %eax, %ebx
  add ecx, -4                 //addl $-4, %ecx
  xor esi, edx                //xorl %edx, %esi

@B:                         //B%=:
  test ecx, ecx               //testl %ecx, %ecx
  jz @F                       //jz F%=
  shl ecx, 3                  //shll $3, %ecx
  mov edx, 1                  //movl $1, %edx
  mov eax, 57559429h          //movl $0x57559429, %eax
  shl edx, cl                 //shll %cl, %edx
  add edx, -1                 //addl $-1, %edx
  and edx, [edi]              //andl (%edi), %edx
  mul edx                     //mull %edx
  xor esi, eax                //xorl %eax, %esi
  xor ebx, edx                //xorl %edx, %ebx

@F:                         //F%=:
  lea edx, 5052acdbh[esi]     //leal 0x5052acdb(%esi), %edx
  xor edx, ebx                //xorl %ebx, %edx
  mov eax, 5052acdbh          //movl $0x5052acdb, %eax
  mul edx                     //mull %edx
  xor eax, ebx                //xorl %ebx, %eax
  xor esi, edx                //xorl %edx, %esi
  xor eax, esi                //xorl %esi, %eax

//No idea how to convert this...
//    : =a(hash), =c(len), =S(len), =D(key)
//    : c(len), S(seed), D(key)
//    : %ebx, %edx, cc
//  );
//  return hash;}
end;

我很高兴能在这方面得到一些帮助。

骑士杀手

4

2 回答 2

1

它看起来在初始化之前使用了 EDI。它似乎稍后也会发生在其他寄存器上。您应该检查原始代码编译器在输入过程代码时如何设置这些寄存器,并检查您是否正确复制了它。还查看对您问题的评论。

于 2011-11-23T15:47:10.917 回答
0

是的..它看起来在初始化之前使用了 EDI,您应该使用指针传递 len 参数..因为您使用的是“mul [edi]”指令。

于 2013-05-17T20:54:32.103 回答