二进制文件每两个的字节位置交换

(一).写作缘由:

写这篇博客的目的是是为了方便下次使用或者帮助其他需要的人。在打CTF的时候,偶尔会遇到还原一些文件,笔者遇到的是分析数据流量的时候,提取出了一个未知文件,用二进制编辑器打开,搜所文件头,发现和某个文件头有点相似,但是每两个字节位置颠倒了,于是就想到把每两个字节交换位置,就像下面这种:

(二).演示及效果:

在命令行执行前后如下图:

(三).贴上代码:

代码是C写的,有点多不太美观,功能太单一, 也没弄啥模块化,编写环境是windows。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char** argv)
{
	//The pointer of input file and output file
	FILE *fin;
	FILE* fout;

	//The file name of input file and output
	char* inFile;
	char* outFile;

	//The pointer of single and double byte type
	unsigned short* pDouble = NULL;
	unsigned char* pSingle = NULL;

	//The memery buffer of header and tail pointer about input file
	void* fBuffStart = NULL;
	void* fBuffEnd = NULL;

	//The size of input file (Byte)
	unsigned long fileSize = 0;

	//Judge the count of parameter and the file name limit 
	if(argc != 3 || strlen(argv[1]) > 255 || strlen(argv[2]) > 255)
	{
		printf("\n[-]Usage: %s infile outfile\n", argv[0]);
		printf("[-]Filename limited: 255 Byte\n");
		exit(-1);
	}

	inFile = argv[1];
	outFile = argv[2];

	//Exception handling
	if(!(fin = fopen(inFile, "rb")))
	{
		printf("Error: open %s failed!\n", inFile);
		exit(-1);
	}

	//Obtain file size
	fseek(fin, 0, SEEK_END);
	fileSize = ftell(fin);
	fseek(fin, 0, SEEK_SET);

	//Alloc memery  for input file and read its data to memery
	fBuffStart = (unsigned char*)malloc(fileSize);
	memset(fBuffStart, 0, fileSize);
	fread(fBuffStart, 1, fileSize, fin);
	fclose(fin);

	//The position of start and end input file memery 
	fBuffEnd = (unsigned char*)fBuffStart + fileSize;
	pDouble = (unsigned short*)fBuffStart;

	//Exception handling
	if(!(fout = fopen(outFile,"wb")))
	{
		printf("Error: open %s failed!\n", outFile);
		exit(-1);
	}

	//Exchange position of each two byte
	while(pDouble != fBuffEnd)
	{
		pSingle = pDouble;
		fwrite(pSingle+1, 1, 1, fout);
		fwrite(pSingle, 1, 1, fout);
		pDouble++;
	}

	fclose(fout);

	return 0;
}

(四).若有不足之处,还请斧正。

原文地址:http://blog.51cto.com/daye8ku/2057530

时间: 2024-10-16 14:41:17

二进制文件每两个的字节位置交换的相关文章

java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置

此类实现:输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组.并交换两个子数组的位置,保持子数组中的元素序号不变.如:原数组为7,9,8,5,3,2 以下标3为分割点,分割为子数组一:7,9,8,5.和子数组二:3,2.经过交换算法后的结果应为:3,2,7,9,8,5 有两种交换算法<1>前插法:将子数组3,2另存在一个临时数组中,将原数组7,9,8,5,3,2每一位向后移两个位置  再将子数组3,2插入到移动好元素位置的原数组中.<2>逆置法:将原数组7

交换数组中两个元素的位置,元素包括key和value 一维数组

/*author: [email protected]description: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a',22=>'b',33=>'c',44=>'d');$res = array_exchange($arr, 11 ,33); //example:echo '<pre>';print_r ($res);echo '</pre>'; function array_e

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

92JavaScript:原生位置交换

九宫格,里面有九张图片,用鼠标拖动其中1张图片置于另1张图片之上时并松开鼠标后,它俩的位置交换.**html 代码** ```html:run<!doctype html><html><head> <meta charset="utf-8"> <title>九宫格--位置交换</title> <style type="text/css"> * { padding: 0; margin

Delphi中的操作二进制文件的两个重要函数

Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家.(申明:非本人所写) 1. 将Byte数组生成文件 procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string );var Count: integer; F: FIle of B

使用容器控制器控制另外两个控制器的view交换

建三个UIViewController 的子控制器,其中一个为根控制器,另外两个控制器的视图作为切换对象 AppDelegate中代码 //AppDelegate.h中代码 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (retain, nonatomic) UIWindow *window; @end //AppDelegate.m中代码

获取字符串长度【把双字节的替换成两个单字节的然后再获得长度

/** * 获取字符串长度[把双字节的替换成两个单字节的然后再获得长度] * @param str * @returns */ function getBlen(str) { if (str == null) return 0; if (typeof str != "string"){ str += ""; } return str.replace(/[^\x00-\xff]/g,"01").length; }

数据结构学习-数组A[m+n]中依次存放两个线性表(a1,a2&#183;&#183;&#183;am),(b1,b2&#183;&#183;&#183;bn),将两个顺序表位置互换

将数组中的两个顺序表位置互换,即将(b1,b2···bn)放到(a1,a2···am)前边. 解法一: 将数组中的全部元素(a1,a2,···am,b1,b2,···bn)原地逆置为(bn,bn-1,···b1,am,am-1···a1),再对前n个元素和后m个元素分别逆置,得到(b1,b2···bn,a1,a2···am),从而实现位置互换. 代码: void Reverse(int a[],int left,int right,int arraySize) {//逆转(aleft,aleft

数据结构:单向链表系列6--交换相邻两个节点1(交换数据域)

给定一个单向链表,编写函数交换相邻 两个元素 输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5 -> 7 输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6 输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5 通过观察发现:当输入的与元素个数是单数的时候,最后一位不参与交换