机器码中的sizeof()等价是多少?

问题描述 投票:1回答:3

我目前正在逆向工程游戏,我遇到了一个问题,我需要调用GetRawInputData,它希望pcbSize作为其参数之一。

通常在C中我会写sizeof(pData)但我不知道如何在机器代码中解决这个问题。

assembly x86-64 machine-code
3个回答
3
投票

sizeof纯粹是C类型系统的构造,并且在编译时完全解析为普通数字;在机器代码中没有这样的东西,你可能只是在与push大小相对应的movpData中找到一个直接值。

例如,在我们的程序中,序列

RAWINPUT raw;
UINT dwSize = sizeof(raw);
GetRawInputData((HRAWINPUT)lparam, RID_INPUT, &raw, &dwSize, sizeof(RAWINPUTHEADER));

由gcc 4.8翻译为

0x005f351d <+125>:   lea    eax,[ebp-0x48]                   // eax = &dwSize
0x005f3520 <+128>:   mov    DWORD PTR [esp+0xc],eax          // pcbSize = eax = &dwSize
0x005f3524 <+132>:   lea    eax,[ebp-0x38]                   // eax = &raw
0x005f3527 <+135>:   mov    DWORD PTR [ebp-0x48],0x28        // dwSize = sizeof(raw) i.e. 38
0x005f352e <+142>:   mov    DWORD PTR [esp+0x10],0x10        // cbSizeHeader = sizeof(RAWINPUTHEADER) i.e. 16
0x005f3536 <+150>:   mov    DWORD PTR [esp+0x8],eax          // pdata = eax = &raw
0x005f353a <+154>:   mov    DWORD PTR [esp+0x4],0x10000003   // uiCommand = RID_INPUT
0x005f3542 <+162>:   mov    DWORD PTR [esp],ecx              // hRawInput = lparam
0x005f3545 <+165>:   call   DWORD PTR ds:0x20967fc           // call GetRawInputData

2
投票

没有任何等价物。 sizeof是编译时构造它只被转换为汇编中的数字。即sizeof(pcbSize)将是48或1024左右。您需要手动计算大小,或者在需要时以反汇编代码查找大小。


0
投票

在汇编源代码中,您可以让汇编程序计算汇编时常量

msg: db "hello world", 10            ; 10 = ASCII newline
msglen equ $-msg

然后当你写mov edx, msglen时,它会用常数替换来组装到mov edx, imm32。有关一些例子,请参阅How does $ work in NASM, exactly?

但是在最终的机器代码中,汇编时间常数都变成了立即数或数据常量。 (例如,数据或rodata部分中的ptr_and_length: dq msg, msglen汇编成一个地址和一个qword整数,它只是在目标文件中,而不是在运行时从任何东西计算出来的。)


(汇编时间常数也可以用作宏或其他指令中的重复计数。 times power imul eax, ecx汇集了许多imul指令的块。 power是用EQU定义的整数常数。或NASM %rep n / ... / %endrep

或者在汇编时表达式中使用,因此大小本身并不是字面上存在于目标文件中,而是基于它的一些计算结果。 (例如mov edx, msglen+2mov ecx, arrbytes/4,后者可能作为循环的界限,用dwords而不是字节计数)。

© www.soinside.com 2019 - 2024. All rights reserved.