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