测试PHP Carve for JPG文件

时间:2011-07-18 22:40:11

标签: php

我只是为了好玩而制作一个小程序/页面。我的最终目标是允许自己将图像文件上传到我的mysql数据库。然后将该文件调用为ASCII格式的字符串,然后将该文件刻录为我创建的JPG文件。

为了测试这个,我使用了FTK Imager程序和我的网络服务器,结果不太合适。当然,我对PHP很新,所以我知道可能有很多我无知的事情,我做错了。所以我希望得到一些指示:)

我的程序 - 使用FTK Imager创建和UNCOMPRESSED ad1图像文件。我创建了一个包含多个文件的目录的图像。 .docx,.pdf,.jpeg等等。然后我将此图像文件与我的测试页一起添加到我的webservers目录中。然后我通过浏览器窗口调用页面。

我受到了一个6的欢迎。那是我的输出,一个6.我试着回应一些错误,因为执行代码加上一些错误报告和我能说的最好,$ soff isn'因某种原因得到预期的价值(没有确切的价值。)

为什么这不会得到正确的值?我知道这些是正确的ASCII标题/预告片签名。

这是我的脚本,其中包含echo'ing和错误部分。

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
// Search Criterium
$jpgs = "ÿØÿà";
echo "yoya Start<br />" . $jpgs;
$jpgeoff = "702";
echo "<br />" . $jpgeoff;
$jpge = "ÿÙ";
echo "<br />" . $jpge;
// Input file to string
$ipfile = file_get_contents('testimage.ad1');
// Input file length for math
$m1 = strlen($ipfile);
echo "<br />" . $m1;
// Check for empty file
if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; }
// Set starting offset with first criterium find
$soff = strpos($ipfile, $jpgs);
echo "<br />" . $soff;
// Do math to find where to start substr to cut first part off beginning of string.
$x1 = ($soff - 1);
echo "<br />" . $x1;
$x2 = ($m1 - $soff);
echo "<br />" . $x2;
// Execute the final math into cuts.
$ipfile = substr($ipfile, $x1, $x2);
// New input file length for more math.
$m2 = strlen($ipfile);
echo "<br />" . $m2;
// Set ending offset with jpgeoff to skip false positives for jpegs, then jpge to find real trailer character.
$eoff = strpos($ipfile, $jpge, $jpgeoff);
echo "<br />" . $eoff;
// Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off.
$y1 = "0";
echo "<br />" . $y1;
$y2 = ($eoff + 1);
echo "<br />" . $y2;
// Execute the final math into cuts.
$ipfile = substr($ipfile, $y1, $y2);
// The $ipfile string should now contain the ASCII string of only the JPG file.
echo $ipfile;
?>

这是我的网络浏览器中的输出。

yoya Start
ÿØÿà
702
ÿÙ
16542148

-1
16542148
1
Warning: strpos() [function.strpos]: Offset not contained in string in /var/www/html/test1.php on line 32


0
16

我从这里http://www.garykessler.net/library/file_sigs.html引用了我的文件签名信息,并通过在FTK Imager中查看我的jpg文件来验证这一点。

我能想到的最好的方法是,我应该通过不同的方式告诉我的脚本在图像中查找标题/签名信息的偏移量。

非常欢迎任何信息!这只是为了娱乐和学习。

谢谢:)

编辑 - 7月22日

我一直在处理我的代码。我做了一些编辑,以更好地反映JPEG文件的结构,当它以十六进制查看时,这将是我将要搜索的内容。我遇到一个错误,似乎strpos没有“看到”0?我的程序几乎返回结果,标题和一切看起来都很棒,但strpos或者其他东西......在jpeg文件的十六进制中找到了这些点的误报...

False Positive

当我需要FFD9紧挨着彼此时,正在读取这两个零的每一侧的FFD9 ......

这是我更新的代码,

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
// HEX/STR Functions for converting string to hex and vice versa
function strhex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function hexstr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}
// Search Criterium
$jpgs = "ffd8ff";
echo "yoya Start<br />" . $jpgs;
echo "<br />jpgoff " . $jpgeoff;
$jpge = "ffd9";
echo "<br />jpge " . $jpge;
// Input file to string
$ipfileg = file_get_contents('ti.ad1');
// Turn to hex
$ipfile = strhex($ipfileg);
// Input file length for math
$m1 = strlen($ipfile);
echo "<br />m1 " . $m1;
// Check for empty file
if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; }
// Set starting offset with first criterium find
$soff = strpos($ipfile, $jpgs);
echo "<br />soff " . $soff;
// Do math to find where to start substr to cut first part off beginning of string.
$x1 = $soff;
echo "<br />x1 " . $x1;
$x2 = ($m1 - $soff);
echo "<br />x2 " . $x2;
// Execute the final math into cuts.
$ipfile = substr($ipfile, $x1, $x2);
// New input file length for more math.
$m2 = strlen($ipfile);
echo "<br />m2 " . $m2;
// Set ending offset. My jpeg test files had three hits for FFD9, so I need to skip two.
$eoff1 = strpos($ipfile, $jpge);
$eoff2 = ($eoff1 + 1);
$eoff3 = strpos($ipfile, $jpge, $eoff2);
$eoff4 = ($eoff3 + 1);
$eoff = strpos($ipfile, $jpge, $eoff4);
echo "<br />eoff " . $eoff;
// Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off.
$y1 = "0";
echo "<br />y1 " . $y1;
$y2 = ($eoff + 4);
echo "<br />y2 " . $y2;
// Execute the final math into cuts.
$ipfile = substr($ipfile, $y1, $y2);
// Convert hex to ASCII string.
$ipfile = hexstr($ipfile);
// The $ipfile string should now contain the ASCII string of only the JPG file.
echo "<br />final " . $ipfile;
// Create JPG file.
file_put_contents("test.jpg", $ipfile);
?>

1 个答案:

答案 0 :(得分:1)

问题当然不是strpos()函数,这是一个测试:

$needle = "ÿÙ";
$haystack1 = "afafjkaskÿ\0Ùasdf";
$haystack2 = "afafjkaskÿÙasdf";
var_dump( strpos( $haystack1, $needle ) );
var_dump( strpos( $haystack2, $needle ) );

结果:

bool(false)
int(9)

strpos()完全符合预期。