为什么无法获得软件源代码

为什么无法获得软件源代码,第1张

编译型软件的源代码几乎无法获取,可以这样子给你解释为什么从理论上无法获取:

源代码需要经过编译之后变成一连串的0和1,这一连串的0和1打包起来,就是我们日常所说的可执行文件,也就是你平时用的软件了。

OK,你想通过可执行文件,也就是这一连串的和0和1逆推回源代码,这几乎是不可能的事情,因为高级语言的源代码和最终生成的0和1不是死死的一一对应关系。高级语言需要先被转为汇编语言,然后汇编语言再转为0和1,汇编语言与0和1是一一对应关系的,但是高级语言和汇编语言就不一定了。

即便是同样的几句高级语言代码,在不同的编译器里面,也完全有可能是完全不同的汇编代码。而且同样逻辑的代码,即便是只有稍微几个关键字的不同,或者是变量的不同,都会产生不同的汇编代码。

所以,由二进制的0,1可执行文件,逆推高级语言,理论上可行,实际上不可行,因为工作量太大。类似大型软件,好几个G的,那是多少亿行的0和1,哪怕是全世界的程序员在一起逆推,都不知道需要多少年可以完全逆向出源代码。

那我们平时所说的逆向工程是什么呢?

OK,其实软件是可以逆向的,但是不是说逆向出真正的源代码,而是逆向出这个软件的汇编代码。但是需要注意,汇编代码在某种程度上并不能成为这个软件的源代码,因为汇编代码量极大,而且不具备良好的可读性,一句普通的高级语言源代码,可能就会生成好几十条汇编代码。所以汇编代码量是极大的。

同时,汇编代码几乎是不具备有架构性的,也就是说,即便你拿到了一个软件的汇编代码,你最多就是稍稍改改一些关键逻辑,比如说注册逻辑(用于破解)之类的,但是你要说通过汇编代码去改这个软件的功能,几乎就是不可能的事情。所以,汇编代码是无法用于开源的,你公开出来了,别人也没精力去看。

1 获取源代码

在cd ~/myandroid/kernel中执行以下命令

git clone git://androidgitkernelorg/kernel/commongit

这需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。

然后进入到common目录,然后用下面的命令来取得goldfish分支:

git checkout origin/android-goldfish-2627 -b goldfish

这样我们就在本地建立了一个名为goldfish的android-goldfish-2627分支,代码则已经与android-goldgish-2627同步。

可以通过git branch来列出本地的所有分支。

2 在Host OS上准备编译环境

尽管很多人安装完Ubuntu后第一件事情就是装上build-essential,不过我在这里还是要提醒一下大家,另外做menuconfig的时候ncurses-devel库也是必须的。运行以下命令,一次搞定:

sudo apt-get install build-essential ncurses-dev

3 准备交叉编译工具链

Android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。如果你拿了完整的Android platform 的代码树,它就会在prebuilt目录下。如果没有拿完整的代码树也没有关系,只要用Git clone一个或者到从GitWeb下载一个prebuilt项目 ,如果是从GitWeb下载的话记得解压缩就行。

4 设定环境变量

把prebuilt中的arm-eabi编译器加入$PATH

$export PATH=$PATH:/myandroid/androidsrc/prebuilt/linux-x86/toolchain/arm-eabi-421/bin

设定目标arch为arm

$export ARCH=arm

打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器

CROSS_COMPILE = arm-eabi-

LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/

$(call ld-option, -Wl$(comma)–build-id,))

这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:

LDFLAGS_BUILD_ID =

下面的这段解释来自陈罡的blog

把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。

对这个–build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:

>

网站一般分为三部分:

前台界面,就是你在浏览器上看到的界面

后台代码,一般位于网站提供方的服务器上

数据库,存储网站的部分数据,同样位于网站提供方的服务器上

我们一般能在浏览器上看到的只有前台界面;前台界面一般又分为:

HTML,表示界面上有些什么东西(按钮,文本框,框)

javascript,你与界面怎么交互(点击时、右键时浏览器做什么)

css,界面元素(HTML)如何排版,放哪儿,字体多大,字间距多大等

你打开一个页面后按F12可以在source中可以直接看到HTML和javascript,css一般在其它路径下,需要在页面中查看引用的css位置

所以如果你想要看网站的完整代码是不可能的,除非有人提供源码

一般你只能看到前端的这些代码,只能知道它的形;里面的数据具体怎么来的你是不知道的

用压缩软件打开apk文件,解压出根目录中的classesdex文件

使用cmd ,dex2jarbat classesdex命令将classesdex转换为jar

再用jd-gui打开该jar就可以查看源码了,如果apk安全性好的话,有些代码是看不到的

以上就是关于为什么无法获得软件源代码全部的内容,包括:为什么无法获得软件源代码、没有android内核的系统源代码应该怎么利用、怎么查看网站源代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9403781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存