1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言以16进制输出大写字母 【C语言】十六进制形式输出应用程序

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

时间:2022-09-02 05:15:47

相关推荐

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

1、前言

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

2、编译后的结果

3、代码实现原理

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

// 1105_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:\\1111-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:\\1111-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语言中以字符串形式输出枚举变量 摘自:/haifeilang/article/details/41079255 11月13日 15:17:20h ...

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 SecMemory Limit:128 MBSubmit:502Solved: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;强制退出程序的六种方法

原帖地址: /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代码是更顺手,同时能学 ...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。