1、前言

最近在看到同事写了一款封印病毒的程序,非常有意思!原理大致是将PE文件中的ASCII转换成HEX输出到文本中。这样做的目的是为了保存病毒样本的时候不会被杀毒软件查杀!然而却是delphi写的,特别想用C语言自己也实现一个,于是从google翻出了此代码。

2、编译后的结果

3、代码实现原理

为了兼容Win32 + *nix,需要定义头文件,在读取时把【\r\n】和【\n】区分。

// 20171105_bin2hex.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

//Win32 + *nix

#ifdef WIN32

#define CRLF "\r\n"

#else

#define CRLF "\n"

#endif

//number of bytes per line

#define LINELEN 16

void printFileAsHex(FILE* file);

char toVisibleCharacter(int byteVal);

void writeLine(char* lineBuffer, int buflen);

char upperToHex(int byteVal);

char lowerToHex(int byteVal);

char nibbleToHex(int nibble);

int main(int argc, const char* argv[])

{

FILE* file;

//if (argc != 2)

//{

// printf("Usage: phex ");

// printf(CRLF);

// return 1;

//}

// 读写文件

file = fopen("D:\\20171111-test.exe", "rb"); //打开文件

if (NULL == file)

{

printf("Cannot open %s", argv[1]);

printf(CRLF);

return 2;

}

printFileAsHex(file);

fclose(file);

system("pause");

return 0;

}

//主要实现函数

void printFileAsHex(FILE* file)

{

int count = 0;

char buffer[LINELEN]; //临时存放字符的数组

while (1)

{

int byteVal = fgetc(file); //指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

if (EOF == byteVal) //如果文件已经到尾部跳出循环

{

break;

}

buffer[count] = byteVal; //将文件字符存储到数组中

count++; //计算每个字符的数目

if (count >= LINELEN) //提前处理前16个字节

{

writeLine(buffer, LINELEN);

count = 0;

}

}

if (count > 0) //不满16字节的情况处理

{

writeLine(buffer, count);

}

}

char toVisibleCharacter(int byteVal)

{

if (byteVal >= 32 && byteVal <= 126) // 输出可打印字符

{

return (char)byteVal;

}

return '_'; //不可打印就输出_号

}

void writeLine(char* lineBuffer, int buflen)

{

int i;

char str[LINELEN];

// 读写文件

FILE* file = fopen("D:\\20171111-test.txt", "a+");

for (i = 0; i < buflen; i++)

{

char chu = upperToHex(lineBuffer[i]); //取高4位 -->处理成十进制的值

char chl = lowerToHex(lineBuffer[i]); //取低4位 -->处理成十进制的值

printf("%c%c ", chu, chl);

//自增加的-写文件到txt

sprintf(str, "%c%c", chu, chl);

fseek(file, 0, SEEK_END);

fwrite(str, strlen(str), 1, file);

}

fclose(file);

if (buflen < LINELEN)

{

for (i = LINELEN - buflen; i > 0; i--)

{

printf(" ");

}

}

printf("\t");

char str1[LINELEN];

for (i = 0; i < buflen; i++)

{

char ch = toVisibleCharacter(lineBuffer[i]);

printf("%c", ch);

}

printf(CRLF);

}

char upperToHex(int byteVal)

{

int i = (byteVal & 0xF0) >> 4; //0F二进制为00001111,低四位保留,然后右移4位,也就是只取出高4位的意思

return nibbleToHex(i);

}

char lowerToHex(int byteVal)

{

int i = (byteVal & 0x0F); //保留低4位00001111,这次没有右移,所以保留低4位

return nibbleToHex(i);

}

char nibbleToHex(int nibble)

{

const int ascii_zero = 48;

const int ascii_a = 65;

if ((nibble >= 0) && (nibble <= 9))

{

return (char)(nibble + ascii_zero); // 十六进制转换成十进制 返回数字,本来是int型,强转成char了

}

if ((nibble >= 10) && (nibble <= 15))

{

return (char)(nibble - 10 + ascii_a); // 十六进制转换成十进制的字母,本来是int型,强转成char了

}

return '?'; //其余情况返回'?'

}

