亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? trace.c

?? a sample debugger in Linux
?? C
字號:
/** * file:trace.c * author:XXX * date:2/3/08 * * note: Although we define a subfunction named "getMainEntryPoint", actually, the address *       it gets is not the main() function entry point, but some virtul address prior to  *       main() function. Futhermore, there are still some bugs to be fixed. However, my free *       is so limited, yet, I really want some reader to fix bugs for me. And you are quarl- *       -ified to modify any lines of code below. If you do, please send email to notify me. *       My email address is zhucj041070075@gmail.com, I'm looking forward to your letters. */#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<signal.h>#include<elf.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>#include<sys/ptrace.h>#include<asm/user.h>#define INPUTLINE 64void usage();void command();void ptraceErrCheck(int res, enum __ptrace_request req);int getUserRegs(pid_t pid, struct user_regs_struct * regs, int verbose);void setUserRegs(pid_t pid, struct user_regs_struct * regs);char ** CreateExecArgv(int argc, char ** argv);void FreeExecArgv(int argc, char ** argv);void calAddress(char * comm, unsigned long * bpAddr);int getMainEntryPoint(FILE * Elf_fp, unsigned long * bpAddr);int main(int argc, char ** argv){	if(argc < 2) {		usage();		return 0;	}	FILE * fp;	int stat_loc; long res; char comm[INPUTLINE];	pid_t pid;	long oldInstruct, newInstruct;	int IsInterrupted = 0; unsigned long bpAddr;//main entrypoint	struct user_regs_struct regs;	memset(&regs, 0, sizeof(struct user_regs_struct));	if((fp = fopen(argv[1], "r")) < 0) {		fprintf(stderr, "File not exist!\n");		return -1;	}	else {		int ret = getMainEntryPoint(fp, &bpAddr);//get Main EntryPoint		switch(ret) {			case 0:				fclose(fp);				break;			case -1://file read error				fprintf(stdout, "file read error!\n");				fclose(fp);				return -1;			case -2://data format error				fprintf(stdout, "data format error!\n");				fclose(fp);				return -1;		}	}	char ** ExecArgv = CreateExecArgv(argc, argv);	if(!ExecArgv) {		fprintf(stderr, "Failed to allocate memowy!\n");		return -1;	}TRACEHERE:	pid = fork();		if(pid < 0) {		fprintf(stderr, "Fork error!\n");		return -1;	}	else if( pid == 0) { //child		int ret = ptrace(PTRACE_TRACEME, 0, NULL, NULL);		ptraceErrCheck(ret, PTRACE_TRACEME);		execvp(ExecArgv[0] , ExecArgv);	}	else { //parent		res = waitpid(pid, &stat_loc, 0);				fprintf(stdout, "Begin to trace program %s!\n", ExecArgv[0]);		while(1) {			fprintf(stdout, "Command: ");			fgets(comm, INPUTLINE, stdin);			if(comm[0] == 'h') {//help				command();			}			else if(comm[0] == 'b') {//break				IsInterrupted = 1;								calAddress(comm, &bpAddr);				oldInstruct = ptrace(PTRACE_PEEKTEXT, pid, bpAddr, NULL);				ptraceErrCheck(oldInstruct, PTRACE_PEEKTEXT);				/**				 *here I'm not sure whether it's always successful to midify the				 *instructure code like this, maybe we will be signaled with SIGILL,				 *so this is a subtle bug.				 */				newInstruct = 0xcccccccc;				res = ptrace(PTRACE_POKETEXT, pid, bpAddr, newInstruct);				ptraceErrCheck(res, PTRACE_POKETEXT);				res = ptrace(PTRACE_CONT, pid, NULL, NULL);				ptraceErrCheck(res, PTRACE_CONT);				waitpid(pid, &stat_loc, 0);				if(WIFSTOPPED(stat_loc)) {					int signal = WSTOPSIG(stat_loc);					if(signal == SIGTRAP)						fprintf(stdout, "breakpoint at 0x%x \n", bpAddr);					else						fprintf(stdout, "Program %s interrupted by signal %d\n",							ExecArgv[0], signal);					getUserRegs(pid, &regs, 1);				}			}			else if(comm[0] == 'r') {//run				res = ptrace(PTRACE_CONT, pid, NULL, NULL);				ptraceErrCheck(res, PTRACE_CONT);				res = waitpid(pid, &stat_loc, 0);				fprintf(stdout, "Program %s exit with code %d\n",					ExecArgv[0], WEXITSTATUS(stat_loc));				goto TRACEHERE;			}			else if(comm[0] == 'c') {//continue				if(!IsInterrupted) {					fprintf(stdout, "program %s is not being running!\n", ExecArgv[0]);					continue;				}				IsInterrupted = 0;								res = getUserRegs(pid, &regs, 0);//Get the context of being ptraced process				/**				 *x86 instructioin CC(INT 3) cause a TRAP,then eip is increased to				 *point to the next instruction.So, here we must decrease eip to 				 *ensure it points to the trap-caused instruction.				 */				if(res) {					continue;				}				regs.eip--;				setUserRegs(pid, &regs);//set back context to the being ptraced process				res = ptrace(PTRACE_POKETEXT, pid, bpAddr, oldInstruct);				ptraceErrCheck(res, PTRACE_POKETEXT);				res = ptrace(PTRACE_CONT, pid, NULL, NULL);				ptraceErrCheck(res, PTRACE_CONT);				waitpid(pid, &stat_loc, 0);				if(WIFEXITED(stat_loc)) {					fprintf(stdout, "Program %s exit with code %d\n",						ExecArgv[0], WEXITSTATUS(stat_loc));				}				else if(WIFSTOPPED(stat_loc)) {					fprintf(stdout, "Program %s interrupted by signal %d\n",						ExecArgv[0], WSTOPSIG(stat_loc));				}				goto TRACEHERE;			}			else if(comm[0] == 'k') {//kill				res = ptrace(PTRACE_KILL, pid, NULL, NULL);				ptraceErrCheck(res, PTRACE_KILL);				fprintf(stdout, "program %s terminated!\n", ExecArgv[0]);				goto TRACEHERE;			}			else if(comm[0] == 'q') {//quit				res = ptrace(PTRACE_KILL, pid, NULL, NULL);				ptraceErrCheck(res, PTRACE_KILL);				fprintf(stdout, "Tracer quit!\n");				break;			}			else {				fprintf(stderr, "Unknown Command!\n");			}		}	}		FreeExecArgv(argc, ExecArgv);	return 0;}void usage(){	fprintf(stdout, " usage: trace [filename] [parameters]\n");}void command(){	fprintf(stdout, " command usage: b(break) *addr\n"			   "              : c(continue) \n"			   "              : r(run) \n"			   "              : h(help) \n"			   "              : k(kill) \n"			   "              : q(quit) \n");}void ptraceErrCheck(int res, enum __ptrace_request req){	if(res < 0 && errno != 0) {		perror("PTRACE error:");		switch(req) {			case PTRACE_KILL:				return;			default:				exit(-1);		}	}}int getUserRegs(pid_t pid, struct user_regs_struct * regs, int verbose){	long res = ptrace(PTRACE_GETREGS, pid, NULL, (void *)regs);	if(res < 0 && errno != 0) {		perror("PTRACE error:");		return -1;	}		if(verbose) {		fprintf(stdout, "registers infomation:\n");		fprintf(stdout, "	eax:	0x%x\n", regs->eax);		fprintf(stdout, "	ecx:	0x%x\n", regs->ecx);		fprintf(stdout, "	edx:	0x%x\n", regs->edx);		fprintf(stdout, "	ebx:	0x%x\n", regs->ebx);		fprintf(stdout, "	esp:	0x%x\n", regs->esp);		fprintf(stdout, "	ebp:	0x%x\n", regs->ebp);		fprintf(stdout, "	esi:	0x%x\n", regs->esi);		fprintf(stdout, "	edi:	0x%x\n", regs->edi);		fprintf(stdout, "	eip:	0x%x"		"<--Here eip points to the next instruction\n", regs->eip);		fprintf(stdout, "	eflags:	0x%x\n", regs->eflags);		fprintf(stdout, "	cs:	0x%x\n", regs->cs);		fprintf(stdout, "	ss:	0x%x\n", regs->ss);		fprintf(stdout, "	ds:	0x%x\n", regs->ds);		fprintf(stdout, "	es:	0x%x\n", regs->es);		fprintf(stdout, "	fs:	0x%x\n", regs->fs);		fprintf(stdout, "	gs:	0x%x\n", regs->gs);	}		return 0;}void setUserRegs(pid_t pid, struct user_regs_struct * regs){	long res = ptrace(PTRACE_SETREGS, pid, NULL, (void *)regs);	if(res < 0 && errno != 0) {		perror("PTRACE error:");		exit(-1);	}}void calAddress(char * comm, unsigned long * bpAddr){	//example:comm = b 0xffffffff	//we must strip all the prefix	//here we do not check the validity of Address	char * index = comm;	while(*index != '\0') {		if(!strncmp(index, "0x", 2)){			*bpAddr = (unsigned long)strtol(index + 2, NULL, 16);			printf("%x\n", *bpAddr);			return;		}		index++;	}}int getMainEntryPoint(FILE * Elf_fp, unsigned long * bpAddr){	Elf32_Ehdr elf_header;	if(fread(&elf_header, sizeof(Elf32_Ehdr), 1, Elf_fp) != 1)		return -1;//file read error	unsigned char * field = (unsigned char *)&elf_header.e_entry;		switch(elf_header.e_ident[EI_DATA]) {		case ELFDATA2LSB:			* bpAddr = ((unsigned long)(field[0]))				| (((unsigned long)(field[1])) << 8)				| (((unsigned long)(field[2])) << 16)				| (((unsigned long)(field[3])) << 24);			return 0;//success		case ELFDATA2MSB:			* bpAddr = ((unsigned long)(field[3]))				| (((unsigned long)(field[2])) << 8)				| (((unsigned long)(field[1])) << 16)				| (((unsigned long)(field[0])) << 24);			return 0;//success		default:			fprintf(stderr, "Unknown data format!\n");			return -2;//data format error	}}char ** CreateExecArgv(int argc, char ** argv){	char ** execArgv = (char **)malloc(sizeof(char *) * argc);	if(!execArgv) {		return NULL;	}	int i, size;char * index;	for(i = 1; i < argc; ++i) {		size = sizeof(argv[i]) + 1;		if(i == 1)			size += 2;		execArgv[i - 1] = (char *)malloc(sizeof(char) * size);		if(!execArgv[i - 1]) {			return NULL;		}		index = execArgv[i - 1];		if(i == 1) {			if(argv[i][0] != '/' && argv[i][0] != '.') {				strcpy(execArgv[i - 1], "./");				index = execArgv[i - 1] + 2;			}		}		strcpy(index, argv[i]);	}	execArgv[argc - 1] = (char *)0;		return execArgv;}void FreeExecArgv(int argc, char ** argv){	int i;	for(i = 0; i < argc; ++i) {		if(!argv[i])			free(argv[i]);	}	free(argv);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久99久久| 精品国产伦一区二区三区观看方式| 精品写真视频在线观看| 婷婷六月综合亚洲| 日韩精品一二三| 日本午夜一本久久久综合| 蜜桃免费网站一区二区三区| 麻豆视频观看网址久久| 精品一区二区三区蜜桃| 国产成a人亚洲精| 99久久婷婷国产精品综合| 91免费观看视频| 欧美日韩一区二区三区高清| 欧美精品成人一区二区三区四区| 亚洲免费资源在线播放| 亚洲制服丝袜av| 久久99精品国产| 国产91富婆露脸刺激对白| 99久久99久久综合| 欧美色综合网站| 久久老女人爱爱| 亚洲人被黑人高潮完整版| 亚洲国产一区二区三区| 国内精品嫩模私拍在线| 成人高清免费在线播放| 欧美影院一区二区| 亚洲精品在线免费观看视频| 中文字幕一区三区| 肉色丝袜一区二区| 成人精品小蝌蚪| 69堂精品视频| 国产欧美日韩不卡| 丝袜a∨在线一区二区三区不卡| 九色porny丨国产精品| 色综合久久久久| ww亚洲ww在线观看国产| 亚洲精选视频在线| 激情久久久久久久久久久久久久久久| 成人在线一区二区三区| 欧美一级黄色录像| 夜夜操天天操亚洲| 国产不卡视频在线播放| 欧美日韩高清一区二区三区| 久久在线观看免费| 92国产精品观看| 日韩精品一区二区三区视频播放 | 蜜桃视频在线观看一区| 91蜜桃传媒精品久久久一区二区| 欧美videofree性高清杂交| 一区二区欧美国产| 成人精品视频一区二区三区| 精品美女在线播放| 婷婷开心久久网| 色综合天天性综合| 国产欧美精品一区| 韩国v欧美v日本v亚洲v| 91精品国产高清一区二区三区蜜臀| 18成人在线视频| 成人精品国产一区二区4080| 精品久久五月天| 麻豆一区二区99久久久久| 欧美精品aⅴ在线视频| 亚洲免费在线视频一区 二区| 成人夜色视频网站在线观看| 欧美精品一区二区高清在线观看 | 久久久av毛片精品| 美日韩黄色大片| 日韩欧美国产综合在线一区二区三区| 一区二区三区欧美视频| 91高清视频在线| 亚洲精品视频在线观看免费| 成人91在线观看| 国产精品美日韩| 91日韩一区二区三区| 亚洲欧洲精品一区二区三区| 92精品国产成人观看免费| 亚洲另类在线视频| 欧美制服丝袜第一页| 一区二区三区小说| 欧美三区免费完整视频在线观看| 亚洲综合成人在线视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 免费人成网站在线观看欧美高清| 欧美日韩色一区| 石原莉奈一区二区三区在线观看| 91精品国产综合久久香蕉的特点| 日韩不卡一区二区| 亚洲精品一线二线三线| 国产中文一区二区三区| 国产精品理论在线观看| 日本久久电影网| 亚洲福利电影网| 日韩视频免费观看高清完整版在线观看 | 日日欢夜夜爽一区| 精品国产一区二区三区不卡| 风间由美性色一区二区三区| 亚洲黄色av一区| 欧美精选一区二区| 久久精品国产亚洲高清剧情介绍 | 亚洲桃色在线一区| 欧美久久久久久久久| 久久99久久99| 国产精品女同互慰在线看| 色综合中文字幕国产| 一区二区三区色| 精品久久久三级丝袜| 99精品一区二区| 视频精品一区二区| 中文无字幕一区二区三区| 在线免费观看日本一区| 久久成人麻豆午夜电影| 亚洲色图视频网| 欧美变态tickling挠脚心| 成人久久久精品乱码一区二区三区| 夜夜揉揉日日人人青青一国产精品| 日韩欧美国产三级| 91在线观看免费视频| 免费在线观看一区| 一区二区三区中文字幕精品精品| 精品免费日韩av| 欧美日韩一区三区四区| 9l国产精品久久久久麻豆| 精品一区二区三区影院在线午夜| **性色生活片久久毛片| 久久久久亚洲蜜桃| 欧美一区二区三区四区视频| 色国产精品一区在线观看| 国产成人av在线影院| 美女视频黄频大全不卡视频在线播放| 国产精品久久久久久久第一福利| 日韩美女主播在线视频一区二区三区 | 一区二区三区中文在线| 国产欧美1区2区3区| 精品免费日韩av| 日韩美女视频在线| 欧美日本免费一区二区三区| av高清久久久| 成a人片亚洲日本久久| 国产福利91精品| 国产精品一区三区| 韩国av一区二区| 久久机这里只有精品| 日韩一区精品视频| 天天做天天摸天天爽国产一区| 亚洲欧美在线视频| 中文字幕日韩av资源站| 中文字幕亚洲区| 亚洲人成小说网站色在线| 国产精品久久久久影院老司| 久久久久久久久久看片| 久久综合久久综合亚洲| 久久人人爽人人爽| 久久男人中文字幕资源站| ww久久中文字幕| 国产亚洲精品中文字幕| 国产三级三级三级精品8ⅰ区| 欧美va在线播放| 久久精品日韩一区二区三区| 久久精品欧美一区二区三区不卡| 精品国内片67194| 国产日韩精品一区| 国产精品传媒视频| 亚洲自拍另类综合| 午夜精品视频在线观看| 日本不卡一区二区三区| 久久av中文字幕片| www.一区二区| 欧美日韩久久不卡| 日韩一级二级三级| 欧美韩国日本一区| 樱桃视频在线观看一区| 麻豆精品一区二区| 日韩欧美三级在线| 国产亚洲欧美色| 亚洲欧洲综合另类| 秋霞成人午夜伦在线观看| 国模少妇一区二区三区| 不卡一区二区在线| 欧美三级日韩在线| 久久久久久亚洲综合影院红桃| 中文字幕一区二区三区四区不卡| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲成人高清在线| 国产精品一线二线三线精华| 成人激情电影免费在线观看| 欧美日韩在线播放三区| 久久综合久久鬼色中文字| 中文字幕人成不卡一区| 午夜精品国产更新| 国产黑丝在线一区二区三区| 色国产精品一区在线观看| 久久久久久久久久电影| 亚洲午夜私人影院| 国产.精品.日韩.另类.中文.在线.播放| 色综合久久九月婷婷色综合| 日韩一区二区三区高清免费看看 | 亚洲午夜免费福利视频| 国产成人免费xxxxxxxx| 欧美人与z0zoxxxx视频| 国产精品传媒在线|