红联Linux门户
Linux帮助

如何hack一个已经发布的Ubuntu Core应用

发布时间:2016-12-21 10:06:00来源:Ubuntu Core及手机专栏作者:Ubuntu手机
在今天的教程中,我们来展示如何来hack一个已经发布的Ubuntu Core应用.这个方法特别是对已经发布在Ubuntu Core商店的应用进行hack非常有用.
 
最近,我想把在Ubuntu Desktop上面的一个叫做vtop的应用移植到我们的Ubuntu Core的dragonboard上面.vtop是一个非常好的应用,它可以展示在Ubuntu系统中的应用资源:
如何hack一个已经发布的Ubuntu Core应用
 
我们可以在我们的Ubuntu Desktop上面利用如下的命令来安装它:
$ sudo snap install vtop  
在这里,我们没有用到任何的channel选项,表明它是从我们的stable channel进行安装的.没有任何的安全的问题.我们可以在terminal中直接打入如下的命令:
$ vtop  
就可以运行这个应用.
 
为了得到同样的应用,我也尝试使用如下的snapcraft.yaml文件来创建一个同样的应用:
 
snapcraft.yaml
name: v-top # you probably want to 'snapcraft register <name>'  
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'  
summary: This is a snap for vtop # 79 char long summary  
description: |  
This is vtop. More info can be found at https://parall.ax/vtop
grade: stable # must be 'stable' to release into candidate/stable channels  
confinement: strict # use 'strict' once you have the right plugs and slots
apps:  
v-top:  
command: bin/vtop  
plugs: [home, network, system-observe, process-control,network-bind]
parts:  
vtop:  
# See 'snapcraft plugins'  
plugin: nodejs  
source: https://github.com/MrRio/vtop  
source-type: git  
node-engine: 6.9.2
 
这个snapcraft.yaml文件非常简单.等我们打包过后,我们发现这个应用只能在devmode下进行安装,否则会出现一些问题,比如:
liuxg@liuxg:~/snappy/desktop/vtop2$ v-top  
TypeError: Cannot read property 'replace' of undefined  
at child.exec (/snap/v-top/x1/lib/node_modules/vtop/sensors/memory.js:45:43)  
at ChildProcess.exithandler (child_process.js:213:5)  
at emitTwo (events.js:106:13)  
at ChildProcess.emit (events.js:191:7)  
at maybeClose (internal/child_process.js:877:16)  
at Socket.<anonymous> (internal/child_process.js:334:11)  
at emitOne (events.js:96:13)  
at Socket.emit (events.js:188:7)  
at Pipe._handle.close [as _onclose] (net.js:498:12)  
 
那么我们的问题出现在哪里呢?显然它出现在最新的发布版本中https://github.com/MrRio/vtop.这个最新发布的软件里面含有一些不利于我们进行snap打包工作的代码.为了解决这个问题,我想到了已经发布在我们的Ubuntu Core商店里的软件vtop.我进行了如下的操作:
 
创建一个目录,比如tmp,然后进入到我们的目录中中:
$ snap download vtop  
我们通过上面的命令来把发布到商店里的vtop应用下载到本地:
liuxg@liuxg:~/tmp$ ls  
vtop_1.snap  
显然我们已经下载了发布到我们商店里的vtop应用.接下来,我们使用如下的命令:
liuxg@liuxg:~/tmp$ unsquashfs vtop_1.snap   
Parallel unsquashfs: Using 4 processors  
2205 inodes (2419 blocks) to write
[==========================================/] 2419/2419 100%
created 2202 files  
created 483 directories  
created 3 symlinks  
created 0 devices  
created 0 fifos  
liuxg@liuxg:~/tmp$ ls  
squashfs-root  vtop_1.snap  
 
