大多数程序员都有调试/修复别人代码的经验。有时,“别人的代码”是如此的模糊,以至于试图理解它在做什么已经够糟糕的了。
您必须调试/修复的最糟糕(最模糊)的代码是什么?
如果你没有把它扔掉并从头开始重新编码,那你为什么不呢?
大多数程序员都有调试/修复别人代码的经验。有时,“别人的代码”是如此的模糊,以至于试图理解它在做什么已经够糟糕的了。
您必须调试/修复的最糟糕(最模糊)的代码是什么?
如果你没有把它扔掉并从头开始重新编码,那你为什么不呢?
PHP OSCommerce 足以说,它是混淆代码......
嵌套 if,while,如:
if (...) {
for (...) {
if (...) {
if (...) {
while (...) {
if (...) {
面向剪切和粘贴的编程
我很想扔掉并重新编码......但是,经过 3 天的艰苦调试,我已经添加了魔法如果:-)
意大利面条代码 PHP CMS 系统。
默认情况下,程序员认为别人的代码被混淆了。
我可能不得不做的更糟糕的事情是用一个简单的方法解释变量 i1、i2 j、k、t 是什么,它们不是“for”循环中的计数器。
在所有其他情况下,我猜问题区域很困难,这使得代码看起来很困难。
我今天在我们的代码库中发现了这行代码,并认为这是偷偷摸摸混淆的一个很好的例子:
if (MULTICLICK_ENABLED.equals(propService.getProperty(PropertyNames.MULTICLICK_ENABLED))) {} else {
return false;
}
只要确保我阅读了整行。没有略读。
在处理 GWT 项目时,我会接触到不属于我的 GWT 编译的混淆 JS 代码的一部分。
现在祝你调试真正的混淆代码好运。
我不记得完整的代码,但它的一部分仍然留在我的记忆中,因为我花了几个小时试图理解:
do{
$tmp = shift unless shift;
$tmp;
}while($tmp);
起初我无法理解它,它看起来很没用,然后我打印出@_ 用于参数列表,一系列交替的布尔和函数名称,该代码与一个库检测模块结合使用,如果它改变了行为一个函数被破坏了,但是代码的文档记录很糟糕,而且如果没有完全理解完整的代码就没有任何意义,我放弃并重写了整个代码。
来自 DVK 的更新:
而且,以免有人声称这是因为 Perl 是不可读的,而不是编码器是高尔夫大师而不是优秀的软件开发人员,这里是相同的代码,其混淆形式稍微少一些(真正正确的代码甚至没有交替的子名称和布尔值首先:)
# This subroutine take a list of alternating true/false flags
# and subroutine names; and executes the named subroutines for which flag is true.
# I am also weird, otherwise I'd have simply have passed list of subroutines to execute :)
my @flags_and_sub_names_list = @_;
while ( @flags_and_sub_names_list ) {
my $flag = shift @flags_and_sub_names_list;
my $subName = shift @flags_and_sub_names_list;
next unless $flag && $subName;
&{ $subName }; # Call the named subroutine
}
我有一个 300 行函数执行输入清理的案例,它错过了某个角落案例。它使用 IndexOf 和 Substring 以及许多内联变量和常量手动解析某些情况(看起来原始编码器对良好实践一无所知),并且没有提供任何评论。由于时间限制以及我没有所需的规范,因此将其扔掉是不可行的,因此重写它意味着理解原件,但在理解它之后修复它会更快。我还加了很多评论,所以谁来找我看都不会觉得一样的痛苦……
Perl 声明:
select((select(s),$|=1)[0])
在原作者(Randal Schwartz 本人,他说他不喜欢它,但当时没有其他可用的)的建议下,它被替换为更容易理解的东西:
IO::Handle->autoflush
除了这一行之外,IBM 的一些 Java JDBC 库被混淆了,所有变量和函数要么是字母“l”和“1”的组合,要么是单/双字符——在你得到它们之前很难追踪任何东西都改名了。需要这样做来追踪为什么他们在 IBM 的 JRE 中运行良好,但在 Sun 的运行良好。
如果您在谈论 HLL 代码,一旦我更新由中国人编写的项目并且所有评论都是中文的(存储在 ansii 中)并且理解一些代码片段是一种恐惧,如果您谈论的是低级代码,那么有其中许多(混淆,变异,vm-ed ...)。
我曾经不得不对一个 Java 1.1 框架进行逆向工程:
catch
块中。如果我不得不猜测,这可能是某人的“聪明”想法,即在 Java 1.1 中方法调用代价高昂,因此为非异常流控制抛出异常在某种程度上被认为是一种优化。
用了大约三瓶眼药水。
我曾经发现一个被故意混淆的定时炸弹。
当我终于破译了它在做什么时,我向经理提到了它,他们说他们知道定时炸弹,但因为它非常无效并且与其他代码交织在一起而将其留在原处。
定时炸弹(大概)应该在某个日期之后引爆。
相反,它有一个错误,因此只有在 12 月 31 日午餐时间之后有人工作时才会激活它。
从那个写定时炸弹的家伙离开公司到现在,这种情况已经过了三年。