您必须修复的代码最混淆的代码是什么?

时间:2009-04-19 09:40:05

标签: debugging obfuscation

大多数程序员都有调试/修复别人代码的经验。有时“其他人的代码”是如此混淆,试图理解它正在做什么是不够的。

您必须调试/修复的最差(最混淆)代码是什么?

如果你没有扔掉它并从头开始重新编码,那你为什么不呢?

12 个答案:

答案 0 :(得分:10)

PHP OSCommerce足以说明,它是混淆代码......

答案 1 :(得分:6)

  • 一个Java类
  • 只有操纵DOM的静态方法
  • 8000 LOCs
  • 在“错误”上返回null的长链方法:a.b()。c()。d()。e()
  • 很长的方法(每个400/500 LOC)
  • 嵌套if,while,like:

    if (...) {
      for (...) {
        if (...) {
          if (...) {
            while (...) {
              if (...) {  
    
  • 面向剪切和粘贴的编程

  • 没有例外,使用printStackTrace()
  • 捕获并“处理”所有异常
  • 没有单元测试
  • 没有文档

我很想扔掉并重新编码...但经过3天的艰苦调试后, 我添加了魔法,如果 :-)

答案 2 :(得分:2)

Spaghetti代码PHP CMS系统。

答案 3 :(得分:2)

默认情况下,程序员认为别人的代码是混淆的。

我可能要做的更糟糕的是在一个简单的方法中解释变量i1,i2 j,k,t并且它们不是'for'循环中的计数器。

在所有其他情况下,我认为问题区域很难使代码看起来很困难。

答案 4 :(得分:2)

我今天在您的代码库中找到了这一行,并认为这是偷偷摸摸的混淆的一个很好的例子:

if (MULTICLICK_ENABLED.equals(propService.getProperty(PropertyNames.MULTICLICK_ENABLED))) {} else {
    return false;
}

确保我读完整行。没有SKIM READING。

答案 5 :(得分:1)

在处理GWT项目时,我会访问GWT编译的混淆JS代码的部分内容,而不是我的。

现在祝你好运调试真正的混淆代码。

答案 6 :(得分:1)

我记不起完整的代码了,但是它的一部分仍然留在我的记忆中,因为我花了几个小时试图理解:

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
}

答案 7 :(得分:0)

我有一个300行功能执行输入消毒的情况,它错过了某个特殊情况。它使用IndexOf和Substring以及许多内联变量和常量手动解析某些情况(看起来像原始编码器对良好实践一无所知),并且没有提供任何评论。抛弃它是不可行的,因为时间的限制和我没有所需的规范,所以重写它将意味着理解原始,但在理解它修复它只是更快。我还添加了很多评论,所以无论谁跟我来,都不会有同样的痛苦看一眼...

答案 8 :(得分:0)

Perl声明:

select((select(s),$|=1)[0])

根据原作者的建议(Randal Schwartz本人,他说他不喜欢它,但当时没有别的东西可用),被一些更容易理解的东西所取代:

IO::Handle->autoflush

除了那个单行之外,来自IBM的一些Java JDBC库被混淆,并且所有变量和函数都是字母'l'和'1'或单/双字符的组合 - 很难跟踪任何内容直到你把它们都重命名了。需要这样做才能找到他们为什么在IBM的JRE中工作正常而不是Sun的工作。

答案 9 :(得分:0)

如果您正在谈论HLL代码,一旦我更新了由中文编写的项目并且所有评论都是中文(存储在ansii中)并且理解一些代码片段是一种恐怖,如果您正在谈论低级别代码中有 MANY (混淆,变异,vm-ed ......)。

答案 10 :(得分:0)

我曾经不得不对Java 1.1框架进行逆向工程:

  1. 每个类的扩展事件驱动的SAX解析器类,甚至是那些不解析XML的类(被覆盖的方法只是由其他代码临时调用)
  2. 尽可能抛出自定义运行时异常代替方法调用。因此,大多数业务逻辑都嵌入了catch嵌套系列中。
  3. 如果我不得不猜测,那么在Java 1.1中方法调用的代价可能是某种“聪明”的想法,因此抛出非异常流控制的异常在某种程度上被认为是一种优化。

    经过约三瓶滴眼液。

答案 11 :(得分:0)

我曾经发现了一个故意混淆的定时炸弹。

当我最终解码它正在做的事情时,我向管理员提到了这一点,他说他们知道时间炸弹,但已将它留在原地,因为它是如此无效并且与其他代码交织在一起。

时间炸弹(据推测)应该在某个日期之后熄灭。

相反,它有一个错误,所以只有在12月31日午餐后有人工作时才会激活它。

自从撰写定时炸弹的人离开公司以来,这种情况发生了三年。