这样在我们的当前的应用中,我们发现一个被创建的squashfs-root的目录.这个目录里的所有文件就是我们最终被安装到Ubuntu Core系统的文件.我们可以对这个squashfs-root里的文件进行我们任何的hacking,然后再重新按照下面的指令打包.如果我们此时不做任何的改动,我们直接使用如下的命令,我们就可以把它里面的文件重新打包为一个snap文件:
liuxg@liuxg:~/tmp$ snapcraft snap squashfs-root/  
Snapping 'vtop' |  
Snapped vtop_1.0.1_amd64.snap  
liuxg@liuxg:~/tmp$ ls  
squashfs-root  vtop_1.0.1_amd64.snap  vtop_1.snap  
 
当然,这不是我们的最终的目的.我们的目的是为了能把这个同样的应用能够发布到Ubuntu Core的系统中去.为此,我们进入到我们已经展开的文件夹中:
liuxg@liuxg:~/tmp$ cd squashfs-root/  
liuxg@liuxg:~/tmp/squashfs-root$ ls  
bin  CHANGELOG.md  command-vtop.wrapper  etc  include  lib  LICENSE  meta  README.md  share  
liuxg@liuxg:~/tmp/squashfs-root$ cd bin/  
liuxg@liuxg:~/tmp/squashfs-root/bin$ ls  
node  npm  vtop  
liuxg@liuxg:~/tmp/squashfs-root/bin$ ./node --version  
v4.2.2  
 
首先,我们发现在这个包里的nodejs的版本是4.2.2.这个信息很重要.在我们的snap包应用中,我们可以指定任何一个python或nodejs的版本.针对我们的情况,我们希望在最终的版本中,这里的nodejs的版本和原来的一致,这样不会造成安全的问题.另外,我们也进入到另外一个目录中:
liuxg@liuxg:~/tmp/squashfs-root/lib/node_modules$ ls  
npm  vtop  
 
在这里,我们可以看见我们所有的能够运行我们的vtop的代码都被保存到一个叫做vtop的目录之中:
liuxg@liuxg:~/tmp/squashfs-root/lib/node_modules$ ls vtop  
app.js  CHANGELOG.md  LICENSE   node_modules  README.md  themes  
bin docs  Makefile  package.json  sensorsupgrade.js  
 
无论它在原来的应用中是怎样形成的,它肯定是被定义为一个被叫做vtop的part.我们需要这个部分的软件.我们可以把这个目录的文件考入到我们打包的文件中:
liuxg@liuxg:~/snappy/desktop/vtop$ ls  
snapcraft.yaml  vtop  
 
比如,在上面我们创建的项目中,我们把vtop整个目录都拷入到我们的项目中.同时我们的snapcraft.yaml的内容如下:
name: v-top # you probably want to 'snapcraft register <name>'  
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'  
summary: This is a snap for vtop # 79 char long summary  
description: |  
This is vtop. More info can be found at https://parall.ax/vtop
grade: stable # must be 'stable' to release into candidate/stable channels  
confinement: strict # use 'strict' once you have the right plugs and slots
apps:  
v-top:  
command: bin/vtop  
plugs: [system-observe]
parts:  
vtop:  
# See 'snapcraft plugins'  
plugin: nodejs  
source: ./vtop  
node-engine: 4.2.2
 
这里我们同时指定了和原来一样的nodejs的版本4.2.2.我们重新打包我们的应用,我们会发现它和原来的应用运行的一模一样,并且在安装时,不需要devmode.我们此时也可以查看在meta文件目录下的snap.yaml文件,并找到相应的所需要的plug system-observe.当然针对目前的这种情况似乎并不需要这个plug就可以很好地运行.
 
那么这样的一个应用,在QualComm的dragonboard上的安装是如何呢?
我们可以安装文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行编译"(http://www.linuxdiyf.com/linux/23642.html)来在Dragonboard上打包我们的v-top应用,我们最终的运行的情况和在Ubuntu Destop上一模一样,并且它也不需要devmode.
如何hack一个已经发布的Ubuntu Core应用
从上面的图片中看出,v-top应用被成功安装,并且不汗devmode.
如何hack一个已经发布的Ubuntu Core应用
 
整个项目的源码在:https://github.com/liu-xiao-guo/v-top
在64为的dragonboard上,我们可以通过如下的命令来安装:$ sudo snap install v-top
 
本文永久更新地址:http://www.linuxdiyf.com/linux/27098.html