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); }
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); } }
//создание отладочного файла 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; } }
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; }
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; }
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); } }