コード例 #1
0
ファイル: OUTPE.CPP プロジェクト: FrankStain/c--sphinx
void CreatWinStub()
{
	if(!usestub){
		sizestub=SIZESTUB2;
		hout=CreateOutPut(outext,"wb");
		if(fwrite(stub2,SIZESTUB2,1,hout)!=1){
			ErrWrite();
			return;
		}
	}
	else CreatStub(winstub);
//подсчитать число секций
	if(wbss){
		if(postsize)numrs++;
		else wbss=FALSE;
	}
	if(WinMonoBlock==FALSE){	//если не единый блок
		if(numapi)numrs++;	//есть вызовы api-процедур
		if(numexport)numrs++;	//создать секцию импорта
		if((FixUpTable==TRUE&&posts)/*||numexport!=0*/)numrs++;	//создать секцию перемещения
		if(numres)numrs++;	//ресурсы
	}
	else if(dllflag&&FixUpTable==TRUE&&posts!=0)numrs++;	//создать секцию перемещения
//размер загрузочного образа
	vsizeheader=Align(numrs*sizeof(OBJECT_ENTRY)+sizeof(PE_HEADER)+sizestub,0x1000);
}
コード例 #2
0
ファイル: DEBUG.CPP プロジェクト: EmilHalim/c--sphinx
void GeneratLst()
{
unsigned int j;
unsigned long startip;
unsigned int offs2,line;
unsigned char flag;
	hout=CreateOutPut("lst","wt");
	if(lstend[pdbg-1]==0)lstend[pdbg-1]=endinptr;
	startip=(comfile!=file_w32&&comfile!=file_bin?0:ImageBase);
	fprintf(hout,"SPHINX/SHEKER C-- One Pass Disassembler. Version %d.%02d%s %s\n",ver1,ver2,betta,__DATE__);
	for(j=0;j<pdbg;j++){
//printf("line %d loc %X\n",dbgnum[j],dbgloc[j]);
		if((int)lstflag[j]!=-1){
			flag=lstflag[j];
			offs2=lstend[j];
			outptr=dbgloc[j];
			instruction_offset=outptr+startip;
			seg_size=(unsigned char)(16+16*(flag&1));
			line=dbgnum[j];
			if(offs2!=outptr){
/*
				if(line!=0)printf("%s %u:",(startfileinfo+dbgmod[j])->filename,line);
				if(lststring[j]!=NULL)printf(" %s\n",lststring[j]);
				else if(line!=0)printf("\n");
	*/
				fprintf(hout,"\n");
				if(line!=0)fprintf(hout,"%s %u:",(startfileinfo+dbgmod[j])->filename,line);
				if(lststring[j]!=NULL)fprintf(hout," %s\n",lststring[j]);
				else if(line!=0)fprintf(hout,"\n");
  			while(outptr<offs2){
					if(flag&0x1e)undata(instruction_offset,offs2-dbgloc[j],(flag>>1)&15);
	  		  else unassemble(instruction_offset);
				}
			}
コード例 #3
0
ファイル: DEBUG.CPP プロジェクト: EmilHalim/c--sphinx
//создание отладочного файла
void DoTDS()
{
int retcode;
unsigned int i,j;
//создать файл
	if(lstflag)GeneratLst();
	if(dbg&1){
//убрать из списка файлов не используемые
		for(i=0;i<totalmodule;i++){
			if((startfileinfo+i)->numdline==0){
				totalmodule--;
				if(totalmodule!=i){
					memcpy(&(startfileinfo+i)->filename,
						&(startfileinfo+totalmodule)->filename,sizeof(FILEINFO));
//корректировка таблиц строк
					for(j=0;j<pdbg;j++){
						if(dbgmod[j]==(unsigned short)totalmodule)dbgmod[j]=(unsigned short)i;
					}
					i--;
				}
			}
		}
//создать таблицу корреляций
		corinfo=(struct _COR_INFO_ *)MALLOC(sizeof(_COR_INFO_));
		corinfo->ofs=dbgloc[0];
		corinfo->startline=0;
		omodule=corinfo->file=dbgmod[0];
		numcorrel=0;
		for(j=1;j<pdbg;j++){
			if((unsigned short)omodule!=dbgmod[j]){
				(corinfo+numcorrel)->count=(unsigned short)(j-(corinfo+numcorrel)->startline);
				(corinfo+numcorrel)->end=dbgloc[j]-1;
				numcorrel++;
				corinfo=(struct _COR_INFO_ *)REALLOC(corinfo,sizeof(_COR_INFO_)*(numcorrel+1));
				(corinfo+numcorrel)->ofs=dbgloc[j];
				(corinfo+numcorrel)->startline=j;
				omodule=(corinfo+numcorrel)->file=dbgmod[j];
			}
		}
		(corinfo+numcorrel)->count=(unsigned short)(pdbg-(corinfo+numcorrel)->startline);
		(corinfo+numcorrel)->end=dbgloc[j-1]+1;
		numcorrel++;
		hout=CreateOutPut("tds","wb");
		if(am32)retcode=CreateW32Debug();
		else retcode=CreateDosDebug();
		if(retcode==0&&fwrite(output,outptr,1,hout)!=1)retcode=-1;
		if(retcode!=0)ErrWrite();
		fclose(hout);
		hout=NULL;
	}
}
コード例 #4
0
ファイル: MainFrm.cpp プロジェクト: layerfsd/PersonalIBA
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CBCGPFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	OnAppLook(m_nAppLook);

	EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);

	if (!CreateCommonBar())
	{
		return -1;
	}

	EnableDocking(CBRS_ALIGN_LEFT);

	if (!CreateTaskPane())
	{
		return -1;
	}

	if (!CreateOutPut())
	{
		return -1;
	}

	EnableAutoHideBars(CBRS_ALIGN_LEFT);

	if (!RegisterHotKey(m_hWnd, 1, MOD_CONTROL, 'Q'))
	{
		MessageBox(_T("注册热键Ctrl+Atl+Q失败"), _T("错误"),MB_OK|MB_ICONWARNING);
	}
	
#ifdef DEBUG
	SetTimer(1006, 60000, NULL);
#else
	SetTimer(1006, 3600*1000, NULL);
#endif
	OnCreateEnd();
	return 0;
}
コード例 #5
0
ファイル: outpe.cpp プロジェクト: justdanpo/c--sphinx
int MakeCoff()
{
	COFF_HEADER chead;
	unsigned long sizehead, curobj, resnum, numresrel, segres, lastoffset, headernum;
	OBJECT_ENTRY* objentry;
	int i;
	LISTRELOC* resrel = NULL;
	char* codesecname;
	hout = CreateOutPut("obj", "wb");
	chead.cpu = 0x14c;
	chead.SizeOfOptionalHeader = 0;
	chead.date_time = 0;
	chead.Characteristics = 0x100;
	/*if(header)*/numrs = 2;

	//подсчитать число секций
	if (wbss)
	{
		if (postsize)
		{
			numrs++;
		}
		else
		{
			wbss = FALSE;
		}
	}

	if (numres)
	{
		numrs++;    //ресурсы
	}

	chead.numobj = numrs;
	sizehead = numrs * sizeof(OBJECT_ENTRY);
	objentry = (OBJECT_ENTRY*)MALLOC(sizehead); //тавлица объектов
	memset(objentry, 0, sizehead); //очистить таблицу объектов
	curobj = 0;
	lastoffset = sizehead + sizeof(COFF_HEADER);
	//	if(header){
	strcpy((objentry + curobj)->name, ".version");
	sprintf(&stub[STRVERS], "%s%s", compilerstr, __DATE__);
	(objentry + curobj)->psize = strlen(&stub[STRVERS]) + 1;
	(objentry + curobj)->pOffset = lastoffset;
	(objentry + curobj)->flags = 0x100A00;
	headernum = curobj;
	lastoffset += (objentry + curobj)->psize;
	curobj++;
	//	}
	codesecname = ".text";

	if (splitdata == FALSE)
	{
		codesecname = ".codedat";
	}

	strcpy((objentry + curobj)->name, codesecname);
	(objentry + curobj)->psize = outptr;
	(objentry + curobj)->pOffset = lastoffset;
	(objentry + curobj)->flags = 0xE0300060;
	lastoffset += outptr;
	textnum = curobj;
	curobj++;

	if (wbss)
	{
		strcpy((objentry + curobj)->name, ".bss");
		(objentry + curobj)->psize = postsize;
		(objentry + curobj)->flags = 0xC0300080;
		bssnum = curobj;
		curobj++;
	}

	if (numres)
	{
		strcpy((objentry + curobj)->name, ".rsrc$01");
		numresrel = (objentry + curobj)->NumberOfRelocations = MakeRes(0, &resrel);
		(objentry + curobj)->psize = curposbuf;
		(objentry + curobj)->flags = 0x40000040;
		resnum = curobj;
	}

	sizelistName = 0;
	numsymbol = 0;
	ListName = (char*)MALLOC(MAXLISTNAME);
	isymbol = (IMAGE_SYMBOL*)MALLOC(MAXSIZESYMBOL);
	memset(isymbol, 0, MAXSIZESYMBOL);	//очистить ее
	maxsizelistname = MAXLISTNAME;
	maxnumnameid = maxnumsymbol = MAXNUMSYMBOL;
	NameId = (NAMEID*)MALLOC(MAXSIZENAMEID);
	treloc = (IMAGE_RELOCATION*)MALLOC(sizeof(IMAGE_RELOCATION) * MAXNUMRELOC);
	maxnumreloc = MAXNUMRELOC;
	numreloc = 0;
	strcpy(isymbol->N.sname, "@comp.id");
	isymbol->Value = 0x141F8E;
	isymbol->SectionNumber = -1;
	isymbol->StorageClass = 3;
	strcpy((isymbol + 1)->N.sname, ".file");
	(isymbol + 1)->Value = 1;
	(isymbol + 1)->SectionNumber = -2;
	(isymbol + 1)->StorageClass = 0x67;
	i = (strlen(startfileinfo->filename) - 1) / sizeof(IMAGE_SYMBOL) + 1;
	(isymbol + 1)->NumberOfAuxSymbols = i;
	strcpy((isymbol + 2)->N.sname, startfileinfo->filename);
	numsymbol = i + 2;
	segtext = numsymbol;
	strcpy((isymbol + numsymbol)->N.sname, codesecname);
	(isymbol + numsymbol)->SectionNumber = textnum + 1;
	(isymbol + numsymbol)->StorageClass = 3;
	(isymbol + numsymbol)->NumberOfAuxSymbols = 1;
	numsymbol++;
	(isymbol + numsymbol)->N.Name.Short = outptr;
	numsymbol++;

	if (wbss)
	{
		segbss = numsymbol;
		strcpy((isymbol + numsymbol)->N.sname, ".bss");
		(isymbol + numsymbol)->SectionNumber = bssnum + 1;
		(isymbol + numsymbol)->StorageClass = 3;
		(isymbol + numsymbol)->NumberOfAuxSymbols = 1;
		numsymbol++;
		(isymbol + numsymbol)->N.Name.Short = postsize;
		numsymbol++;
		strcpy((isymbol + numsymbol)->N.sname, "DGROUP");
		(isymbol + numsymbol)->SectionNumber = bssnum + 1;
		(isymbol + numsymbol)->StorageClass = 3;
	}

	strcpy((isymbol + numsymbol)->N.sname, "FLAT");
	(isymbol + numsymbol)->SectionNumber = -1;
	(isymbol + numsymbol)->StorageClass = 3;
	numsymbol++;

	if (numres)
	{
		segres = numsymbol;
		strcpy((isymbol + numsymbol)->N.sname, ".rsrc$01");
		(isymbol + numsymbol)->StorageClass = 3;
		(isymbol + numsymbol)->SectionNumber = resnum + 1;
		numsymbol++;
	}

	//	if(header){
	strcpy((isymbol + numsymbol)->N.sname, ".version");
	(isymbol + numsymbol)->SectionNumber = headernum + 1;
	(isymbol + numsymbol)->StorageClass = 3;
	numsymbol++;
	//	}
	CreatSymbolTable(treestart);
	CreatRelocTable();
	(isymbol + segtext + 1)->N.Name.Long = numreloc;
	(objentry + textnum)->NumberOfRelocations = numreloc;

	if (numreloc)
	{
		(objentry + textnum)->PointerToRelocations = lastoffset;
		lastoffset += sizeof(IMAGE_RELOCATION) * numreloc;
	}

	if (numres)
	{
		(objentry + resnum)->pOffset = lastoffset;
		lastoffset += curposbuf;

		if (numresrel)
		{
			(objentry + resnum)->PointerToRelocations = lastoffset;
			lastoffset += sizeof(IMAGE_RELOCATION) * numresrel;
		}
	}

	chead.COFFsize = numsymbol;

	if (numsymbol)
	{
		chead.pCOFF = lastoffset;
	}

	if (fwrite(&chead, sizeof(COFF_HEADER), 1, hout) != 1)
	{
errwrite:
		ErrWrite();
		free(objentry);

		if (resrel)
		{
			free(resrel);
		}

		FreeCoffBuf();
		return (-1);
	}

	if (fwrite(objentry, sizehead, 1, hout) != 1)
	{
		goto errwrite;
	}

	//	if(header){
	if (fwrite(&stub[STRVERS], (objentry + headernum)->psize, 1, hout) != 1)
	{
		goto errwrite;
	}

	//	}
	if (fwrite(output, outptr, 1, hout) != 1)
	{
		goto errwrite;    //блок кода
	}

	if (numreloc)
	{
		if (fwrite(treloc, numreloc * sizeof(IMAGE_RELOCATION), 1, hout) != 1)
		{
			goto errwrite;
		}
	}

	if (numres)
	{
		if (fwrite(resbuf, curposbuf, 1, hout) != 1)
		{
			goto errwrite;
		}

		free(resbuf);

		if (numresrel)
		{
			IMAGE_RELOCATION* rrel;
			rrel = (IMAGE_RELOCATION*)MALLOC(sizeof(IMAGE_RELOCATION) * numresrel);

			for (i = 0; i < numresrel; i++)
			{
				(rrel + i)->VirtualAddress = (resrel + i)->val;
				(rrel + i)->Type = IMAGE_REL_I386_DIR32NB;
				(rrel + i)->SymbolTableIndex = segres;
			}

			if (fwrite(rrel, sizeof(IMAGE_RELOCATION)*numresrel, 1, hout) != 1)
			{
				goto errwrite;
			}

			free(rrel);
		}
	}

	if (numsymbol)
	{
		if (fwrite(isymbol, numsymbol * sizeof(IMAGE_SYMBOL), 1, hout) != 1)
		{
			goto errwrite;
		}

		if (sizelistName)
		{
			sizelistName += 4;

			if (fwrite(&sizelistName, 4, 1, hout) != 1)
			{
				goto errwrite;
			}

			if (fwrite(ListName, sizelistName - 4, 1, hout) != 1)
			{
				goto errwrite;
			}
		}
		else
		{
			if (fwrite(&sizelistName, 4, 1, hout) != 1)
			{
				goto errwrite;
			}

			sizelistName += 4;
		}
	}

	runfilesize = lastoffset + sizelistName;
	free(objentry);

	if (resrel)
	{
		free(resrel);
	}

	FreeCoffBuf();
	return 0;
}
コード例 #6
0
ファイル: outpe.cpp プロジェクト: justdanpo/c--sphinx
void CreatStub(char* name)
{
	sizestub = SIZESTUB;
	hout = CreateOutPut(outext, "wb");
	sprintf(&stub[STRVERS], "%s%s", compilerstr, __DATE__);

	if (name == NULL)
	{
stdstub:

		if (fwrite(stub, SIZESTUB, 1, hout) != 1)
		{
errwrite:
			ErrWrite();
			return;
		}
	}
	else
	{
		EXE_DOS_HEADER exeheader;  // header for EXE format
		FILE* stubin;

		if ((stubin = fopen(name, "rb")) == NULL)
		{
			ErrOpenFile(name);
			goto stdstub;
		}

		if (fread(&exeheader, sizeof(EXE_DOS_HEADER), 1, stubin) != 1)
		{
errread:
			ErrReadStub();
			fclose(stubin);
			goto stdstub;
		}

		if (exeheader.sign != 0x5A4D)
		{
errstub:
			fprintf(stderr, "File %s can not be stub file.\n", name);
			fclose(stubin);
			goto stdstub;
		}

		fseek(stubin, 0, SEEK_END);
		sizestub = ftell(stubin);
		unsigned long temp;

		if (exeheader.ofsreloc >= 0x40) 	//проверка что это не 32-битный файл
		{
			fseek(stubin, 0x3c, SEEK_SET);

			if (fread(&temp, 4, 1, stubin) != 1)
			{
				goto errread;
			}

			if (temp < sizestub)
			{
				fseek(stubin, temp, SEEK_SET);

				if (fread(&temp, 4, 1, stubin) != 1)
				{
					goto errread;
				}

				switch (temp)
				{

				case 'P'+('E'<<8):
				case 'N'+('E'<<8):
				case 'L'+('E'<<8):
				case 'L'+('X'<<8):
					goto errstub;
				}
			}

			exeheader.ofsreloc += (unsigned short)0x20;
		}
		else
		{
			exeheader.ofsreloc = 0x40;
		}

		//размер файла
		sizestub = Align(sizestub + 32, 8);
		fseek(stubin, 0x20, SEEK_SET);
		exeheader.headsize += (unsigned short)2;

		if (fwrite(&exeheader, sizeof(EXE_DOS_HEADER), 1, hout) != 1)
		{
			goto errwrite;
		}

		*(unsigned long*)&stub[STRVERS + 28] = sizestub;

		if (fwrite(&stub[STRVERS], 32, 1, hout) != 1)
		{
			goto errwrite;
		}

		CopyFile(stubin, hout);
		ChSize(sizestub);
	}
}