rotm 发表于 2010-7-26 22:12:31

【原创】 npk 文件解包工具+源代码

本帖最后由 rotm 于 2010-7-26 23:33 编辑

大概是 08 年写的。 2.x,3.x,4.x,5.x 版都支持。:)

不研究 ROS 很久了,放着浪费资源,分享出来,供研究 ROS 的朋友们参考。

源代码。 你要是能看懂,修改修改实现解包后再打包一点也不难。


用法
-----------------------
1. 显示 npk 文件内容:
D:\ros>npk.py --show-file system-4.10.npk
unknown type: 9, length: 44
Name:system-4.10/2010-05-28
Platform:i386
Desc:
    Main package with basic services and drivers

Post install script:
    rm -rf /lib/modules/2.4.14/2.4.14
    /nova/bin/installer --filegc /bin /sbin /usr /lib /dev /nova/bin /etc/rc.d/r
un.d
    if [ -f /sbin/diskman ]; then
      /sbin/diskman --fstab
      /nova/bin/keyman --mbr
    fi
    new-kernel
    new-modules
    update-console
    if [ -f /old/system/update ]; then /old/system/update; fi
    if [ -f /sbin/nandfix ]; then /sbin/nandfix -u; fi
    rm -f /nova/logs/startup.catlog
    rm -f /nova/logs/panic?.log
    rm -f /nova/logs/backtrace.log*
    rm -f /rw/RESET
    rm -rf /nova/run
    ln -s /ram/run /nova/run
    echo >/rw/REBOOT

    mkdir -p /nova/store
    mkdir -p /nova/logs
    mkdir -p /tmp
    mkdir -p /var/run
    mkdir -p /var/pckg
    mkdir -p /var/store
    mkdir -p /var/cm

    if [ ! -L /nova/store ]; then
      rm -rf /rw/store
      mv /nova/store /rw
      ln -sf /rw/store /nova/store
    fi
    if [ ! -L /nova/logs ]; then
      rm -rf /rw/logs
      mv /nova/logs /rw
      ln -sf /rw/logs /nova/logs
    fi
    if [ ! -L /tmp ]; then
      rm -rf /rw/tmp
      mv /tmp /rw
      ln -sf /rw/tmp /tmp
    fi
    if [ ! -L /var/run ]; then
      rm -rf /rw/run
      mv /var/run /rw
      ln -sf /rw/run /var/run
    fi
    if [ ! -L /var/pckg ]; then
      rm -rf /rw/pckg
      mv /var/pckg /rw
      ln -sf /rw/pckg /var/pckg
    fi
    if [ ! -L /var/cm ]; then
      rm -rf /rw/cm
      mv /var/cm /rw
      ln -sf /rw/cm /var/cm
    fi
    if [ ! -d /rw/cm ]; then mkdir /rw/cm; fi
    if [ ! -L /var/store ]; then
      rm -rf /rw/vstore
      mv /var/store /rw/vstore
      ln -sf /rw/vstore /var/store
    fi
    if [ -d /vm ]; then
         if [ -d /rw/vm ]; then rm -rf /vm; else mv /vm /rw; fi
    fi

    rm -rf /dev/log
    ln -sf /rw/log /dev/log

    if [ -c /dev/watchdog ]; then echo -n 'V' >/dev/watchdog; fi
    /nova/bin/takeover 2.9.11

Post removescript:
    dead-libs
    dead-modules
    update-console

    if [ -f /proc/yaffs ]; then
      echo disable_cp >/proc/yaffs
    fi

Deps1:
Deps2:
path: bin datalen: 0
path: bin/mlogin datalen: 43
path: bin/bash_login datalen: 421
path: home datalen: 0
path: home/web datalen: 0
path: home/web/webcfg datalen: 0
path: home/web/webcfg/right_on.png datalen: 3304
..............................................

2. 解压 npk 文件:
npk.py --unpack xxxxx.npk

ksw520 发表于 2010-7-26 22:59:27

本帖最后由 ksw520 于 2010-7-26 23:20 编辑

解包已测OK。顶
封包有测试过?

