在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?
Posted
技术标签:
【中文标题】在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?【英文标题】:How do bitwise operations work on expressions within variable assignments in C/C++? 【发布时间】:2021-06-18 19:04:04 【问题描述】:我正在学习逆向工程,并且我正在尝试理解以下 sn-p:
var = strcmp("C:\\Windows\\System32\\svchost.exe", pe.szExeFile);
if (var)
var = -(var < 0) | 1;
if (var)
// additional code here
我想我了解这里发生的大部分事情,但我对这样做的目的感到困惑
var = -(var < 0) | 1;
线。我只是对 C/C++ 非常熟悉,所以我很难理解这行代码的作用。
我知道它是按位的OR
,但我不确定-(var < 0)
是如何工作的。括号内的表达式是否被评估为 1 或 0,然后应用负数和 OR
?它被评估为布尔值吗?如果是这样,|
如何处理布尔值?
或者我完全错过了这里的重点?
【问题讨论】:
在 C 中,<
的结果是 int
(0 或 1)
如果您计算出这些位(并假设二进制补码表示),那只是编写var = (var < 0) ? -1 : 1
的另一种方式。它可能是一种合法的编译器优化(以避免分支),但它不是人们通常会为此编写的代码。
@M.M - 谢谢,我至少可以根据这些信息进行逻辑分析
@dxiv - 当我最初阅读它时,我认为可能使用了 C 三元语法 |而不是 ?,因为这是我能够以对我有意义的方式解析它的唯一方法,所以很高兴知道,谢谢!
这没有多大意义。你可以删除它和下面的if
测试。
【参考方案1】:
strcmp()
返回三个可能结果之一:
假设常见的二进制补码,在第一个if
之后,变量var
将是
但是,只有当var
不为零时,才会采用第二个if
。
“神秘”的第一个if
没有任何作用,就您显示的来源而言。
【讨论】:
可能var
的实际值用在了未显示的代码中。
@NateEldredge 这就是我写“你展示的源 […]”的原因。
在处理了几天之后,我的猜测是它被反编译了,第二个 if 是 strcmp 的实现来强制回答 -1/0/+1 而不是更一般的 ' strcmp 规范中的“负/零/正”
@spakejaniel 这听起来很明智。但是,我看到的strcmp()
的一些实现并不关心。以上是关于在 C/C++ 中,按位运算如何作用于变量赋值中的表达式?的主要内容,如果未能解决你的问题,请参考以下文章