***第一个递归问题解决了,原因是如果加载过的dll再修复一边会重复包含然后卡死循环,不过后来有大佬告诉我LoadLibrary或自动加载所需要的DLL,所以竹篮打水一场空,不过我还是会修改代码的,给大家演示一下这种情况,说不定未来哪天能用上
但是就算解决了也无法运行图形界面的程序,比如飞鸽运行出来没有图标,界面只有一个后台进程,PEtool跑不了
后来都要学完内核了,才想起来了,这个软件跑不起来才是正常的,傀儡进程能跑起来图形界面,是因为创建了一个新的进程并且有自己的界面,控制台程序已经占有了这个线程
第一个跳转这个没写好,只有能加载控制台程序,我猜是导入表dll依赖其他dll,那么就需要递归,但我怎么也写不出来,那个递归莫名其妙的有个死循环,一直重复包含
后面贴了IAT修复函数,里面有写一个坑,修复IAT的时候注意对着INT修改成IAT,因为后面那个程序的IAT是已经被修过的了,没有储存数据
VOID ProcessJmp(PBYTE pFileName) {
//读入数据,初始化各项需要的数据
PBYTE pFileBuffer = 0;
PBYTE pImageBuffer = 0;
DWORD dwFileSize = FileToFileBuffer(pFileName, &pFileBuffer);
DWORD dwImageSize = FileBufferToImageBuffer(pFileBuffer, &pImageBuffer, dwFileSize);
free(pFileBuffer);
PIMAGE_DOS_HEADER pDosHeader = pImageBuffer;
PIMAGE_NT_HEADERS pNTHeader = (DWORD)pImageBuffer + pDosHeader->e_lfanew;
if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) {
printf("File is not PE\n");
free(pImageBuffer);
return FALSE;
}
PIMAGE_FILE_HEADER pFileHeader = (DWORD)pNTHeader + sizeof(pNTHeader->Signature);
PIMAGE_OPTIONAL_HEADER pOptionalHeader = (DWORD)pFileHeader + sizeof(IMAGE_FILE_HEADER);
PIMAGE_SECTION_HEADER pSectionHeader = (DWORD)pOptionalHeader + pFileHeader->SizeOfOptionalHeader;
PBYTE oep = pOptionalHeader->ImageBase + pOptionalHeader->AddressOfEntryPoint;
//在自身内存Process.ImageBase处申请Process.ImageSize大小的内存
HANDLE hCurProcess = GetCurrentProcess();
PVOID pImageBase = VirtualAllocEx(hCurProcess, pOptionalHeader->ImageBase, pOptionalHeader->SizeOfImage,
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (!pImageBase) {
printf("VirtualAllocEx1\n");
return;
}
//修IAT
FixIATTable(&pImageBuffer);
//写入pImageBase处
if (!WriteProcessMemory(hCurProcess, pImageBase, pImageBuffer, dwImageSize,