Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写跨平台(32位和64位)的垃圾汇编代码? 我需要编写一些(安全使用)随机垃圾汇编代码,用于C++项目中的一些混淆练习。 到目前为止,我只能找到: #define JUNKCODE \ __asm{push eax} \ __asm{xor eax, eax} \ __asm{setpo al} \ __asm{push edx} \ __asm{xor edx, eax} \ __asm{sal edx, 2} \ __asm{xchg eax, edx} \ __asm{pop edx} \ __asm{or eax, ecx} \ __asm{pop eax}_C++_Assembly - Fatal编程技术网

如何编写跨平台(32位和64位)的垃圾汇编代码? 我需要编写一些(安全使用)随机垃圾汇编代码,用于C++项目中的一些混淆练习。 到目前为止,我只能找到: #define JUNKCODE \ __asm{push eax} \ __asm{xor eax, eax} \ __asm{setpo al} \ __asm{push edx} \ __asm{xor edx, eax} \ __asm{sal edx, 2} \ __asm{xchg eax, edx} \ __asm{pop edx} \ __asm{or eax, ecx} \ __asm{pop eax}

如何编写跨平台(32位和64位)的垃圾汇编代码? 我需要编写一些(安全使用)随机垃圾汇编代码,用于C++项目中的一些混淆练习。 到目前为止,我只能找到: #define JUNKCODE \ __asm{push eax} \ __asm{xor eax, eax} \ __asm{setpo al} \ __asm{push edx} \ __asm{xor edx, eax} \ __asm{sal edx, 2} \ __asm{xchg eax, edx} \ __asm{pop edx} \ __asm{or eax, ecx} \ __asm{pop eax},c++,assembly,C++,Assembly,对于64位的项目,它似乎不能在Xcode上编译 我如何创建多个版本的垃圾汇编代码,可以安全地添加到我的项目中,并且是32-64位兼容和跨平台的(Windows VS2013和Mac Xcode8)?要编写将在任一模式下进行汇编的asm,请使用32位操作数大小,并避免push/pop:对于x86-64,它们的32位操作数大小不可用。只有模式的全宽寄存器大小和16位可用于push/pop。(即在机器代码中,因此在64位模式下,push eax不可编码。) 如果您希望在两种模式下使用相同的机器代码(3

对于64位的项目,它似乎不能在Xcode上编译


我如何创建多个版本的垃圾汇编代码,可以安全地添加到我的项目中,并且是32-64位兼容和跨平台的(Windows VS2013和Mac Xcode8)?

要编写将在任一模式下进行汇编的asm,请使用32位操作数大小,并避免
push
/
pop
:对于x86-64,它们的32位操作数大小不可用。只有模式的全宽寄存器大小和16位可用于push/pop。(即在机器代码中,因此在64位模式下,
push eax
不可编码。)

如果您希望在两种模式下使用相同的机器代码(32位模式下的短编码变成64位模式下的REX前缀),也要避免使用
inc
/
dec
)。如果您只需要汇编的asm源代码,inc/dec就可以了


对于C++中的内联asm:

避免修改任何内存或进行任何函数调用。这很难做到安全,所以如果你只是想要垃圾代码,你可以只玩寄存器。您甚至无法安全地
推送System V ABI的x86-64代码中的
,因为编译器可能正在使用堆栈下方的红色区域。我不知道这是否适用于使用MSVC内联asm语法而不是GNU语法的Clang,在GNU语法中必须显式声明CLOBBER

更喜欢GNUCinlineASM语法(使用适当的约束来告诉编译器您要删除哪些寄存器)

MSVC本身不支持64位模式下的任何内联asm语法

Xcode(clang)支持MSVC语法和GNU语法,甚至在64位模式下也可能支持MSVC语法

MSVC风格的内联asm语法基本上不适合包装短代码段(输入必须在内存中跳转,因为没有在寄存器中请求输入的语法),以及。MS可能在寻找放弃它的原因或方法,不支持x86-64是有道理的。如果内联asm中的函数参数保持不变,那么从内联asm中访问函数参数会更糟糕,因为它们不会在内存中启动。无论如何,MSVC内联asm语法是半死不活的,很好地摆脱了它


无论如何,如果您真的想在32位MSVC中使用一些内联asm,那么请务必使用该语法<代码>\uuuu asm\uuuuu emit
可能在64位MSVC中执行某些操作,因此如果您只是想让代码看起来很奇怪,您可以手动编码一些NOP。

64位VC++根本不支持内联汇编。对于那些这样做的,语法是不可移植的。哦,我不知道。那么,即使使用每个平台的检查,最好的方法是什么?混淆C++…通过添加垃圾代码。。。听起来很可笑。优化后的机器代码已经足够神秘,这对RE来说是一个相当大的挑战,垃圾代码部分(特别是如果它们只有很少的变体,并且它们不是随机生成的)最终可能会给经验丰富的RE工程师一个提示,在那里有一些用垃圾块标记的重要点。混淆真实代码是有道理的,但这很棘手,通常2-3层解释/自定义语言在完全牺牲源代码可维护性的情况下工作得很好。内联asm(和
函数)基本上也与Windows处理展开64位函数的方式不兼容。它们具有这种特定的功能和epilog格式(后者包括作为展开一部分的epilog的概念!),用于允许展开:对组件进行更多限制,以换取更简单的展开策略(例如,与to
eh_frame
或DWARF相比)。这么多类型的内联程序集是有问题的。@BeeOnRope:但为什么这会约束内联asm<代码>裸体
当然可以,但内联asm不会阻止编译器发出任何序言/尾声。部分原因是您可能希望在内联asm中执行的某些操作将不再被允许(例如,操纵
rsp
,操纵基指针,它现在是任意的,而不是固定为
ebp
)-至少不需要大量工作来解释内联asm并使展开数据兼容。部分原因是内联asm的一个主要用途是在
函数中对prolog或epilog进行特殊处理,这已不再可能(即,无
函数使内联asm变得不那么有用)。也许基本上不兼容的功能太强了:可能“更难使用”。澄清基本指针的想法:在asm中,操纵基本指针不是一件常见的事情,但我的意思是,在64位Windows二进制文件中,任何指针都可以是基本指针,并且不能修改(即使在内联asm中保存)因为即使是暂时更改帧指针,代码也无法可靠地解绕。@BeeOnRope:哦,内联asm的主要用途之一就是从编译器下“上下文切换”之类的黑客行为,这在ABI中是不安全的。我主要考虑使用它是出于性能原因(MSVC内联asm不适合这种情况,除非您编写一个完整的循环)。关于基/帧指针的有趣内容。但是如果它是任意的,一个不糟糕的编译器可以选择一个你不使用的reg作为帧指针,或者错误。如果内联两个使用不同寄存器的asm块不会留下可能的基指针,则这可能会限制内联。