依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 381|回复: 0

PE输入表DLL注入

[复制链接] 主动推送

5762

主题

5814

帖子

7271

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7271
发表于 2023-8-25 10:11:08 | 显示全部楼层 |阅读模式
PE输入表DLL注入

一.实现效果
启动notepad.exe时能够加载自己编写的dll.
最终效果如图所示

PE输入表DLL注入

PE输入表DLL注入

下面逐步讲解并附带源码
二.编写DLL
自行编写DLL,导出一个函数,弹出对话框
  1. // MsgDLL66.cpp : Defines the entry point for the DLL application.
  2. //

  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <stdio.h>

  6. extern "C"
  7. {
  8.         __declspec(dllexport) int Msg() ;
  9. }

  10. DWORD WINAPI ThreadShow(LPVOID LpParameter)
  11. {
  12.         char szPath[MAX_PATH]={0};
  13.         char szBuf[1024]={0};
  14.         GetModuleFileName(NULL,szPath,MAX_PATH);
  15.         sprintf(szBuf,"DLL 已注入到进程 %s [pid=%d]\n",szPath,GetCurrentProcessId());
  16.         //以3种方式显示自己的存在
  17.         //1.Msgbox
  18.         MessageBox(NULL,szBuf,"DLL Inject",MB_OK);
  19.         //2.控制台
  20.         printf("%s",szBuf);
  21.         //3.调试器
  22.         OutputDebugString(szBuf);
  23.         return 0;
  24. }

  25. __declspec(dllexport) int Msg()
  26. {
  27.         char szPath[MAX_PATH]={0};
  28.         char szBuf[1024]={0};
  29.         GetModuleFileName(NULL,szPath,MAX_PATH);
  30.         sprintf(szBuf,"DLL 已注入到进程 %s [pid=%d]\n",szPath,GetCurrentProcessId());
  31.         MessageBoxA(NULL, szBuf, "小星星", MB_OK);
  32.         return 0;
  33. }

  34. BOOL APIENTRY DllMain( HANDLE hModule,
  35.                                           DWORD  ul_reason_for_call,
  36.                                           LPVOID lpReserved
  37.                                           )
  38. {
  39.     switch (ul_reason_for_call)
  40.         {
  41.         case DLL_PROCESS_ATTACH:
  42.                 CreateThread(NULL,0,ThreadShow,NULL,0,NULL);
  43.                 Msg();
  44.                 break;
  45.         case DLL_THREAD_ATTACH:
  46.         case DLL_THREAD_DETACH:
  47.         case DLL_PROCESS_DETACH:
  48.                 break;
  49.     }
  50.     return TRUE;
  51. }
复制代码
上面的源码编译后得到dll文件

PE输入表DLL注入

PE输入表DLL注入

三.修改PE输入表实现DLL注入
新建一个工程,把上面得到的dll文件放在工程目录下

PE输入表DLL注入

PE输入表DLL注入

