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

📄 main.c

📁 一个linux下的二进制文件工具
💻 C
📖 第 1 页 / 共 3 页
字号:
	mvwprintw(parent_window,LINES-1,65,"UnDo   ");	mvwprintw(parent_window,LINES-1,73,"Exit   ");	wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]);	mvwprintw(parent_window,LINES-1,0,"1");	mvwprintw(parent_window,LINES-1,8,"2");	mvwprintw(parent_window,LINES-1,16,"3");	mvwprintw(parent_window,LINES-1,24,"4");	mvwprintw(parent_window,LINES-1,32,"5");	mvwprintw(parent_window,LINES-1,40,"6");	mvwprintw(parent_window,LINES-1,48,"7");	mvwprintw(parent_window,LINES-1,56,"8");	mvwprintw(parent_window,LINES-1,64,"9");	mvwprintw(parent_window,LINES-1,72,"0");	}void exit_yesno(WINDOW* parent_window,char* filename){	int wtop;	int wbot;	int wleft;	int wright;	int m,i;	wtop=LINES/2-2;	wbot=wtop+4;	wleft=COLS/2-16;	wright=wleft+33;	new_menu(0);	menu_item(1,wtop+3,wleft+1,"<%%Yes>",'y','Y',0);	menu_item(2,wtop+3,wleft+15,"<%%No>",'n','N',0);	menu_item(0,wtop+3,wleft+25,"<%%Cancel>",'d','D',0);	if (LINES>9 && COLS>32)	{		draw_frame(parent_window,wtop,wleft,wbot,wright,' ');		wattrset(parent_window,attrs[COLOR_TEXT]);		mvwprintw(parent_window,wtop+1,wleft+1,"Do you want to save the changes?");			headline(parent_window,wtop,wleft,"EXIT");		m=menu_show(parent_window);		if (m==2) finish(0);		if (m==1) 		{			fclose(inputfile);			inputfile=fopen(filename,"r+");			for (i=0;i<chnum;i++)			{				fseek(inputfile,chpos[i],SEEK_SET);				fprintf(inputfile,"%c",change[i]);			}			fclose(inputfile);				finish(0);		}		wattrset(parent_window,attrs[COLOR_HEXFIELD]);		erase_frame(parent_window,wtop,wleft,wbot,wright,' ');	}}void printsearchstring3(WINDOW* parent_window,int y,int x,int offset){	unsigned int i;	for (i=0;i<10 ;i++)	{		if ((i+offset)<searchstring3len) {		mvwprintw(parent_window,y,x+i*3,tohex(searchstring3[i+offset]&255));		mvwprintw(parent_window,y,x+2+i*3," ");		if ((searchstring3[i+offset]&256)==256) mvwprintw(parent_window,y,x+i*3,".");		if ((searchstring3[i+offset]&512)==512) mvwprintw(parent_window,y,x+1+i*3,".");		} else mvwprintw(parent_window,y,x+i*3,"   ");	}}void kmpPreprocesshex(){	unsigned int i=0;	int j=-1;	kmp[i]=j;	while ( i < searchstring2len)	{		while (j>=0 && searchstring2[i]!=searchstring2[j]) 		{			j=kmp[j];					}		i++; j++; 		kmp[i]=j;	}	}void kmpPreprocesshexback(){	int i=searchstring2len-1;	int j=-1;	kmpback[i]=j;	while (i>=0)	{		while (j>=0 && searchstring2[i]!=searchstring2[j]) 		{			j=kmpback[j];					}		i--; j++; 		kmpback[i]=j;	}	}file_position_t searchforwardhex( file_position_t cursorpos,	                              file_position_t filesize){	unsigned char buffer[524288];	FILE *writesearchfile = NULL;	file_position_t cp=cursorpos;	file_position_t ocp=cursorpos;	file_position_t t = 0;	int i=0;	int j=0;	int k=sizeof(buffer);	kmpPreprocesshex();	if (writesearch==1) 	{		writesearchfile=fopen(writesearchfilename,"w");		fprintf(writesearchfile,"#DHEXSEARCHFILE\n#VERSION 0\n");		cp=0;		ocp=0;	}	fseek(inputfile,cp,0);	while (cp<filesize)	{		if (k==sizeof(buffer)) 		{			if (!feof(inputfile)) fread(buffer,sizeof(buffer),1,inputfile);			for (i=0;i<chnum;i++)			{				if (chpos[i]>=ocp && chpos[i]<=ocp+sizeof(buffer))				{					buffer[chpos[i]-ocp]=change[i];				}			}			ocp=cp;			k=0;		}		while (j>=0 && buffer[k]!=searchstring2[j]) j=kmp[j];		k++; j++; cp++;		if ((unsigned int) j == searchstring2len && t!=ocp+k-j)		  		{			//GEFUNDEN			t=ocp+k-j;			if (writesearch==1) {			  fprintf( writesearchfile,"%04X%04X%04X%04X\n", 				       ((int)((t>>48)&65535)),					   ((int)((t>>32)&65535)),					   ((int)((t>>16)&65535)),					   ((int)(t&65535)));			} else {				return t;			}			j=kmp[j];		}	}	if (writesearch==1) fclose(writesearchfile);	return cursorpos;}file_position_t searchbackwardhex(file_position_t cursorpos,file_position_t filesize,int hexnotasc){  /* remove me */ filesize = 0;  /* remove me */ hexnotasc = 0;	kmpPreprocesshexback();		return cursorpos;}file_position_t searchbackwardhex2(file_position_t cursorpos,file_position_t filesize){  /* remove me */ filesize = 0;	return cursorpos;}file_position_t searchforwardhex2(file_position_t cursorpos){	file_position_t cp;	file_position_t ocp = cursorpos;	unsigned char buffer[256];	unsigned char p[524288];	FILE *writesearchfile = NULL;	unsigned int i;	int mismatch;	if (obenanfangen==1 || writesearch==1 || cursorpos==0) readsearchfile=fopen(readsearchfilename,"r");	obenanfangen=0;		if (writesearch==1) 	{		writesearchfile=fopen(writesearchfilename,"w");		fprintf(writesearchfile,"#DHEXSEARCHFILE\n#VERSION 0\n");	}		while (!feof(readsearchfile))	{		fgets(p,sizeof(p),readsearchfile);		if (p[0]!='#')		{			cp=stohex(p);			fseek(inputfile,cp,SEEK_SET);			fread(buffer,sizeof(buffer),1,inputfile);			mismatch=0;			for (i=0;mismatch==0 && i<searchstring2len;i++) if (buffer[i]!=searchstring2[i]) mismatch=1;			if (mismatch==0 && cp!=ocp)			{				ocp=cp;				if (writesearch==1) fprintf(writesearchfile,"%04X%04X%04X%04X\n",((int)((cp>>48)&65535)),((int)((cp>>32)&65535)),((int)((cp>>16)&65535)),((int)(cp&65535))); 				else return cp;			}		}	}	if (writesearch==1) fclose(writesearchfile);	if (feof(readsearchfile)) 	{		fclose(readsearchfile);			obenanfangen=1;	}	return cursorpos;	}int searchfor(WINDOW* parent_window,int hexnotasc){	int wtop;	int wbot;	int wleft;	int wright;	int ch;	char* s;	int m;	unsigned int i;	int cursor;	unsigned int offset;	int doit=0;	wtop=LINES/2-6;	wbot=wtop+12;	wleft=COLS/2-16;	wright=wleft+33;	m=0;	new_menu(1);	if(hexnotasc==1)	menu_item(0,wtop+1,wleft+1,"%%Searchstring (Hex)",'s','S',0);	else menu_item(0,wtop+1,wleft+1,"%%Searchstring (Asc)",'s','S',0);	menu_item(1,wtop+4,wleft+1,"Search %Forward",'f','F',0);	menu_item(2,wtop+5,wleft+1,"Search %Backwards",'b','B',0);	menu_item(3,wtop+6,wleft+5,"%Write Result to file",'w','W',0);	menu_item(4,wtop+7,wleft+1," ",0,0,0);	menu_item(5,wtop+8,wleft+5,"%Read Searchpos. from file",'r','R',0);	menu_item(6,wtop+9,wleft+1," ",0,0,0);	menu_item(7,wtop+11,wleft+1,"%%Cancel",0,0,0);	if (LINES>10 && COLS>32)	{		draw_frame(parent_window,wtop,wleft,wbot,wright,' ');		if (hexnotasc==1) headline(parent_window,wtop,wleft,"SEARCH HEXSTRING"); else headline(parent_window,wtop,wleft,"SEARCH ASCIISTRING");		while (m!=1 && m!=2 && m!=7)		{			wattrset(parent_window,attrs[COLOR_BRACKETS]);			mvwprintw(parent_window,wtop+2,wleft+1,"[                              ]"); 			mvwprintw(parent_window,wtop+7,wleft+2,"[                             ]"); 			mvwprintw(parent_window,wtop+9,wleft+2,"[                             ]"); 			mvwprintw(parent_window,wtop+6,wleft+1,"( )");			mvwprintw(parent_window,wtop+8,wleft+1,"( )");			wattrset(parent_window,attrs[COLOR_TEXT]);			if (hexnotasc==1) 			{				printsearchstring3(parent_window,wtop+2,wleft+2,0);			} else			if (strlen(searchstring)<=30) 			{				mvwprintw(parent_window,wtop+2,wleft+2,"%s",searchstring);			} else {				for (i=0;i<30;i++)				{					mvwprintw(parent_window,wtop+2,wright-2-i,"%c",searchstring[strlen(searchstring)-1-i]);				}			}				if (writesearch==1) mvwprintw(parent_window,wtop+6,wleft+2,"X"); 			else {				wattrset(parent_window,attrs[COLOR_BRACKETS]);				mvwprintw(parent_window,wtop+6,wleft+2," ");			}						if (strlen(writesearchfilename)<=29) 			{				mvwprintw(parent_window,wtop+7,wleft+3,"%s",writesearchfilename);			} else {				for (i=0;i<29;i++)				{					mvwprintw(parent_window,wtop+7,wright-2-i,"%c",writesearchfilename[strlen(writesearchfilename)-1-i]);				}			}				wattrset(parent_window,attrs[COLOR_TEXT]);			if (readsearch==1) mvwprintw(parent_window,wtop+8,wleft+2,"X"); 			else {				wattrset(parent_window,attrs[COLOR_BRACKETS]);				mvwprintw(parent_window,wtop+8,wleft+2," ");			}			if (strlen(readsearchfilename)<=29) 			{				mvwprintw(parent_window,wtop+9,wleft+3,"%s",readsearchfilename);			} else {				for (i=0;i<29;i++)				{					mvwprintw(parent_window,wtop+9,wright-2-i,"%c",readsearchfilename[strlen(readsearchfilename)-1-i]);				}			}			m=menu_show(parent_window);			if (m==7 || m==1 || m==2) 			{				wattrset(parent_window,attrs[COLOR_HEXFIELD]);				erase_frame(parent_window,wtop,wleft,wbot,wright,' ');				if (hexnotasc==1 && searchstring2len>0) 				{					for (i=searchstring3len-1;i>0;i--)					{						if (searchstring3[i]>=768) {							searchstring3len--; 						} else i=0;					}				}			}			if (m==7) return 0;			if (m==0) 			{				if (hexnotasc==1) 				{					cursor=0;					offset=0;					wattrset(parent_window,attrs[COLOR_CURSOR]);					ch=0;					while (ch!=13)					{						printsearchstring3(parent_window,wtop+2,wleft+2,offset);						wmove(parent_window,wtop+2,wleft+2+cursor);							ch=0;						while ((ch!=8) && (ch!=KEY_BACKSPACE) &&  (ch!='.') && (ch!=13) && (ch!=KEY_RIGHT) && (ch!=KEY_LEFT) && ((ch<'0') || (ch>'9')) && ((ch<'A') || (ch>'F'))  && ((ch<'a') || (ch>'f'))) 						ch=getch2();						if (ch=='.') ch=0; // TODO: how do i handle wildcards with kmp?						if ((ch==8) || (ch==KEY_BACKSPACE))						{							if (cursor/3+offset>0) 							{								for (i=(cursor/3+offset);i<searchstring3len;i++)								{									searchstring3[i]=searchstring3[i+1];								}								cursor=cursor-2;									searchstring3len--;								ch=KEY_LEFT;							}																				}						if (((ch>='0') && (ch<='9')) || ((ch>='a') && (ch<='f')) || ((ch>='A') && (ch<='F')))						{							if ((ch>='0') && (ch<='9')) ch=ch-48;							if ((ch>='A') && (ch<='F')) ch=ch-55;							if ((ch>='a') && (ch<='f')) ch=ch-87;							i=cursor/3+offset;							if ((cursor%3)==0) 							{								searchstring3[i]=(searchstring3[i]&527)+(ch<<4);								if ((unsigned int) (cursor/3+offset)==searchstring3len)								{									searchstring3[i]=searchstring3[i]&240;									searchstring3len++;								}							}							if ((cursor%3)==1) searchstring3[i]=(searchstring3[i]&496)+ch;							ch=KEY_RIGHT;						}						if (ch=='.') 						{							i=cursor/3+offset;							if ((cursor%3)==0) 							{								if ((searchstring3[i]&256)!=256) searchstring3[i]=searchstring3[i]|256;								if ((unsigned int) (cursor/3+offset)==searchstring3len)								{									searchstring3[i]=768;									searchstring3len++;								}							}							if ((cursor%3)==1) if ((searchstring3[i]&512)!=512) searchstring3[i]=searchstring3[i]|512;							ch=KEY_RIGHT;						}						if ((ch==KEY_RIGHT) && ((((unsigned int)cursor/3+offset) <searchstring3len))) {						  cursor++;						  if ((cursor%3)==2) cursor++;						}						if ((ch==KEY_LEFT)) {							cursor--;							if ((cursor%3)==2) cursor--;						}						if (cursor>=30) 						{							cursor=27;							offset=offset+1;							if ( offset >= searchstring3len-9) {							  if (searchstring3len>9) {								offset=searchstring3len-9; 							  } else {								offset=0;							  }							}						}						if (cursor<0) 						{							cursor=0;							if (offset) {								offset--;							}						}					}									} else {					s=malloc(strlen(searchstring)+1);					strncpy(s,searchstring,strlen(searchstring)+1);

⌨️ 快捷键说明

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