int __addnewsection_to_pefile(const char*exefil,const char* dllnew,const char* code,int codelen,int flag_shellbefore)
{
HANDLE pMap,pfile;
char* pmemHandle;
LoadPEFile(exefil,&pmemHandle);
//pmemHandle=(char*)crt_mapf2(exefil,&pMap,&pfile,0);//如何如何得到用户的进程内存景象
//HANDLE hCurrent = 0;
IMAGE_DOS_HEADER *pi_dos_header;
IMAGE_NT_HEADERS *pi_nt_header;
IMAGE_DATA_DIRECTORY *pi_data_dir_import,*pIMAGE_DATA_DIRECTORYbase;
IMAGE_IMPORT_DESCRIPTOR *pi_import_des;
IMAGE_THUNK_DATA *pitdTHUNK_DATA, *pitdTHUNK_DATA2;
pi_dos_header = (IMAGE_DOS_HEADER *)pmemHandle;
pi_nt_header = (IMAGE_NT_HEADERS *)((DWORD)pmemHandle + pi_dos_header->e_lfanew);
/////////////////
SECTION_ALIG=pi_nt_header->OptionalHeader.SectionAlignment;
FILE_ALIG=pi_nt_header->OptionalHeader.FileAlignment;
int nSections=pi_nt_header->FileHeader.NumberOfSections;
int sectionsTable_offsetinfile=(char*)pi_nt_header+sizeof(IMAGE_NT_HEADERS)-pmemHandle;
pIMAGE_DATA_DIRECTORYbase=pi_nt_header->OptionalHeader.DataDirectory;
pi_data_dir_import = &pIMAGE_DATA_DIRECTORYbase[1];
char* pImport_data_offset_infile = pmemHandle+RVA2(pmemHandle,pi_data_dir_import->VirtualAddress);
INT numberofImportEntry=pi_data_dir_import->Size/sizeof(IMAGE_IMPORT_DESCRIPTOR);
numberofImportEntry--;
int newsectionoff_infile=sectionsTable_offsetinfile+nSections*sizeof(IMAGE_SECTION_HEADER);
IMAGE_SECTION_HEADER* pFirstSection=(IMAGE_SECTION_HEADER*)((char*)pi_nt_header+sizeof(IMAGE_NT_HEADERS));
IMAGE_SECTION_HEADER NewSection;
IMAGE_SECTION_HEADER SEChea;
IMAGE_SECTION_HEADER FirstSection;
char zer0;
zer0=0;
int dwfilesize;// = filesz(exefil);
//dwfilesize = filesz((char*)exefil);
SEChea= *((IMAGE_SECTION_HEADER*)(sectionsTable_offsetinfile+pmemHandle)+nSections-1);
FirstSection=*pFirstSection;
//InsertFileLoop(exefil,SEChea.PointerToRawData+SEChea.Misc.VirtualSize,&zer0,sizeof(zer0),aligSize(SEChea.SizeOfRawData,SECTION_ALIG));
////////////////////////////////////////////////////////////////////////////////////////////////////
//InsertFile(exefil,&zer0,sizeof(zer0),aligSize(SEChea.Misc.VirtualSize,SECTION_ALIG));
// dwfilesize+=aligSize(SEChea.Misc.VirtualSize,SECTION_ALIG);
///////////////////////////////////////////////////////////////////////////////////////////////////////
dwfilesize=filesz((char*)exefil);
int olddwFileSize=dwfilesize;
InsertFileEndLoop(exefil,&zer0,sizeof(zer0),aligSize(dwfilesize,FILE_ALIG));
InsertFileEndLoop(exefil,&zer0,sizeof(zer0),SECTION_ALIG);
ZeroMemory(&NewSection,sizeof(NewSection));
strcpy((char*)NewSection.Name,".llydd");
NewSection.VirtualAddress=SEChea.VirtualAddress+alig(SEChea.Misc.VirtualSize,SECTION_ALIG)+FILE_ALIG;
NewSection.PointerToRawData=filesz((char*)exefil)-SECTION_ALIG;//SEChea.PointerToRawData+SEChea.SizeOfRawData;//dwfilesize+sizeof(IMAGE_SECTION_HEADER);
NewSection.Misc.VirtualSize=(numberofImportEntry+2)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+strlen(dllnew)+1;
NewSection.SizeOfRawData=alig(NewSection.Misc.VirtualSize,SECTION_ALIG);
NewSection.Characteristics=0xc0000040;//0xE0000020;
// int nNewImageSize=NThea.OptionalHeader.SizeOfImage+alig(nShellLen,SECTION_ALIG);
// int nNewSizeofCode=NThea.OptionalHeader.SizeOfCode+alig(nShellLen,FILE_ALIG);
int i_str=0;
///////////////////////////////////////////////////////////////////////////////////////////////////////
if(newsectionoff_infile+2*sizeof(NewSection)>=FirstSection.PointerToRawData){
MessageBox(0,0,"litle for new section entry in sect table",0);
return -1;
}
WriteFileBuffer(exefil,newsectionoff_infile,(char*)&NewSection,sizeof(NewSection));
IMAGE_SECTION_HEADER SEzer0;
ZeroMemory(&SEzer0,0,sizeof(SEzer0));
WriteFileBuffer(exefil,newsectionoff_infile+sizeof(NewSection),(char*)&SEzer0,sizeof(SEzer0));
///////////////////////////////////////////////////////////////////////////////////////////////////////
//InsertFile(exefil,newsectionoff_infile,(char*)&NewSection,sizeof(NewSection));
IMAGE_IMPORT_DESCRIPTOR newImportDesc;
IMAGE_IMPORT_BY_NAME *pimport_name;
ZeroMemory(&newImportDesc,sizeof(newImportDesc));
// dwfilesize += sizeof(IMAGE_SECTION_HEADER);
newImportDesc.Name=NewSection.VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(numberofImportEntry+2);
newImportDesc.OriginalFirstThunk=newImportDesc.Name+64;
newImportDesc.FirstThunk=newImportDesc.OriginalFirstThunk+32;
///////////////////////////////////////////////////////////////////////////////////////////////////////
WriteFileBuffer(exefil,NewSection.PointerToRawData,pImport_data_offset_infile,numberofImportEntry*sizeof(IMAGE_IMPORT_DESCRIPTOR));
//dwfilesize += (numberofImportEntry+2)*sizeof(IMAGE_IMPORT_DESCRIPTOR);
//////////////////////////////////////////////////////////////////////////////////////////
WriteFileBuffer(exefil,NewSection.PointerToRawData+numberofImportEntry*sizeof(IMAGE_IMPORT_DESCRIPTOR),
(char*)&newImportDesc,sizeof(newImportDesc));
numberofImportEntry++;
ZeroMemory(&newImportDesc,sizeof(newImportDesc));
WriteFileBuffer(exefil,NewSection.PointerToRawData+numberofImportEntry*sizeof(IMAGE_IMPORT_DESCRIPTOR),
(char*)&newImportDesc,sizeof(newImportDesc));
//InsertFile(exefil,NewSection.PointerToRawData+numberofImportEntry*sizeof(IMAGE_IMPORT_DESCRIPTOR),(char*)&newImportDesc,sizeof(newImportDesc));
numberofImportEntry++;
WriteFileBuffer(exefil,NewSection.PointerToRawData+(numberofImportEntry)*sizeof(IMAGE_IMPORT_DESCRIPTOR),(char*)dllnew,strlen(dllnew)+1);
//dwfilesize +=aligSize((numberofImportEntry+2)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+strlen(dllnew)+1,SECTION_ALIG);
// pi_import_des = (IMAGE_IMPORT_DESCRIPTOR *)((DWORD)pmemHandle + rva2offset(pmemHandle,pi_data_dir_import->VirtualAddress));
// IMAGE_IMPORT_DESCRIPTOR* preimage_import_descriptor=pi_import_des;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SelfFileInt(exefil,(char*)&pi_data_dir_import->Size-pmemHandle,sizeof(IMAGE_IMPORT_DESCRIPTOR));
WriteFileInt(exefil,(char*)&(pi_data_dir_import->VirtualAddress)-pmemHandle,NewSection.VirtualAddress);
//WriteFileInt(exefil,(char*)&pi_data_dir_import->Size-pmemHandle,desi+1);
SelfFileInt(exefil,(char*)&pi_nt_header->OptionalHeader.SizeOfImage-pmemHandle,SECTION_ALIG+aligSize(olddwFileSize,0x1000));
SelfFileInt(exefil,(char*)&pi_nt_header->FileHeader.NumberOfSections-pmemHandle,1);
WriteFileInt(exefil,(char*)&pi_nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress-pmemHandle,0);
WriteFileInt(exefil,(char*)&pi_nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size-pmemHandle,0);
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法