如何编写等于此汇编代码的c / c ++代码?

时间:2018-07-18 07:53:33

标签: c++ c assembly

MSVC,在c ++ 11,/ O1或/ O2之前

喜欢 memcpy(p,“ 111112244551”,n);

但是“ 111112244551”是立即值,不在“ rdata”部分。

汇编代码: eax指向堆内存区域,而不是堆栈内存

    mov [eax+10h], 30303030h
    mov [eax+14h], 31323334h
    mov [eax+18h], 35353535h
    mov [eax+1ch], 3334h

如何编写c / c ++代码?请

不要:

p [0] = xx; p [1] = xx; p [n] = xx ...

-

-

其他(来自IDA):

    mov     dword ptr [eax+10h], 41424344h
    mov     dword ptr [eax+14h], 45464748h
    mov     word ptr [eax+18h], 65h

我想要c / c ++代码。

1 个答案:

答案 0 :(得分:4)

  

如何编写等于此机器代码的c / c ++代码?

通常不能。

C ++ 11(或C11)的semantics由各自的标准(对于C ++ 11,n3337,对于C11,n1570)定义而不是x86-64机器代码(或汇编程序)的代码。您可以要求其可观察的行为与您的汇编代码之一相似的C ++(或C)代码(但这是一个不同的问题)。

请注意compiler optimizationssequence pointsundefined behaviordecompilers的可能问题(它们解决了intractableundecidable的问题,可证明等同于haltingcode obfuscationas-if rule的问题。另请参阅有关static source code analysismalware analysisRice's theorem的信息。

您可能要问的(但这是一个非常不同的问题)是如何使某些特定的编译器(当然,版本和优化细节非常重要)生成特定的代码。通常没有答案(当然asm指令除外,它们的解释和语义不是由标准定义,而是由您的特定编译器或C或C ++实现定义)。

请注意,编程语言是一种规范,而不是软件。

(所以您很困惑,严格来说,您的问题没有任何意义,所以不清楚)。

请注意,您的汇编代码可能是使用您认为已经使用过的编译器生成的。例如,后处理器可以在链接器之前“转换”汇编程序代码(并仍然保留原始的C或C ++语义)。