Изменение ЕХЕ файла с цифровой подписью, без потери оной.
От: falcoware Ниоткуда https://falco3d.com
Дата: 21.12.17 11:25
Оценка:
Привет,

иногда надо раздавать свои инсталлеры партнерам, подписывая каждый инсталлер партнера, чтобы начислить ему деньги в случае установки его партнерского дистрибутива.

Самый оптимальный способ "присобачить" его ID к концу ехе и во время инсталляции дистрибутива проверять конец файла и запускать соответствующий скрипт в партнерке.

Однако, как известно, при изменении ЕХЕ исчезает цифровая подпись.

Решение:

$src1 = "http://falcoware.com/distributives/" . $filename;
// $src2 = "http://falcogames.com/distributives/" . $filename;

// Workaround agaist redirecting to Paul server!
$src2 = "../falcogames.com/distributives/" . $filename;

$filesize = intval($this->size);

if (copy($src1, $user_file) || copy($src2, $user_file)) {

$bigfile_directory = realpath('TempBigFile') . DIRECTORY_SEPARATOR;

$addfile = "50M.txt";

if($filesize < 0){ $filesize = 0; }
if($filesize > 1000){ $filesize = 1000; }

$CERTIFICATE_ENTRY_OFFSET = 148 + 4;
$PAYLOAD_ALIGNMENT = 8;

$result_user_file = fopen($user_file, 'r');
$FileLength = $CERTIFICATE_ENTRY_OFFSET * 10;//filesize($user_file);
$contents = fread($result_user_file, $FileLength);

fclose($result_user_file);

$padding = 0;
if($filesize != 0){ $padding = 8 — ($filesize * 1000000) % 8; }

$nStart = strrpos($contents, "PE\0\0");
if(($nStart !== false) /*&& ($filesize == 0)*/){
$nStart += $CERTIFICATE_ENTRY_OFFSET;
$nCertTableOffset = substr($contents, $nStart, 4);
$nCertTableOffset1 = array_merge(unpack("L", $nCertTableOffset));

$nCertTableSize = substr($contents, $nStart + 4, 4);
$nCertTableSize1 = array_merge(unpack("L", $nCertTableSize));

$nCertTableSize1[0] = $nCertTableSize1[0] + 16 + $filesize * 1000000 + $padding;
$nNewCertTableSize = pack("L", $nCertTableSize1[0]);
$contents = substr_replace($contents, $nNewCertTableSize[0].$nNewCertTableSize[1].$nNewCertTableSize[2].$nNewCertTableSize[3], $nStart + 4, 4);
// $contents = substr_replace($contents, $nNewCertTableSize[0].$nNewCertTableSize[1].$nNewCertTableSize[2].$nNewCertTableSize[3], $nCertTableOffset1[0], 4);

$result_user_file = fopen($user_file, 'c');
fwrite($result_user_file, $contents, $FileLength);

fseek($result_user_file, $nCertTableOffset1[0]);
fwrite($result_user_file, $nNewCertTableSize[0].$nNewCertTableSize[1].$nNewCertTableSize[2].$nNewCertTableSize[3], 4);

fclose($result_user_file);
}

$result_user_file = fopen($user_file, 'a');

if($filesize != 0){
$bigfile_directory = $bigfile_directory . $addfile;
$ArrayFile = file_get_contents($bigfile_directory);

$WhileSize = $filesize;
while($WhileSize > 50){
fwrite($result_user_file, (string)$ArrayFile, 50 * 1000000);
$WhileSize = $WhileSize — 50;
}
fwrite($result_user_file, (string)$ArrayFile, $WhileSize * 1000000);
fwrite($result_user_file, (string)$ArrayFile, $padding);
}

fwrite($result_user_file, '1234567890' . $this->user_id);
fclose($result_user_file);

https://falco3d.com — Народный Двиг!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.