V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
downstairs
V2EX  ›  Linux

反编译 Linux 操作系统

  •  
  •   downstairs · 2021-01-25 08:10:15 +08:00 · 5746 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    并不是为了要获取系统的源码,因为 linux 源码本身就是开源的 只是想问下技术方面的可行性, 如果一个操作系统文件。例如 CentOS 或者 Alpine 系统在由源码 build 后 再逆向,能得到原来的代码吗? 源码本身就是 C,逆向为 C 后,除了变量名字可能是乱码外,还有其他影响吗?

    29 条回复    2021-01-26 15:10:07 +08:00
    w292614191
        1
    w292614191  
       2021-01-25 08:34:45 +08:00
    把你想破解的东西发上来,自有大神。
    asmmt
        2
    asmmt  
       2021-01-25 08:34:54 +08:00
    首先逆向得到的是汇编代码,就算用 ida 之类的工具得到 C 代码,也不可能直接能运行。你自己写个 c 语言小程序,逆向一下看看吧。
    zwy100e72
        3
    zwy100e72  
       2021-01-25 09:18:22 +08:00
    c / c++ 编译器编译时会进行很多优化,会导致反编译后的代码可读性下降很多

    反编译到源码最多用来帮助理解,理解后可以按照正常的逻辑再写一遍
    yolee599
        4
    yolee599  
       2021-01-25 09:41:16 +08:00
    反不出原来的源码,只能得到优化后的代码。可读性非常差。
    BrettD
        5
    BrettD  
       2021-01-25 09:52:17 +08:00 via iPhone   ❤️ 8
    编译器的优化能把原来的程序变成亲妈都不认识
    darksword21
        6
    darksword21  
       2021-01-25 09:56:47 +08:00 via iPhone
    @BrettD #5 大早上班车上看乐了😂
    fiveelementgid
        7
    fiveelementgid  
       2021-01-25 09:58:35 +08:00 via Android
    @BrettD 这个是真的,优化一言难尽
    f6x
        8
    f6x  
       2021-01-25 10:06:43 +08:00
    问题是,,, 就算把编译前的源码给个常人, 轻易也看不懂啊.
    更何况是反编译出来的一堆伪 c 汇编.
    现在的 kernel 有 3000 多万行了吧.
    :)
    lasuar
        9
    lasuar  
       2021-01-25 10:14:31 +08:00
    5L 讲得没毛病,你想想假如你的程序 1w 行代码有 9999 个空行,只有一句 print,编译器难道不会过滤空行吗。当然了,这是举个栗子。还有深层次的优化;再举个例子,A 和 B 两种代码样式最终可能用更简洁效率的 C 样式完成, 那编译器当然会优化为 C,这个时候当然不可能推断出原来的写法。
    tabris17
        10
    tabris17  
       2021-01-25 10:20:51 +08:00
    理论上编译器优化会导致信息丢失的,所以不可能通过反编译还原成 C 代码,有 ASM 读一下就可以了
    AlohaV2
        11
    AlohaV2  
       2021-01-25 10:21:38 +08:00
    真要试试反编译的话,搜一下老毛子的"IDA"这个软件
    sujin190
        12
    sujin190  
       2021-01-25 10:23:56 +08:00
    要是能才怪,那 windows 不早就被人反编译完了,别说操作系统了,你自己写个程序这种比较规则的代码想完整反编译都比较难,更别说操作系统系统了,反编译查查某些隐藏 api 实现啥的或许还是可以行的,java 这种由 jvm 运行抽象度比较高的反编译可能完整性还相对还好一些
    sadfQED2
        13
    sadfQED2  
       2021-01-25 10:28:26 +08:00 via Android
    反编译过 java 代码,基本上还能看懂,但是 bin 文件反编译后是汇编代码啊,kernel 的 bin 文件反编译,估计你花一辈子也不一定能看完
    AoEiuV020
        14
    AoEiuV020  
       2021-01-25 10:46:39 +08:00
    c/c++从来都没有反编译拿源码的,
    反编译都是为了看汇编,
    JosephHan
        15
    JosephHan  
       2021-01-25 12:19:35 +08:00 via Android   ❤️ 2
    感叹,新一代的程序员都不从汇编开始学起了啊,这种基础问题还特意问一下。
    no1xsyzy
        16
    no1xsyzy  
       2021-01-25 12:31:38 +08:00
    首先,所有的宏都被展开了
    其次,优化很牛逼
    再次,所有的东西被 LD 到一起了,只有一个巨大的 .c,最多再来个巨大的 .h
    cmostuor
        17
    cmostuor  
       2021-01-25 12:35:37 +08:00
    c\c++这类偏向底层的语言不能通过反编译完整的获取源代码, 大多数都是通过反编译看汇编和伪代码写行为和功能与被反编译程序类似的代码 比如著名的 ReactOS 就是通过反编译 xp 内核和参考 wine 而 wine 能在 Linux 运行 win 的应用也是通过反编译看汇编和伪代码写的
    nicevar
        18
    nicevar  
       2021-01-25 12:46:32 +08:00   ❤️ 1
    @JosephHan 现在年轻一代都是前端起步的多,很多都不了解了,计算机技术是有断层的,经常可以看到一些人分享的东西以为发现了新大陆,其实是十几年前旧东西,就好像安卓 so 的一些加密加壳或者 loader 方面的,看起来很高大上,相比 windows 下曾经经历过的是小儿科,windows 下的安全对抗真的发展到了极致,很难想象曾经有些人花了好几年把一个商业软件完全反编译给克隆出来了。
    DejaVud
        19
    DejaVud  
       2021-01-25 14:19:11 +08:00   ❤️ 1
    @nicevar 是的!当年在看雪上看到大佬把 Sandboxie 逆向重写出来,真的是把我幼小的心灵震给撼到了.
    neoblackcap
        20
    neoblackcap  
       2021-01-25 16:20:41 +08:00   ❤️ 1
    @DejaVud Windows 上面很多研究都是逆向的。最厉害的莫过于《 Windows Internals 》一书里面的东西,作者不是微软的人,却请出给 Windows 开发组培训
    PS:sandboxie 现在好像是开源了
    salmon5
        21
    salmon5  
       2021-01-25 19:57:24 +08:00 via Android
    @neoblackcap 其中 mark 已经是 azure 的 cto 了😀
    levelworm
        22
    levelworm  
       2021-01-25 20:56:47 +08:00
    @DejaVud 我擦大佬真的是太厉害了,能够到这种境界。。。
    levelworm
        23
    levelworm  
       2021-01-25 21:09:21 +08:00
    @neoblackcap 请问是不是这本书: https://www.amazon.ca/Windows-Internals-Part-architecture-management/dp/0735684189

    听你这么一说,作者真的很厉害。。。
    printese
        24
    printese  
       2021-01-25 21:19:07 +08:00 via iPhone
    记得之前在 Freebuf 上看到过路由器固件逆向的文章,可以去参考一下
    f165af34d4830eeb
        25
    f165af34d4830eeb  
       2021-01-25 21:24:05 +08:00
    @BrettD #5 return 5050 (
    neoblackcap
        26
    neoblackcap  
       2021-01-25 21:26:35 +08:00   ❤️ 1
    @salmon5
    mark 好像是第六版才才加入的

    @levelworm
    你看看作者之一的 mark 是 azure 的 cto 就知道这书不是一般的厉害。mark 不仅仅是微软的 azure 的 cto,还是 fellow 。

    PS:这书国内是有引进的,叫《深入解析 Windows 操作系统》,同类的也有潘爱民博士写的《 Windows 内核原理与实现》。
    levelworm
        27
    levelworm  
       2021-01-25 22:08:01 +08:00
    @neoblackcap 看来是 Windows 系统编程的一本利器啊,就是不知道自己什么时候才有那个水平去搞系统编程了。
    ryd994
        28
    ryd994  
       2021-01-26 07:53:03 +08:00   ❤️ 1
    @BrettD
    @darksword21
    @fiveelementgid
    老师:求 1-100 的和
    牛顿:51*101 = 5050
    程序员:for(i=1; i<=100;++i) sum += i;
    GCC:printf 5050
    ragnaroks
        29
    ragnaroks  
       2021-01-26 15:10:07 +08:00
    kids:
    for(i=5;i>0;i--){
    buffer="";
    for(j=5;j>5-i;j--){ buffer+="*"; }
    echo buffer;
    }

    legend:
    echo "*****";
    echo "****";
    echo "***";
    echo "**";
    echo "*";
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:43 · PVG 15:43 · LAX 23:43 · JFK 02:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.