rotm 发表于 2010-7-26 23:04:27

4.x也能搞定? 先顶,再测试。
ksw520 发表于 2010-7-26 22:59 http://bbs.routerclub.com/images/common/back.gif

当然。看贴的例子,用的就是 4.10 测试的。

cow_boys 发表于 2010-7-27 02:07:26

汗,看了半天,都看不懂,楼上能发个封包命令不?我正好有个小程序想在ROS上安装。

soft_route 发表于 2010-7-27 16:04:07

顶........

心想事成 发表于 2010-7-27 20:01:21

我也发一个解个npk的源码,是一个朋友在几年前给我的,放在硬盘里也没用,希望对大家有用。
npk包是使用zlib压缩,所以要使用这个程序,首先要把zib压缩后的数据截出来,然后用这个程序解压。#include <cstdlib>
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
//author :bbs.routerclub.com
//直接用vc或者g++编译即可。
using namespace std;

struct NPKHEAD {
        unsigned char magic;
        unsigned char flag;
        unsigned char unknow;
        int size;
        short lenth_name;
        unsigned char name[];
};

int de_npk(FILE *source, char *dir) {
        NPKHEAD Npk;
        memset( (char*)(&Npk), 0, 0x1e);
        char* pathname = (char*)malloc( 256);
        char* fullpath = (char*)malloc( 256);

        while (fread(&Npk, 1, 0x1e, source) != 0) {

                memset(pathname, 0, 256);
                memset(fullpath, 0, 256);

                fread(pathname, 1, Npk.lenth_name, source);
                strcpy(fullpath, dir);
                strcat(fullpath, pathname);
                cout << fullpath << endl;
                if (Npk.flag == 0x41) {
                        mkdir(fullpath, 777);
                } else {// if ( Npk.flag == 0x81 )
                        FILE* dfile = fopen(fullpath, "wb");
                        char* p = (char*)malloc(Npk.size);
                        fread(p, 1, Npk.size, source);
                        fwrite(p, 1, Npk.size, dfile);
                        fclose(dfile);
                        free(p);
                }
        }
        free(pathname);
        free(fullpath);

        return 0;
}

int main(int argc, char *argv[]) {
        FILE* source = fopen(argv, "rb");
        de_npk(source, argv);

        return EXIT_SUCCESS;
}

WGHBOY 发表于 2010-7-27 20:54:40

都是强人

lxbs 发表于 2010-7-28 17:35:08

牛人一个

9939781 发表于 2010-7-29 07:35:14

没封包工具?白买了,悲剧。

rotm 发表于 2010-7-29 09:02:00

没封包工具?白买了,悲剧。
9939781 发表于 2010-7-29 07:35 http://bbs.routerclub.com/images/common/back.gif

这不怪我吧?我都说了:“你要是能看懂,修改修改实现解包后再打包一点也不难。”

hackwen 发表于 2010-7-29 11:58:37

既然买了.就把附件再传上来.免费共享!

mxso 发表于 2010-7-29 12:59:27

楼主还未懂得3.22之后npk要经校验,所以你那脚本=浪费空间!
呵呵竟有4个小白买了

2592621 发表于 2010-7-29 13:19:18

本帖最后由 2592621 于 2010-7-29 13:21 编辑

50个铜板啊??这个软件以前管理员不是都已经发过了吗

http://bbs.routerclub.com/thread-37428-1-1.html

rotm 发表于 2010-7-29 15:16:12

本帖最后由 rotm 于 2010-7-29 15:21 编辑

楼上的楼上,npk 刚加校验时我就知道了,检验算法用了 SHA1,还有其它,没继续分析 ......   
我这是解包工具,校不校验不影响,照样解。至于打包功能,我不需要,所以没实现。

楼上,这个是源码,可以自己修改实现自己想要的功能。

11 发表于 2010-7-29 16:01:53

楼上,你确认它的检验算法是sha1?
有朋友告诉我说是ecc算法,我以为无法攻破了。
页: [1] 2 3
查看完整版本: 【原创】 npk 文件解包工具+源代码