优化后的压缩算法:JJJsafe.
经测试其压缩率高于aplib,upx,,,等等常见的压缩算法。
压缩算法以静态库的形式提供给大家使用(进行过上千万次的压缩解压测试),详细的接口和示例如下:
JJJsafe.h 内容如下:
/*
- JJJsafeLib compression library
- COFF format header file
- Copyright (c) 2010-2024 Beijing JJJsafe Technology
- All Rights Reserved
- http://www.910safe.com/
*/
#ifndef JJJSAFELIB_H_INCLUDED
#define JJJSAFELIB_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
////////////////////////////////////////////////////////////////////////////////
// 函数名称:BOOL Jsafe_compress(unsigned char *dest, unsigned int *destLen, unsigned char *source, unsigned int sourceLen, int(__cdecl *pcallback) (unsigned int, unsigned int))
// 实现功能:压缩数据
// 对全局变量的影响:无
// 参数说明:
// dest - 输出缓冲区
// destLen - 压缩后长度返回指针
// source - 输入缓冲区
// sourceLen - 输入长度
// pcallback - 进度显示
// 返回结果说明: - TRUE :压缩完成,FASLE:压缩失败。
////////////////////////////////////////////////////////////////////////////////
BOOL Jsafe_compress(unsigned char *dest, unsigned int *destLen, unsigned char *source, unsigned int sourceLen, int(__cdecl *pcallback) (unsigned int, unsigned int));
////////////////////////////////////////////////////////////////////////////////
// 函数名称:BOOL Jsafe_uncompress(unsigned char *dest, unsigned int *destLen, unsigned char *source, unsigned int sourceLen, int(__cdecl *pcallback) (unsigned int, unsigned int))
// 实现功能:解压数据
// 对全局变量的影响:无
// 参数说明:
// dest - 输出缓冲区
// destLen - 解压后长度返回指针
// source - 输入缓冲区
// sourceLen - 输入长度
// pcallback - 进度显示
// 返回结果说明: - TRUE :压缩完成,FASLE:压缩失败。
////////////////////////////////////////////////////////////////////////////////
BOOL Jsafe_uncompress(unsigned char *dest, unsigned int *destLen, unsigned char *source, unsigned int sourceLen, int(__cdecl *pcallback) (unsigned int, unsigned int));
////////////////////////////////////////////////////////////////////////////////
// 函数名称:unsigned int Jsafe_max_packed_size(unsigned int inputsize)
// 实现功能:返回压缩所需输出缓冲区的大小
// 对全局变量的影响:无
// 参数说明:
// inputsize - 压缩数据长度
// 返回结果说明: 所需输出缓冲区的大小
////////////////////////////////////////////////////////////////////////////////
unsigned int Jsafe_max_packed_size(unsigned int inputsize);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* JJJSAFELIB_H_INCLUDED */
test_jsafe.cpp 测试样例:
// test_jsafe.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <malloc.h>
#include <windows.h>
#include "JJJsafe.h"
#pragma comment(lib,"JJJsafe.lib")
//#pragma comment (linker,"/NODEFAULTLIB:libcmt.lib")
#pragma warning(disable: 4996)
unsigned char rotator[] = "-\|/";
int rotatorpos = 0;
int __cdecl Jsafe_PercentPrinter(unsigned int inpos, unsigned int insize)
{
printf("\r%c Packing data -> %2.2f%%", rotator[rotatorpos], 100.0*(double)inpos / (double)insize);
rotatorpos = (rotatorpos + 1) & 0x0003;
return 0;
}
int main(int argc, char* argv[])
{
FILE *ifile, *ofile;
unsigned char *src, *dst;
BOOL bret = FALSE;
unsigned int oldsize = 0, dst_size = 0,src_size = 0;
char sz_ratio[MAX_PATH];
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | if ((ifile = fopen( "1.exe" , "rb" )) = = NULL)
{
printf( "open file error!\n" );
return 0 ;
}
fseek(ifile, 0 , SEEK_END);
oldsize = ftell(ifile);
fseek(ifile, 0 , SEEK_SET);
src = (unsigned char * )malloc(oldsize);
if (src = = NULL)
{
fclose(ifile);
printf( "alloc memory error!\n" );
return 0 ;
}
fread(src, oldsize, 1 , ifile);
fclose(ifile);
dst = (unsigned char * )malloc(Jsafe_max_packed_size(oldsize));
if (dst = = NULL)
{
fclose(ifile);
free(src);
printf( "alloc memory error!\n" );
return 0 ;
}
bret = Jsafe_compress(dst,&dst_size,src,oldsize,Jsafe_PercentPrinter);
if (bret = = FALSE)
{
fclose(ifile);
free(src);
free(dst);
printf( "Compression error!\n" );
return 0 ;
}
sprintf(sz_ratio, "%2.1f%%" ,(double)dst_size * 100.0 / (double)oldsize);
printf( "\nCompression ratio : %s\n" ,sz_ratio);
/ / 清空原始数据。
memset(src, 0 , oldsize);
bret = Jsafe_uncompress(src,&src_size,dst,dst_size,Jsafe_PercentPrinter);
if (bret = = FALSE)
{
fclose(ifile);
free(src);
free(dst);
printf( "Decompression error!\n" );
return 0 ;
}
fclose(ifile);
free(dst);
printf( "\n" );
if ((ofile = fopen( "2.exe" , "wb" )) = = NULL)
{
free(src);
printf( "open file error!\n" );
return 0 ;
}
fwrite(src, src_size, 1 , ofile);
fclose(ofile);
free(src);
printf( "over!!!\n" );
getchar();
return 0 ;
|
}
附件中有测试程序和测试样本。
解压工具(WinUar)下载地址:http://910safe.com/pages/down/setup2.zip
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-7-28 09:18
被910编辑
,原因: