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

在今天的教程中,我们来展示如何来hack一个已经发布的Ubuntu Core应用.这个方法特别是对已经发布在Ubuntu Core商店的应用进行hack非常有用.


最近,我想把在Ubuntu Desktop上面的一个叫做vtop的应用移植到我们的Ubuntu Core的dragonboard上面.vtop是一个非常好的应用,它可以展示在Ubuntu系统中的应用资源:


我们可以在我们的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  sensors    upgrade.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系统中进行编译"来在Dragonboard上打包我们的v-top应用,我们最终的运行的情况和在Ubuntu Destop上一模一样,并且它也不需要devmode.



从上面的图片中看出,v-top应用被成功安装,并且不需要devmode.




整个项目的源码在: https://github.com/liu-xiao-guo/v-top
在64为的dragonboard上,我们可以通过如下的命令来安装:$ sudo snap install v-top





  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值