找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3500|回复: 6

可执行文件另类加密

[复制链接]
发表于 2014-4-20 18:00:38 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
操作方法:给定A.exe进行保护
1.使用生成工具去除A.exe所有段内容,例如
00000400        +123C00        .text
00124000        +042E00        .rdata
00166E00        +009000        .data
0016FE00        +00F200 .rsrc
0017F000        +01E200 .reloc
工具会把这些段指向的文件内容置0,生成Afix.exe,这个文件无法运行,因为已经挖空了
2.把A.exe用可逆算法加密成其他文件
3.用启动工具以挂起模式启动Afix.exe
4.将A.exe各个段加载到缓冲区中,对各个段进行重定位
5.将缓冲区中各个段内容动态填充到挂起的Afix.exe的各个段中
6.恢复Afix.exe此时可以运行

正在实现,正在研究,需要时间

回复

使用道具 举报

发表于 2014-4-22 08:01:48 | 显示全部楼层
期待楼主的成果。此外你考虑过64位没
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-4-22 14:44:40 | 显示全部楼层
Encrypt.exe

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <tchar.h>
  4. #include <shlwapi.h>
  5. #include <winternl.h>
  6. #include <zlib.h>
  7. #include <zconf.h>
  8. #include <list>

  9. using namespace std;

  10. #pragma comment(lib,"shlwapi.lib")

  11. class MySection
  12. {//记录PE各个段数据
  13. public:
  14.         IMAGE_SECTION_HEADER header;//段头
  15.         BYTE* data;//段数据

  16. public:
  17.         MySection()
  18.         {
  19.                 data=NULL;
  20.                 memset(&header,0,sizeof(header));
  21.         }

  22.         void SetHeader(IMAGE_SECTION_HEADER& header)
  23.         {
  24.                 memcpy(&this->header,&header,sizeof(IMAGE_SECTION_HEADER));
  25.                 data=new BYTE[header.SizeOfRawData];
  26.                 memset(data,0,header.SizeOfRawData);
  27.         }

  28.         ~MySection()
  29.         {
  30.                 if(data)
  31.                 {
  32.                         delete []data;
  33.                         data=NULL;
  34.                 }
  35.         }
  36. };

  37. list<MySection> Sections;

  38. BOOL InjectProcess(LPTSTR VictimFile,LPBYTE pInjectFileBuf)
  39. {//VictimFile宿主文件        IndectFile注入文件(原始文件)
  40.         IMAGE_DOS_HEADER DosHeaders,DosHeadero;
  41.         IMAGE_NT_HEADERS NtHeaders,NtHeadero;
  42.         PROCESS_INFORMATION pi;
  43.         STARTUPINFO si;
  44.         CONTEXT context;
  45.         PVOID ImageBase;
  46.         SIZE_T BaseAddr;
  47.         LONG offset;
  48.         DWORD dwBytes;
  49.         HMODULE hNtDll=GetModuleHandle("ntdll.dll");
  50.         if(!hNtDll)
  51.                 return FALSE;

  52.         memset(&si, 0, sizeof(si));
  53.         memset(&pi, 0, sizeof(pi));
  54.         si.cb = sizeof(si);

  55.         CopyMemory((void*)&DosHeadero,pInjectFileBuf,sizeof(IMAGE_DOS_HEADER));
  56.         CopyMemory((void*)&NtHeadero,pInjectFileBuf+DosHeadero.e_lfanew,sizeof(IMAGE_NT_HEADERS));

  57.         //检查PE结构
  58.         //以挂起方式进程
  59.         BOOL res = CreateProcess(NULL,VictimFile,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
  60.         if (res)
  61.         {
  62.                 context.ContextFlags = CONTEXT_FULL;
  63.                 if (!GetThreadContext(pi.hThread,&context)) //如果调用失败
  64.                 {
  65.                         CloseHandle(pi.hThread);
  66.                         CloseHandle(pi.hProcess);
  67.                         return FALSE;
  68.                 }
  69.                 ReadProcessMemory(pi.hProcess,(void *)(context.Ebx + 8),&BaseAddr,sizeof(unsigned long),NULL);

  70.                 if (!BaseAddr)
  71.                 {
  72.                         CloseHandle(pi.hThread);
  73.                         CloseHandle(pi.hProcess);
  74.                         return FALSE;
  75.                 }

  76.                 //计算FS的基址
  77.                 LDT_ENTRY      SelEntry;
  78.                 PTEB pteb = new TEB;
  79.                 PPEB ppeb = new PEB;

  80.                 GetThreadSelectorEntry(pi.hThread, context.SegFs, &SelEntry);
  81.                 DWORD dwFSBase = ( SelEntry.HighWord.Bits.BaseHi << 24) | (SelEntry.HighWord.Bits.BaseMid << 16) | SelEntry.BaseLow;

  82.                 ReadProcessMemory( pi.hProcess, (LPCVOID)dwFSBase, pteb, sizeof(TEB), &dwBytes);
  83.                 ReadProcessMemory( pi.hProcess, (LPCVOID)*(DWORD*)((BYTE*)pteb+0x30), ppeb, sizeof(PEB), &dwBytes);//pteb->Peb
  84.                 ImageBase = *(PVOID*)((BYTE*)ppeb+0x08);//ppeb->ImageBaseAddress;
  85.                 ReadProcessMemory(pi.hProcess,ImageBase,&DosHeaders,sizeof(IMAGE_DOS_HEADER),&dwBytes);
  86.                 ReadProcessMemory(pi.hProcess,(LPVOID)((BYTE*)ImageBase+DosHeaders.e_lfanew),&NtHeaders,sizeof(IMAGE_NT_HEADERS),&dwBytes);

  87.                 delete pteb;
  88.                 delete ppeb;

  89.                 offset = DosHeaders.e_lfanew + sizeof(IMAGE_NT_HEADERS);
  90.                 IMAGE_SECTION_HEADER curHeader;//.text和.reloc的信息
  91.                 WORD i = 0;
  92.                 for(i=0; i < NtHeaders.FileHeader.NumberOfSections; i++)
  93.                 {
  94.                         MySection section;
  95.                         ReadProcessMemory(pi.hProcess,(LPVOID)((BYTE*)ImageBase+offset+i*sizeof(IMAGE_SECTION_HEADER)),(void *)&curHeader,sizeof(IMAGE_SECTION_HEADER),&dwBytes);
  96.                                                
  97.                         //下面四行代码获取各个段信息               
  98.                         //.reloc段在CreateProcess后就已经被系统重定向应用到各个段里去了,如果要自己处理,就要取出这个段,并自己应用reloc
  99.                         curHeader.SizeOfRawData=curHeader.Misc.VirtualSize;//用SizeOfRawData在写入的时候会发生堆溢出,目前不知道原因
  100.                         section.SetHeader(curHeader);
  101.                         CopyMemory(section.data,pInjectFileBuf+curHeader.PointerToRawData,curHeader.SizeOfRawData);
  102.                         Sections.push_back(section);

  103.                         if(!StrCmp((char*)curHeader.Name,".reloc"))//确保reloc是最后一个段
  104.                         {//实现重定位
  105.                                 BYTE* relocdata=section.data;
  106.                                 IMAGE_BASE_RELOCATION CurReloc;
  107.                                 CopyMemory((void*)&CurReloc,relocdata,sizeof(CurReloc));
  108.                                 DWORD offset=0;
  109.                                 while(CurReloc.VirtualAddress)
  110.                                 {
  111.                                         int num=(CurReloc.SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2;
  112.                                         WORD* pData=(WORD*)(relocdata+sizeof(IMAGE_BASE_RELOCATION)+offset);
  113.                                         for(int j=0;j<num;j++)
  114.                                         {
  115.                                                 switch(pData[j]>>12)
  116.                                                 {
  117.                                                         case IMAGE_REL_BASED_ABSOLUTE://什么都不做
  118.                                                                 break;

  119.                                                         case IMAGE_REL_BASED_HIGHLOW:
  120.                                                                 {
  121.                                                                         list<MySection>::iterator itor=Sections.begin();
  122.                                                                         while(itor != Sections.end())
  123.                                                                         {
  124.                                                                                 int inneroffset=CurReloc.VirtualAddress+(pData[j]&0xFFF)-(*itor).header.VirtualAddress;
  125.                                                                                 if(inneroffset >= 0 && inneroffset <= (*itor).header.SizeOfRawData)
  126.                                                                                 {
  127.                                                                                         *(DWORD*)((*itor).data+inneroffset) += NtHeaders.OptionalHeader.ImageBase - NtHeadero.OptionalHeader.ImageBase;
  128.                                                                                         break;
  129.                                                                                 }
  130.                                                                                 ++itor;
  131.                                                                         }
  132.                                                                 }
  133.                                                                 break;

  134.                                                         default:
  135.                                                                 printf("unknown!!!!!!!!!!!!!!");
  136.                                                                 break;
  137.                                                 }
  138.                                         }
  139.                                         offset+=CurReloc.SizeOfBlock;
  140.                                         CopyMemory((void*)&CurReloc,relocdata+offset,sizeof(CurReloc));
  141.                                 }
  142.                         }

  143.                         section.data=NULL;//浅拷贝防止析构
  144.                 }
  145.                
  146.                 list<MySection>::iterator itor=Sections.begin();
  147.                 while(itor != Sections.end())
  148.                 {
  149.                         //有些段会因为没有写入权限失败
  150.                         WriteProcessMemory(pi.hProcess,(LPVOID)((DWORD)ImageBase + (*itor).header.VirtualAddress),(*itor).data,(*itor).header.SizeOfRawData,&dwBytes);
  151.                         if(!StrCmp((char*)(*itor).header.Name,".text"))
  152.                         {
  153.                                 break;
  154.                         }
  155.                         ++itor;
  156.                 }
  157.                 ResumeThread(pi.hThread);
  158.         }

  159.         return TRUE;
  160. }

  161. void main()
  162. {
  163.         if(__argc < 3)//文件名+MAKE                文件名+RUN
  164.         {
  165.                 return;
  166.         }

  167.         if(!StrCmp(__argv[2],"MAKE"))
  168.         {//生成注入文件
  169.                 char dir[MAX_PATH],newfile[MAX_PATH];
  170.                 strcpy(dir,__argv[1]);
  171.                 PathRemoveFileSpec(dir);
  172.                 strcpy(newfile,dir);
  173.                 strcat(newfile,"\\data");
  174.                 CopyFile(__argv[1],newfile,FALSE);

  175.                 IMAGE_DOS_HEADER DosHeader;
  176.                 IMAGE_NT_HEADERS NtHeader;
  177.                 DWORD dwNumberOfBytesRead = 0;
  178.                 HANDLE hOldFile = CreateFile(__argv[1],GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  179.                 if (hOldFile == INVALID_HANDLE_VALUE)
  180.                 {
  181.                         return;
  182.                 }
  183.                 SetFilePointer(hOldFile,0,NULL,FILE_BEGIN);
  184.                   ReadFile(hOldFile,&DosHeader,sizeof(DosHeader),&dwNumberOfBytesRead,NULL);
  185.                 SetFilePointer(hOldFile,DosHeader.e_lfanew,NULL,FILE_BEGIN);
  186.                 ReadFile(hOldFile,&NtHeader,sizeof(NtHeader),&dwNumberOfBytesRead,NULL);
  187.                 IMAGE_SECTION_HEADER curHeader;//.text和.reloc的信息
  188.                 WORD i = 0;
  189.                
  190.                 for(i=0; i < NtHeader.FileHeader.NumberOfSections; i++)
  191.                 {
  192.                         ReadFile(hOldFile,&curHeader,sizeof(curHeader),&dwNumberOfBytesRead,NULL);
  193.                         if(!StrCmp((char*)curHeader.Name,".text"))
  194.                         {
  195.                                 break;
  196.                         }
  197.                 }

  198.                 SetFilePointer(hOldFile,curHeader.PointerToRawData,NULL,FILE_BEGIN);
  199.                 BYTE* newbuf=new BYTE[curHeader.SizeOfRawData];
  200.                 memset(newbuf,0,curHeader.SizeOfRawData);
  201.                 WriteFile(hOldFile,newbuf,curHeader.SizeOfRawData,&dwNumberOfBytesRead,NULL);
  202.                 CloseHandle(hOldFile);
  203.                 delete []newbuf;
  204.         }
  205.         else if(!StrCmp(__argv[2],"RUN"))
  206.         {//运行文件
  207.                 char dir[MAX_PATH];
  208.                 strcpy(dir,__argv[1]);
  209.                 PathRemoveFileSpec(dir);
  210.                 strcat(dir,"\\data");
  211.                 HANDLE hNewFile = CreateFile(dir,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  212.                 if (hNewFile == INVALID_HANDLE_VALUE)
  213.                 {
  214.                         return;
  215.                 }
  216.                 DWORD dwFileSize = GetFileSize(hNewFile, NULL);
  217.                 LPBYTE pInjectFileBuf = new BYTE[dwFileSize];
  218.                 memset(pInjectFileBuf, 0, dwFileSize);
  219.                 DWORD dwNumberOfBytesRead = 0;
  220.                 ReadFile(hNewFile,pInjectFileBuf,dwFileSize,&dwNumberOfBytesRead,NULL);
  221.                 CloseHandle(hNewFile);
  222.                 InjectProcess(__argv[1],pInjectFileBuf);
  223.                 delete []pInjectFileBuf;
  224.         }
  225. }
复制代码

虽然只有250行代码,但是这250行代码研究了我3天!!!
用法:
①Encrypt "D:\Program Files\Thunder Network\Thunder\Program\Thunder.exe" MAKE
执行后会将Thunder.exe的.text掏空,使原始文件无法运行,另外将Thunder.exe拷贝一份到同目录下的data文件,这个我没做加密处理,不过相加还是能加的
②Encrypt "D:\Program Files\Thunder Network\Thunder\Program\Thunder.exe" RUN
将被掏空代码的Thunder.exe以挂起模式运行,之后将data文件中正常数据,经过reloc手工修正各个段后填回Thunder.exe的内存映射中,这样就可以正常运行了。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-4-22 14:45:50 | 显示全部楼层
目前只测试了2个程序,不知道有没有其他bug
回复 赞! 靠!

使用道具 举报

发表于 2014-5-3 14:00:01 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2014-5-3 14:00:04 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2014-5-3 14:08:32 来自手机 | 显示全部楼层
你既然把加密的原理都贴出来了,你就不怕别人看穿了你的原理?
没用的,因为地址是随机的,很多都是随机的,除非逆向每一个程序。这就像公钥算法,大家都知道他的算法,但是解不了密
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 16:13 , Processed in 0.035226 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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