4、参考

C++ 读取PE文件并十六进制打印输出

C: hex dump application

把十进制数&lpar;long型&rpar;分别以二进制和十六进制形式输出,不能使用printf系列。

编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列. 实现了unsigned long型的转换. // 十进制转换为二进制,十进制数的每1bit转换为二进制的1 ...

C语言 printf格式化输出,参数详解

有关输出对齐 int main(int argc, char* argv[]){ char insertTime[20] = {"1234567890"}; double in ...

c语言 printf格式化输出

#include #include #include using namespace std; int ...

【C语言】- 数据输出-printf&lpar; &rpar;和putchar&lpar; &rpar;

格式化输出函数printf( ) printf( )功能: 向系统指定输出设备按指定的格式输入任意个任意类型的数据,并返回实际输出的字符数.若出错,将返回负数. printf( )使用形式: prin ...

C语言中以字符串形式输出枚举变量

C语言中以字符串形式输出枚举变量 摘自:https://blog.csdn.net/haifeilang/article/details/41079255 2014年11月13日 15:17:20 h ...

xxd - 以十六进制形式表示

总览 (SYNOPSIS) xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile] ...

C语言之一天一个小程序

程序示例: #include #include int main() { printf("Hello,world!\n&qu ...

&lbrack;Windows&rsqb; &lbrack;VS&rsqb; &lbrack;C&rsqb; &lbrack;取得指针所指内存的十六进制形式字符串&rsqb;

接口定义如下: #include // 取得指针所指内存的十六进制形式字符串,size指定字节长度 #define Mem_toString(address, si ...

统计一个16位二进制数中1的个数,并将结果以十六进制形式显示在屏幕上,用COM格式实现。

问题 统计一个16位二进制数中1的个数,并将结果以十六进制形式显示在屏幕上,用COM格式实现. 代码 code segment assume cs:code org 100h main proc ne ...

随机推荐

【BZOJ-2725】故乡的梦 Dijsktra &plus; Tarjan &plus; Dinic &plus; BFS &plus; 堆

2725: [Violet 6]故乡的梦 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 502  Solved: 173[Submit][Status ...

可拖动FPS显示框(UGUI)

简介 本来是想往上找一个可拖动FPS显示框的(我记得以前有人写过),然而搜了一个多小时都没搜到,索性自己写了一个,花费不到20分钟,看来还是自己动手丰衣足食啊 o(╯□╰)o 效果 上下的Toast不 ...

Shell遍历文件的每一行

由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很乱,所以…… cat input.txt |while read line> do&g ...

Codeforces 378B&period; Parade

B. Parade time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

Mac小技巧&colon;强制退出程序的六种方法

原帖地址: http://www.cnbeta.com/articles/175447.htm 1.使用键盘快捷键强制退出处于活跃状态的Mac程序 快捷键:Command+Option+Shift+E ...

定时任务 Wpf&period;Quartz&period;Demo&period;5 &lpar;升级版)

老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...

pku 2284 That Nice Euler Circuit

题意: 给你n个点第n个点保证与第0个点相交,然后求这n个点组成的图形可以把整个平面分成几个面 思路: 这里的解题关键是知道关于多面体的欧拉定理 多面体: 设v为顶点数,e为棱数,f是面数,则v-e+ ...

Effective STL 阅读笔记: Item 3&colon; Make copying cheap and correct for objects in containers

容器 (Containers) 用来存储对象 (Objects), 但是被存储的对象却并非原原本本是你给他的那一个, 而是你指定对象的一个拷贝.而后续对该容器内存储对象的操作,大多也是基于拷贝的. 拷 ...

多进程回声服务器&sol;客户端【linux】

并发服务器端 #include #include #include #include

浅谈dedecms模板引擎工作原理及其自定义标签

浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...

