繁体   English   中英

汇编如何在没有ZF标志访问的情况下将JNE转换为C代码

[英]Assembly how to translate JNE to C Code without ZF flag access

ASM到C代码模拟差不多完成..只是试图解决这些第二遍问题。

假设我有这个ASM功能

401040  MOV EAX,DWORD PTR [ESP+8]
401044  MOV EDX,DWORD PTR [ESP+4]
401048  PUSH ESI
401049  MOV ESI,ECX
40104B  MOV ECX,EAX
40104D  DEC EAX
40104E  TEST ECX,ECX
401050  JE 401083
401052  PUSH EBX
401053  PUSH EDI
401054  LEA EDI,[EAX+1]
401057  MOV AX,WORD PTR [ESI]
40105A  XOR EBX,EBX
40105C  MOV BL,BYTE PTR [EDX]
40105E  MOV ECX,EAX
401060  AND ECX,FFFF
401066  SHR ECX,8
401069  XOR ECX,EBX
40106B  XOR EBX,EBX
40106D  MOV BH,AL
40106F  MOV AX,WORD PTR [ECX*2+45F81C]
401077  XOR AX,BX
40107A  INC EDX
40107B  DEC EDI
40107C  MOV WORD PTR [ESI],AX
40107F  JNE 401057
401081  POP EDI
401082  POP EBX
401083  POP ESI
401084  RET 8

我的程序会为它创建以下内容。

int Func_401040() {
    regs.d.eax = *(unsigned int *)(regs.d.esp+0x00000008);
    regs.d.edx = *(unsigned int *)(regs.d.esp+0x00000004);
    regs.d.esp -= 4;
    *(unsigned int *)(regs.d.esp) = regs.d.esi;
    regs.d.esi = regs.d.ecx;
    regs.d.ecx = regs.d.eax;
    regs.d.eax--;
    if(regs.d.ecx == 0)
        goto label_401083;
    regs.d.esp -= 4;
    *(unsigned int *)(regs.d.esp) = regs.d.ebx;
    regs.d.esp -= 4;
    *(unsigned int *)(regs.d.esp) = regs.d.edi;
    regs.d.edi = (regs.d.eax+0x00000001);
    regs.x.ax = *(unsigned short *)(regs.d.esi);
    regs.d.ebx ^= regs.d.ebx;
    regs.h.bl = *(unsigned char *)(regs.d.edx);
    regs.d.ecx = regs.d.eax;
    regs.d.ecx &= 0x0000FFFF;
    regs.d.ecx >>= 0x00000008;
    regs.d.ecx ^= regs.d.ebx;
    regs.d.ebx ^= regs.d.ebx;
    regs.h.bh = regs.h.al;
    regs.x.ax = *(unsigned short *)(regs.d.ecx*0x00000002+0x0045F81C);
    regs.x.ax ^= regs.x.bx;
    regs.d.edx++;
    regs.d.edi--;
    *(unsigned short *)(regs.d.esi) = regs.x.ax;
    JNE 401057
    regs.d.edi = *(unsigned int *)(regs.d.esp);
    regs.d.esp += 4;
    regs.d.ebx = *(unsigned int *)(regs.d.esp);
    regs.d.esp += 4;
    label_401083:
    regs.d.esi = *(unsigned int *)(regs.d.esp);
    regs.d.esp += 4;
    return 0x8;
}

由于JNE 401057不使用CMPTEST

我如何修复在C代码中使用它?

修改标志的最新指令是dec ,它在操作数为0时设置ZF。因此, jne大约等于if (regs.d.edi != 0) goto label_401057;

顺便说一句: ret 8不等于return 8 ret指令的操作数是返回时添加到ESP的字节数。 (它通常用于清理堆栈。)它有点像

return eax;
regs.d.esp += 8;

除了那个半显然,这在C中不起作用 - return使得任何代码无法访问。

这实际上是调用约定的一部分- [ESP+4][ESP+8]是传递给函数的参数, ret正在清除它们。 这不是通常的C调用约定; 考虑到函数需要ECX中的值,它看起来更像fastcall或thiscall。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM