c++ - 任意表达式中的单个冒号?
问题描述
我需要弄清楚这个混淆的 C++ 代码(由其他人编写)做了什么。除了一个棘手的部分,我几乎想出了一切:
bool part1(char *flag)
{
int *t = (int *) memfrob(flag, 8);
unsigned int b[] = {3164519328, 2997125270};
for (int i = 0; i < 2; b[i] = ~b[i], ++i);
return !(0<:t:>-0<:b:>+1<:t:>-1<:b:>);
}
这个函数的返回语句发生了什么?我不知道这些冒号是什么意思...
我试过用谷歌搜索 C++ 中的冒号运算符是做什么的,但只找到了关于类构造函数和条件表达式的答案,这似乎与这个问题无关。
解决方案
该代码使用两个字母的替代标记,也称为“有向图”。具体来说,<:
是[
,:>
是]
。
因此,语法 like 0<:t:>
is just 0[t]
,并且由于数组下标可以与数组标识符交换,所以 this is just t[0]
。
一个可以帮助反混淆代码的好工具是cppinsights.io。从链接中可以看出,代码只是对数组值进行了一些算术运算(忽略static_cast
此示例,这对于理解转换并不重要)。
推荐阅读
- kubernetes - 将多个 k8s 机密组合到一个环境变量中
- swift - 设置 DarkTheme 没有效果 Braintree iOS v4 SDK
- java - 如何控制垃圾收集器?
- php - 如何防止提交的空字段显示在电子邮件表单上?
- docker - 无法查询 docker 版本:获取 https://
/v1.15/version: 远程错误: tls: bad certificate - ios - 哪个版本的 iOS 在调用“restoreCompletedTransactions”时停止要求 Apple ID 验证?
- algorithm - 链表删除操作时间复杂度 O(n) vs O(1)
- delphi - 问题 Flag_secure 在 delphi 10.3 中不起作用
- javascript - 在特定浏览器版本上限制 Firefox 扩展
- python - 如何使用 Selenium 在 Instagram 弹出框中向下滚动