代码如下,关键地方都做了注释,如果PE基本结构体都不懂,那还是建议先系统学习下


  1. // PEImportDllInject.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include <windows.h>

  5. #define FilePath "c:\\NOTEPAD.EXE"
  6. #define NewFilePath "c:\\NOTEPAD_new1.EXE"

  7. // 把文件读到Buffer里面
  8. LPVOID FileToBuffer()
  9. {
  10.         HANDLE hFile;
  11.         DWORD lpFileSizeHigh;
  12.         DWORD dwFileSize;
  13.         LPVOID  FileBuffer;
  14.         DWORD lpNumberOfBytesRead;
  15.         BOOL bRead;
  16.          
  17.         hFile = CreateFile(FilePath, GENERIC_ALL,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  18.          
  19.         if ( hFile == NULL)
  20.         {
  21.                 printf("CreateFile error %d\n", GetLastError());
  22.         }
  23.          
  24.     dwFileSize = GetFileSize(hFile,&lpFileSizeHigh);
  25.          
  26.         if ( dwFileSize == NULL)
  27.         {
  28.                 printf("GetFileSize error %d\n", GetLastError());
  29.         }
  30.          
  31.         FileBuffer = VirtualAlloc(0,dwFileSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  32.          
  33.         if ( FileBuffer == NULL)
  34.         {
  35.                 printf("VirtualAlloc error %d\n", GetLastError());
  36.         }
  37.          
  38.         bRead = ReadFile(hFile,FileBuffer,dwFileSize,&lpNumberOfBytesRead,NULL);
  39.          
  40.         if ( bRead == FALSE)
  41.         {
  42.                 printf("ReadFile error %d\n", GetLastError());
  43.         }
  44.          
  45.         CloseHandle(hFile);
  46.          
  47.         return  FileBuffer;
  48. }

  49. // 从文件拷贝到内存
  50. LPVOID FileToMemory(LPVOID FileBuffer)
  51. {
  52.         PIMAGE_DOS_HEADER pImageDosHeader;
  53.         PIMAGE_NT_HEADERS  pImageNtHeaders;
  54.         PIMAGE_FILE_HEADER  pImageFileHeader;
  55.         PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  56.         PIMAGE_SECTION_HEADER  pImageSectionHeader;
  57.          
  58.          
  59.         pImageDosHeader = (PIMAGE_DOS_HEADER)FileBuffer;
  60.         pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pImageDosHeader+pImageDosHeader->e_lfanew);
  61.         pImageFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pImageNtHeaders+0x4);
  62.         pImageOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pImageFileHeader+sizeof(IMAGE_FILE_HEADER));
  63.         pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pImageOptionalHeader+pImageFileHeader->SizeOfOptionalHeader);
  64.          
  65.         DWORD dwSizeofImage = pImageOptionalHeader->SizeOfImage;
  66.         DWORD dwSizeofHeader = pImageOptionalHeader->SizeOfHeaders;
  67.         LPVOID MemoryBuffer;
  68.         int i;
  69.          
  70.          
  71.         MemoryBuffer = VirtualAlloc(0,dwSizeofImage*0x10,MEM_COMMIT,PAGE_READWRITE);
  72.          
  73.         if ( MemoryBuffer == NULL)
  74.         {
  75.                 printf("VirtualAlloc error %d\n", GetLastError());
  76.         }
  77.          
  78.         memcpy(MemoryBuffer,FileBuffer,dwSizeofHeader);
  79.          
  80.         for ( i = 0; i < pImageFileHeader->NumberOfSections; i++)
  81.         {
  82.                 memcpy(  (BYTE*)((DWORD)MemoryBuffer+ pImageSectionHeader.VirtualAddress),
  83.                         (BYTE*)((DWORD)FileBuffer+ pImageSectionHeader.PointerToRawData),
  84.                         pImageSectionHeader.SizeOfRawData);
  85.         }
  86.          
  87.         return MemoryBuffer;
  88. }

  89. // 从内存拷贝到新的文件
  90. LPVOID MemoryToNewFile(LPVOID MemoryBuffer)
  91. {
  92.         PIMAGE_DOS_HEADER pImageDosHeader;
  93.         PIMAGE_NT_HEADERS  pImageNtHeaders;
  94.         PIMAGE_FILE_HEADER  pImageFileHeader;
  95.         PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  96.         PIMAGE_SECTION_HEADER  pImageSectionHeader;
  97.          
  98.          
  99.         pImageDosHeader = (PIMAGE_DOS_HEADER)MemoryBuffer;
  100.         pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pImageDosHeader+pImageDosHeader->e_lfanew);
  101.         pImageFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pImageNtHeaders+0x4);
  102.         pImageOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pImageFileHeader+sizeof(IMAGE_FILE_HEADER));
  103.         pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pImageOptionalHeader+pImageFileHeader->SizeOfOptionalHeader);
  104.          
  105.         DWORD dwSizeofImage = pImageOptionalHeader->SizeOfImage;
  106.         DWORD dwSizeofHeader = pImageOptionalHeader->SizeOfHeaders;
  107.         LPVOID NewFileBuffer;
  108.         int i;
  109.          
  110.          
  111.         NewFileBuffer = VirtualAlloc(0,dwSizeofImage,MEM_COMMIT,PAGE_READWRITE);
  112.          
  113.         if ( NewFileBuffer == NULL)
  114.         {
  115.                 printf("VirtualAlloc error %d\n", GetLastError());
  116.         }
  117.          
  118.         memcpy(NewFileBuffer,MemoryBuffer,dwSizeofHeader);
  119.          
  120.         for ( i = 0; i < pImageFileHeader->NumberOfSections; i++)
  121.         {
  122.                
  123.                 memcpy(  (BYTE*)((DWORD)NewFileBuffer+ pImageSectionHeader.PointerToRawData),
  124.                         (BYTE*)((DWORD)MemoryBuffer+ pImageSectionHeader.VirtualAddress),
  125.                         pImageSectionHeader.Misc.VirtualSize);
  126.         }
  127.          
  128.         return NewFileBuffer;
  129.          
  130. }

  131. // 存盘写文件
  132. void WriteToFile(LPVOID NewFileBuffer)
  133. {
  134.          
  135.         PIMAGE_DOS_HEADER pImageDosHeader;
  136.         PIMAGE_NT_HEADERS  pImageNtHeaders;
  137.         PIMAGE_FILE_HEADER  pImageFileHeader;
  138.         PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  139.         PIMAGE_SECTION_HEADER  pImageSectionHeader;
  140.          
  141.         pImageDosHeader = (PIMAGE_DOS_HEADER)NewFileBuffer;
  142.         pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pImageDosHeader+pImageDosHeader->e_lfanew);
  143.         pImageFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pImageNtHeaders+0x4);
  144.         pImageOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pImageFileHeader+sizeof(IMAGE_FILE_HEADER));
  145.         pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pImageOptionalHeader+pImageFileHeader->SizeOfOptionalHeader);
  146.          
  147.         HANDLE hNewFile;
  148.         DWORD dwFileSize;
  149.         DWORD lpNumberOfBytesWritten;
  150.         BOOL bWrite;
  151.          
  152.         hNewFile = CreateFile(NewFilePath, GENERIC_ALL,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  153.          
  154.         if ( hNewFile == NULL)
  155.         {
  156.                 printf("CreateFile error %d\n", GetLastError());
  157.         }
  158.          
  159.         int k = pImageFileHeader->NumberOfSections-1;
  160.          
  161.         dwFileSize = pImageSectionHeader[k].PointerToRawData + pImageSectionHeader[k].SizeOfRawData;
  162.          
  163.          
  164.         bWrite = WriteFile(hNewFile,NewFileBuffer, dwFileSize,&lpNumberOfBytesWritten,NULL);
  165.          
  166.         if ( bWrite == FALSE)
  167.         {
  168.                 printf("WriteFile error %d\n", GetLastError());
  169.         }
  170.          
  171.     CloseHandle(hNewFile);
  172. }

  173. //增加节表
  174. DWORD  AddSection(LPVOID MemoryBuffer, char* SectionName, DWORD SectionSize)
  175. {
  176.          
  177.         PIMAGE_DOS_HEADER pImageDosHeader;
  178.         PIMAGE_NT_HEADERS  pImageNtHeaders;
  179.         PIMAGE_FILE_HEADER  pImageFileHeader;
  180.         PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  181.         PIMAGE_SECTION_HEADER  pImageSectionHeader;
  182.          
  183.         pImageDosHeader = (PIMAGE_DOS_HEADER)MemoryBuffer;
  184.         pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pImageDosHeader+pImageDosHeader->e_lfanew);
  185.         pImageFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pImageNtHeaders+0x4);
  186.         pImageOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pImageFileHeader+sizeof(IMAGE_FILE_HEADER));
  187.         pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pImageOptionalHeader+pImageFileHeader->SizeOfOptionalHeader);
  188.          
  189.         pImageOptionalHeader->DataDirectory[0xb].Size = 0;
  190.         pImageOptionalHeader->DataDirectory[0xb].VirtualAddress = 0;
  191.          
  192.         DWORD AddFileAddress;
  193.         DWORD AddMemAddress;
  194.          
  195.     int i = pImageFileHeader->NumberOfSections;
  196.          
  197.         pImageFileHeader->NumberOfSections += 0x1;
  198.          
  199.         AddFileAddress = pImageSectionHeader[i-1].PointerToRawData + pImageSectionHeader[i-1].SizeOfRawData;
  200.         AddMemAddress = pImageSectionHeader[i-1].VirtualAddress+ pImageSectionHeader[i-1].Misc.VirtualSize;
  201.          
  202.         if ( AddFileAddress % 0x1000 )
  203.         {
  204.         AddFileAddress = (AddFileAddress+0x1000)&0xFFFFF000;
  205.         }
  206.          
  207.         if ( AddMemAddress % 0x1000 )
  208.         {
  209.         AddMemAddress = (AddMemAddress+0x1000)&0xFFFFF000;
  210.         }
  211.          
  212.         strcpy( (char*)pImageSectionHeader.Name, SectionName);
  213.         pImageSectionHeader.PointerToRawData = AddFileAddress;
  214.         pImageSectionHeader.VirtualAddress = AddMemAddress;
  215.         pImageSectionHeader.SizeOfRawData = SectionSize;
  216.         pImageSectionHeader.Misc.VirtualSize = SectionSize;
  217.         pImageSectionHeader.Characteristics = 0xFFFFFFFF;
  218.          
  219.         pImageOptionalHeader->SizeOfImage = pImageSectionHeader.VirtualAddress+pImageSectionHeader.Misc.VirtualSize;
  220.          
  221.         DWORD AddSectionBuffer;
  222.          
  223.         AddSectionBuffer = (DWORD)MemoryBuffer+AddMemAddress;
  224.          
  225.          
  226.         return AddSectionBuffer;
  227. }

  228. //输入表dll注入
  229. int DLLInject(LPVOID MemoryBuffer,DWORD AddSectionBuffer)
  230. {
  231.         PIMAGE_DOS_HEADER pImageDosHeader;
  232.         PIMAGE_NT_HEADERS  pImageNtHeaders;
  233.         PIMAGE_FILE_HEADER  pImageFileHeader;
  234.         PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  235.         PIMAGE_SECTION_HEADER  pImageSectionHeader;
  236.         PIMAGE_IMPORT_DESCRIPTOR pImport;
  237.          
  238.         pImageDosHeader = (PIMAGE_DOS_HEADER)MemoryBuffer;
  239.         pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pImageDosHeader+pImageDosHeader->e_lfanew);
  240.         pImageFileHeader = (PIMAGE_FILE_HEADER)((DWORD)pImageNtHeaders+0x4);
  241.         pImageOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pImageFileHeader+sizeof(IMAGE_FILE_HEADER));
  242.         pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pImageOptionalHeader+pImageFileHeader->SizeOfOptionalHeader);        
  243.         pImport=(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)MemoryBuffer+pImageOptionalHeader->DataDirectory[1].VirtualAddress);
  244.         DWORD TotalSize;
  245.         DWORD* NewAddr=(DWORD*)AddSectionBuffer;
  246.          
  247.          
  248.         //1.备份原IID结构
  249.         memcpy(NewAddr,pImport,pImageOptionalHeader->DataDirectory[1].Size);
  250.          
  251.         //结束标记 以0结束
  252.         memset((void*)((DWORD)NewAddr+pImageOptionalHeader->DataDirectory[1].Size),0,sizeof(_IMAGE_IMPORT_DESCRIPTOR));
  253.          
  254.         //2.在原IID 区域构造新的IID的OFT Name FT结构
  255.         DWORD DLLNameRVA=(DWORD)pImport+0x16;
  256.         char*DLLName="MsgDLL66.dll";
  257.         DWORD DLLNameSize=(strlen(DLLName)+1+1)&0xe;
  258.         memcpy((void*)DLLNameRVA,DLLName,DLLNameSize);
  259.         DWORD ByNameRVA=DLLNameRVA+DLLNameSize;
  260.         memset((void*)ByNameRVA,0,2);//hint填充为0
  261.         char*FunName="Msg";
  262.         DWORD FunNameSize=(strlen(FunName)+1+1)&0xe;
  263.         memcpy((void*)(ByNameRVA+2),FunName,FunNameSize);
  264.         *(DWORD*)pImport=ByNameRVA-(DWORD)MemoryBuffer;
  265.         *(DWORD*)((DWORD)pImport+0x4)=0x0;
  266.         *(DWORD*)((DWORD)pImport+0x8)=ByNameRVA-(DWORD)MemoryBuffer;
  267.         *(DWORD*)((DWORD)pImport+0xc)=0x0;
  268.          
  269.         //3.填充新输入表项的IID结构
  270.         PIMAGE_IMPORT_DESCRIPTOR NewIID=(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)NewAddr+pImageOptionalHeader->DataDirectory[1].Size-sizeof(_IMAGE_IMPORT_DESCRIPTOR));
  271.         NewIID->OriginalFirstThunk=(DWORD)pImport-(DWORD)MemoryBuffer;
  272.         NewIID->Name=DLLNameRVA-(DWORD)MemoryBuffer;
  273.         NewIID->FirstThunk=(DWORD)pImport+0x8-(DWORD)MemoryBuffer;
  274.          
  275.         //4.修正PE文件头的信息
  276.         //修改.txt属性
  277.         pImageSectionHeader[0].Characteristics=0xE0000020;
  278.         //修改新节表的属性为0xFFFFFFFF 以及数据目录第B项改为00 (新增节时已经改了)
  279.         //更正输入表的地址以及大小
  280.         pImageOptionalHeader->DataDirectory[1].VirtualAddress=(DWORD)NewAddr-(DWORD)MemoryBuffer;
  281.         pImageOptionalHeader->DataDirectory[1].Size+=sizeof(_IMAGE_IMPORT_DESCRIPTOR);
  282.          
  283.         return 0;
  284. }

  285. int main(int argc, char* argv[])
  286. {
  287.         LPVOID  FileBuffer;
  288.         LPVOID  MemoryBuffer;
  289.         LPVOID  NewFileBuffer;
  290.         DWORD AddSectionBuffer;
  291.         // 把文件读到Buffer里面
  292.         FileBuffer = FileToBuffer();
  293.          
  294.         // 从文件拷贝到内存
  295.         MemoryBuffer = FileToMemory(FileBuffer);

  296.         //增加节表
  297.         AddSectionBuffer = AddSection(MemoryBuffer, ".111", 0x1000);

  298.         //DLL注入
  299.         DLLInject(MemoryBuffer,AddSectionBuffer);
  300.          
  301.         // 从内存拷贝到新的文件
  302.         NewFileBuffer = MemoryToNewFile(MemoryBuffer);

  303.         // 存盘写文件
  304.          WriteToFile(NewFileBuffer);


  305.         printf("Hello World!\n");
  306.         return 0;
  307. }
复制代码
四.测试效果
运行后在C盘生成了如下新文件

PE输入表DLL注入

PE输入表DLL注入

双击后在打开记事本之前首先弹出了我们注入的dll弹框

PE输入表DLL注入

PE输入表DLL注入

注入成功;;;;
我们再用od加载:

PE输入表DLL注入

PE输入表DLL注入

可以看到,我们的dll也在其中
用LordPE工具加载在输入表里也看到了我们自己写的dll

PE输入表DLL注入

PE输入表DLL注入

由此可见,dll注入确实成功啦

链接:https://pan.baidu.com/s/1Sjd1b-SQSZwTeFN7Bb9q3A
附件中为完整源码:
文件名称:提取码下载.txt 
下载次数:4  文件大小:17 Bytes  售价:5金钱 [记录]
下载权限: 不限 [购买VIP]   [充值]   [在线充值]   【VIP会员5折;永久VIP免费】
安全检测,请放心下载








相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|依星源码资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-5-3 10:41

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表