首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序集到basm的转换

程序集到basm的转换
EN

Stack Overflow用户
提问于 2011-11-23 19:19:49
回答 2查看 462关注 0票数 2

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

总之,在一些关于asm转换的网页的帮助下,我来到了这里,但它不起作用…特别是最后一部分,我不知道如何转换。这是寄存器对参数和返回参数的赋值吗?

代码语言:javascript
复制
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;

如果能在这方面得到一些帮助,我将非常高兴。

knight_killer

EN

回答 2

Stack Overflow用户

发布于 2011-11-23 23:47:11

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-18 04:54:32

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8241287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档