⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个linux下的二进制文件工具
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>#include <sys/types.h>        // uint64_t#include <stdlib.h>#include <ncurses.h>#include "gpl.h"#include "ui.h"#ifdef FREEBSD	#define file_position_t uint64_t#endif#ifdef LINUX	#include <stdint.h>	#define file_position_t uint64_t#endif#ifdef IRIX        #define file_position_t fpos_t#endif#ifdef SOLARIS	#define file_position_t fpos64_t#endif#ifdef HPUX	#define file_position_t fpos64_t#endifFILE* inputfile;FILE* inputfile2;int obenanfangen=1;file_position_t cursorpos;unsigned int cols;int rows;FILE *inputfile;file_position_t chpos[524288];unsigned char change[524288];int chnum=0;char* searchstring;int searchstring2[255];unsigned int searchstring2len=0;int searchstring3[255];unsigned int searchstring3len=0;char* writesearchfilename;char* readsearchfilename;FILE *readsearchfile;int writesearch=0;int readsearch=0;int kmp[256];int kmpback[256];int diffnotedit=0;char* tohex(char x){	char ziffern[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};	char* ch;	int z=(int)x;	if (z<0) z=256+z;	ch=malloc(3);		ch[0]=ziffern[z/16];	ch[1]=ziffern[z%16];	ch[2]=0;	return ch;		}void print_pos(WINDOW *parent_window, file_position_t p,int y){	mvwprintw(parent_window,y,0,"%10X",(unsigned long) p);		}void print_hex(WINDOW *parent_window,file_position_t p,file_position_t cursorpos,file_position_t filesize,file_position_t rfilesize,int hexnotasc,int ch2){	unsigned char buffer[2];	float f;	unsigned int i;	int j;	int x;	int y;	int c;	file_position_t ap=p;	f=(float)COLS-10;	f=f/4.125;	cols=(int)f;	x=COLS-10-((int)((float)cols*4.125));	rows=LINES-2;	wattrset(parent_window,attrs[COLOR_BRACKETS]);	mvwprintw(parent_window,0,1,"[          /          ]");	wattrset(parent_window,attrs[COLOR_TEXT]);	mvwprintw(parent_window,0,2,"%10X",(unsigned long)cursorpos);		mvwprintw(parent_window,0,13,"%10X",(unsigned long)(filesize-1));		wattrset(parent_window,attrs[COLOR_HEXFIELD]);	fseek(inputfile,p,SEEK_SET);	for (y=1;y<LINES-1;y++)	{		wattrset(parent_window,attrs[COLOR_HEXFIELD]);		print_pos(parent_window,p+(y-1)*cols,y);		for (i=0;i<cols;i++)		{			if (!feof(inputfile)) fgets(buffer,sizeof(buffer),inputfile);			c=buffer[0];						if (chnum!=0) for (j=0;j<chnum;j++) if (ap==chpos[j]) c=change[j];			f=(float)i;			f=f*3.125;			if (ap==cursorpos && hexnotasc==1 && ap<=filesize) 			{				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]);				if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]);			} else {				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_HEXFIELD]); else wattrset(parent_window,attrs[COLOR_DIFF]);				if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_DIFF]);			}			if (ch2==0 || ap!=cursorpos) 			if (ap<filesize) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(c)); else mvwprintw(parent_window,y,(int)f+10+x/2,"  ");		 			else if (ch2!=0 && ap==cursorpos)			{				mvwprintw(parent_window,y,(int)f+10+x/2,"%c ",ch2);			}			wattrset(parent_window,attrs[COLOR_HEXFIELD]);			mvwprintw(parent_window,y,(int)f+12+x/2," ");				if (ap==cursorpos && hexnotasc==0 && ap<=filesize) 			{				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]);			} else {				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_HEXFIELD]); else wattrset(parent_window,attrs[COLOR_DIFF]);			}			if (ap<filesize) if (c>=32 && c<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)c);	else			mvwprintw(parent_window,y,(int)i+(COLS-cols),".");	else mvwprintw(parent_window,y,(int)i+(COLS-cols)," ");			ap++;		}	}	}void print_hex_diff( WINDOW *parent_window,	                 file_position_t p,					 file_position_t cursorpos,					 file_position_t filesize1,					 file_position_t filesize2,					 char* filename2){	unsigned char buffer[2];	unsigned char buffer2[2];	float f;	unsigned int i;	int x;	int y;	int b;	file_position_t ap=p;	f=(float)COLS-10;	f=f/4.125;	cols=(int)f;	x=COLS-10-((int)((float)cols*4.125));	rows=LINES-2;	b=(LINES-1)/2;	draw_mainheadline(parent_window,b,filename2);	wattrset(parent_window,attrs[COLOR_BRACKETS]);	mvwprintw(parent_window,0,1,"[          /          ]");	mvwprintw(parent_window,b,1,"[          /          ]");	wattrset(parent_window,attrs[COLOR_TEXT]);	mvwprintw(parent_window,0,2,"%10X",(unsigned long)cursorpos);		mvwprintw(parent_window,0,13,"%10X",(unsigned long)(filesize1-1));		mvwprintw(parent_window,b,2,"%10X",(unsigned long)cursorpos);		mvwprintw(parent_window,b,13,"%10X",(unsigned long)(filesize2-1));		wattrset(parent_window,attrs[COLOR_HEXFIELD]);	fseek(inputfile,p,SEEK_SET);	fseek(inputfile2,p,SEEK_SET);	for (y=1;y<b;y++)	{		wattrset(parent_window,attrs[COLOR_HEXFIELD]);		print_pos(parent_window,p+(y-1)*cols,y);		print_pos(parent_window,p+(y-1)*cols,y+b);		for (i=0;i<cols;i++)		{			if (!feof(inputfile)) fgets(buffer,sizeof(buffer),inputfile);			if (!feof(inputfile2)) fgets(buffer2,sizeof(buffer2),inputfile2);			// TODO: find a nice and satisfactional way to edit two files at once!/*			c=buffer[0];						if (chnum!=0) for (j=0;j<chnum;j++) if (ap==chpos[j]) c=change[j];			f=(float)i;			f=f*3.125;			if (ap==cursorpos && hexnotasc==1 && ap<=filesize) 			{				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]);				if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]);			} else {				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_BRACKETS]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]);				if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]);			}			if (ch2==0 || ap!=cursorpos) 			if (ap<filesize) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(c)); else mvwprintw(parent_window,y,(int)f+10+x/2,"  ");		 			else if (ch2!=0 && ap==cursorpos)			{				mvwprintw(parent_window,y,(int)f+10+x/2,"%c ",ch2);			}			wattrset(parent_window,attrs[COLOR_BRACKETS]);			mvwprintw(parent_window,y,(int)f+12+x/2," ");				if (ap==cursorpos && hexnotasc==0 && ap<=filesize) 			{				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]);			} else {				if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_BRACKETS]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]);			}			if (ap<filesize) if (c>=32 && c<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)c);	else			mvwprintw(parent_window,y,(int)i+(COLS-cols),".");	else mvwprintw(parent_window,y,(int)i+(COLS-cols)," ");			*/						f=(float)i;			f=f*3.125;			if (buffer[0]!=buffer2[0] || ap>=filesize1 || ap>=filesize2) wattrset(parent_window,attrs[COLOR_DIFF]); else wattrset(parent_window,attrs[COLOR_HEXFIELD]);			if (ap<filesize1) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(buffer[0])); else mvwprintw(parent_window,y,(int)f+10+x/2,"  ");			if (ap<filesize2) mvwprintw(parent_window,y+b,(int)f+10+x/2,"%s",tohex(buffer2[0])); else mvwprintw(parent_window,y+b,(int)f+10+x/2,"  ");			if (ap<filesize1) if (buffer[0]>=32 && buffer[0]<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)buffer[0]); else mvwprintw(parent_window,y,(int)i+(COLS-cols),".");      else mvwprintw(parent_window,y,(int)i+(COLS-cols)," ");			if (ap<filesize2) if (buffer2[0]>=32 && buffer2[0]<=127) mvwprintw(parent_window,y+b,(int)i+(COLS-cols),"%c",(char)buffer2[0]); else mvwprintw(parent_window,y+b,(int)i+(COLS-cols),".");      else mvwprintw(parent_window,y+b,(int)i+(COLS-cols)," ");			wattrset(parent_window,attrs[COLOR_HEXFIELD]);			mvwprintw(parent_window,y,(int)f+12+x/2," ");			mvwprintw(parent_window,y+b,(int)f+12+x/2," ");			ap++;					}	}	wrefresh(parent_window);	}char* tobin(unsigned int value){	char* s;	unsigned int i;	s=malloc(20);	s[19]=0;	for (i=0;i<19;i++)	{		if (value & (1<<i)) {		  s[18-i]='1'; 		} else {		  s[18-i]='0';		}	}	for (i=0;i<18;i++)	{		if (s[i]=='0') s[i]=' '; else i=18;	}	return s;}char* tooct(unsigned int value){	char *s;	int i;	s=malloc(20);	s[19]=0;	for (i=0;i<19;i++)	{		s[18-i]=48+(value%8);		value=value/8;	}	for (i=0;i<18;i++)	{		if (s[i]=='0') s[i]=' '; else i=18;	}	return s;}char* toint(unsigned int value){	char *s;	int i;	s=malloc(20);	s[19]=0;	for (i=0;i<19;i++)	{		s[18-i]=48+(value%10);		value=value/10;	}	for (i=0;i<18;i++)	{		if (s[i]=='0') s[i]=' '; else i=18;	}	return s;}char* tohex2(unsigned int value,int maxlen){	char *s;	int i;	s=malloc(maxlen+1);	for (i=0;i<maxlen;i++)	{		s[maxlen-1-i]=48+(value%16);		value=value/16;		if (s[maxlen-1-i]>=58) s[maxlen-1-i]=s[maxlen-1-i]+7;	}	for (i=0;i<maxlen-1;i++)	{		if (s[i]=='0') s[i]=' '; else i=18;	}	return s;}int stobin(const char* s){	unsigned int i;	int v=0;	for (i=0;i<strlen(s);i++)	{		if (s[i]=='0') v=v<<1;		if (s[i]=='1') v=(v<<1)+1;	}	return v;}int stooct(const char* s){	unsigned int i;	int v=0;	for (i=0;i<strlen(s);i++)	{		if (s[i]>='0' && s[i]<='7') v=v*8+(s[i]-48);	}	return v;}int stoint(const char* s){	unsigned int i;	int v=0;	for (i=0;i<strlen(s);i++)	{		if (s[i]>='0' && s[i]<='9') v=v*10+(s[i]-48);	}	return v;}file_position_t stohex(const char* s){	file_position_t i;	file_position_t v=0;	for (i=0;i<strlen(s);i++)	{		if (s[i]>='0' && s[i]<='9') v=v*16+(s[i]-48);		if (s[i]>='A' && s[i]<='F') v=v*16+(s[i]-55);		if (s[i]>='a' && s[i]<='f') v=v*16+(s[i]-87);	}	return v;}void hexcalc(WINDOW* parent_window){	int wtop;	int wbot;	int wleft;	int wright;	int m=0;	long value=45054;	char* s;	wtop=LINES/2-3;	wbot=wtop+7;	wleft=COLS/2-15;	wright=wleft+30;	new_menu(1);	menu_item(0,wtop+1,wleft+1,"%Binary",'b','B',0);	menu_item(1,wtop+2,wleft+1,"%%Octal",'o','O',0);	menu_item(2,wtop+3,wleft+1,"%%Decimal",'d','D',0);	menu_item(3,wtop+4,wleft+1,"%%Hexadec",'h','H',0);	menu_item(4,wtop+6,wleft+1,"E%%xit Hexcalc",'x','X',0);	m=0;	if (LINES>9 && COLS>30)	{		draw_frame(parent_window,wtop,wleft,wbot,wright,' ');		headline(parent_window,wtop,wleft,"HEXCALC");		while (m!=4) 		{			wattrset(parent_window,attrs[COLOR_BRACKETS]);			mvwprintw(parent_window,wtop+1,wleft+9,"[                   ]");			mvwprintw(parent_window,wtop+2,wleft+9,"[                   ]");			mvwprintw(parent_window,wtop+3,wleft+9,"[                   ]");			mvwprintw(parent_window,wtop+4,wleft+9,"[                   ]");			wattrset(parent_window,attrs[COLOR_TEXT]);			mvwprintw(parent_window,wtop+1,wleft+10,"%s",tobin(value));			mvwprintw(parent_window,wtop+2,wleft+10,"%19o",value);			mvwprintw(parent_window,wtop+3,wleft+10,"%19i",value);			mvwprintw(parent_window,wtop+4,wleft+10,"%19X",value);			m=menu_show(parent_window);			if (m==0)			{				s=input2(parent_window,wtop+1,wleft+10,19,tobin(value),19,0,0);				value=stobin(s);				free(s);			}			if (m==1)			{				s=input2(parent_window,wtop+2,wleft+10,19,tooct(value),19,0,0);				value=stooct(s);				free(s);			}			if (m==2)			{				s=input2(parent_window,wtop+3,wleft+10,19,toint(value),19,0,0);				value=stoint(s);				free(s);			}			if (m==3)			{				s=input2(parent_window,wtop+4,wleft+10,19,tohex2(value,19),19,0,0);				value=(int)stohex(s);				free(s);			}		}		wattrset(parent_window,attrs[COLOR_HEXFIELD]);		erase_frame(parent_window,wtop,wleft,wbot,wright,' ');	}}void draw_menu(WINDOW* parent_window){	wattrset(parent_window,attrs[COLOR_MENU]);	mvwprintw(parent_window,LINES-1,1 ,"Search ");	mvwprintw(parent_window,LINES-1,9 ,"Goto   ");	mvwprintw(parent_window,LINES-1,17,"HexCalc");	mvwprintw(parent_window,LINES-1,25,"       "); 	mvwprintw(parent_window,LINES-1,33,"Next   ");	mvwprintw(parent_window,LINES-1,41,"Previou");	mvwprintw(parent_window,LINES-1,49,"       "); 	mvwprintw(parent_window,LINES-1,57,"       "); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -