在 c 代码中使用符号扩展移动

逆向工程 拆卸 部件 反编译 C
2021-07-09 13:47:27

我很困惑

movsx(带符号扩展的移动)

我正在尝试将汇编代码转换为 C。但坚持使用 movsx 部分。

在此处输入图片说明

这是我到目前为止得到的代码。

#include <stdio.h>
#include <windows.h>

int main(){
    char str[24] = "Aegisone security";//17+1

    char *a;
    a = &str[24]-24;
    char a2 = -*(a+6);


    //str[32] = *(a+6);

    //char str2[4]=a;
    MessageBox(0,"Hello","reversing",0);
    return 0;
}

你能帮我看一些在 C 代码中使用 movsx 的例子吗?我困扰的部分是

MOVSX EDX , BYTE PTR DS:[ECX+6]
MOV DWORD PTR SS: [EBP-20],EDX'

我需要一些关于这部分的更详细的解释
我上面的 C 代码显示有点不同

MOVESX EDX,BYTE PTR DS:[ECX+6]
NEG EDX
MOV BYTE PTR SS:[EBP-20],DL
1个回答

当有符号变量转换为更大/更宽的有符号变量时,C 编译器会自动处理它们的符号扩展。但是,您将该变量定义为char标准不强制执行符号的 a,因此编译器没有义务对该变量赋值进行符号扩展。

但最重要的部分是,只有当您将 替换为char时,int您才创建了一个 4 字节长的变量,该变量实际上可以进行符号扩展。

最后但并非最不重要的是,删除减号显然删除了NEG EDX指令。

如果没有,看起来您仍然需要更改分配行 ( str[32] = *(a+6);) 以将目标视为双字大小的数组,因为您有兴趣分配整个双字。除非你有类似的东西MOV BYTE PTR SS:[EBP-20],DLMOV DWORD PTR SS: [EBP-20],EDX否则你的代码仍然会有(int*)str[8] = *(a+6);

我用 8 替换了 32,因为我们索引的是 4 字节长数组而不是单字节长数组。