c语言以16进制输出大写字母,【C语言】十六进制形式输出应用程序相关推荐

  1. c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!

    C语言打印16进制出现0xffffff现象的问题剖析! 其实类似的问题不是只在网络程序中才会出现的,看示例代码: 复制代码 1 #include 2 int main() 3 { 4     char ...

  2. python ascii码16进制转换_如何在Python十六进制整数和ASCii编码的字符串之间进行转换...

    今天,我将与您分享一种将Python十六进制整数转换为ASCii编码的字符串的方法,该方法具有很好的参考价值,希望对大家有所帮助. 让我们一起关注小编,看看 当使用Pyserial与STM32通信时, ...

  3. C语言 将16进制转换成10进制输出

    大家好!今天来打印16进制转换成10进制输出,16进制前面是0x.这里以打印ABCDEF的10进制为例 如下: 希望有所启发!!!^__^ 大雨落幽燕,白浪滔天,秦皇岛外打鱼船. ---------- ...

  4. 把16进制转换为ascii字符c语言,ASCII转16进制C语言

    满意答案 u2gseftj278 推荐于 2016.03.01 采纳率:56%    等级:11 已帮助:14340人 以前引别人的,自己懒得再写了呵呵.原理就是这样的,你可以直接用的 //函 数 名 ...

  5. c语言能对16进制数比较大小,C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制.八进制和十六进制. 二进制数.八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八 ...

  6. 使用C++和C语言输入输出16进制数、8进制数

    使用C++输入输出16进制数.8进制数 #include <iostream> #include<cstdio> using namespace std; int main() ...

  7. C语言:16进制字符串转int

    文章目录 前言 代码 前言 今天在C语言中 用到16进制字符串转int整型场景,顺便网上搜了一下 发现有网友用了非常复杂的方法,还去判断字母啥的 用到什么累加的,笔者一想 16进制字符串转int类型 ...

  8. python int 转 16进制字符串 大写_第二课 python的基础命令

    python的文件类型: 类型(type),空对象(none),文件,集合,函数,模块 存储模型:看对象能保存多少对象. 更新模型:对象创建之后是否可以更新值. 访问模型:对象的访问方式. pytho ...

  9. C语言将16进制数转为10进制数

    程序分析: 在16进制转为10进制时会遇到很多情况: 1. 开头是空格.符号等之后才是 0x 或 0X: 对于第一种情况,我们要先判断是字符,把空格这些去了,从字符开始:对于有'+'或'-' 的我们就 ...

最新文章

  1. Hinton新论文:如何在神经网络中表示“部分-整体层次结构”?
  2. 13 个超炫的 Conky 配置
  3. 如何集成Python代码和GUI来创建一个简单的游戏?
  4. .net企业级架构实战之1——框架综述
  5. 大班体育游戏 电子计算机,【大班户外游戏】_幼儿园大班体育游戏活动设计40篇...
  6. bootstrap datatable 数据刷新问题
  7. 怎么讲d 盘里的软件弄到桌面_GNOME 2 粉丝喜欢 Mate Linux 桌面的什么?
  8. 成都这家AI语音芯片公司又融了数千万,能“偷袭”科大讯飞不?
  9. 一个c语言源程序至少包含,一个C源程序必须包含一个main函数
  10. 【Linux基础】Linux简史
  11. memory hierachy
  12. Activity工作流
  13. 88家上市公司区块链分布图:七成拓展落地应用 互联网公司善于底层基础
  14. SSD硬盘无法格式化怎么办
  15. ESP32开发学习 LVGL Littlevgl 使用文件系统
  16. 20190401每周精品之理财
  17. c 语言程序设计第四版郑莉答案,C 语言程序设计郑莉(第4版)
  18. 一个好的创意值多少钱?
  19. Dirty Cow Attack Lab(中文译版)
  20. DBA常用命令——数据库导入导出文件

热门文章

  1. VS Code 所选驱动器或UNC共享不存在或不可访问
  2. 激活synopsys命令
  3. Qt 设置背景图片
  4. 草地与石头模型边缘混合
  5. 28岁程序员目前考虑转行,但又不知道自己能干什么
  6. Git 远程篇之查看远程仓库信息
  7. flask 支付宝的使用
  8. it人成功的六大步骤
  9. 六成受访美国人认为教育系统正在令这一代人失望
  10. 学会聆听,职场最重要的事情,没有之一!!!