为PE文件添加CRC32自效验

学习CRC32的一个习作,老实说,对CRC的原理还是不太明白,我是菜鸟,请大家不吝赐教。


原理:

     关于CRC32知识,这里有很好的解释http://www.pediy.com/tutorial/chap6/Chap6-2-4.htm


步骤:

     pe文件通过比较自己的CRC32效验值,来判断自己是否被改写。
     (1)为原pe文件添加一个新的节,将自效验部分(Loader)写入该新节。
     (2)将原pe文件的ep改为新节的开始。
     (3)计算原pe文件部分(在程序里计算的是从pe文件的开头到+0xe5)的CRC32效验值,并将该效验值保存在Loader中。
     (4)修改后的pe文件开始运行时,先计算相应部分的(在程序里计算的是从pe文件的开头到+0xe5 )CRC32效验值。与原pe文件的CRC32效验值比较,若相等则跳转到原pe的ep,否则直接调用ExitProcess退出。


测试:

     (1)打开程序CRC32为记事本添加自效验。
     (3)修改从记事本开头到0xe5范围内的任意一个字节(不要修改关键数据,如“MZ“),再运行,记事本直接ExitProcess,退出。

 

 

说明: 
     (1)源码在vc7+xp_xp2下编译通过。
     (2)卡巴斯基会将已添加自效验的记事本误报为病毒。 
     (3)因为图简单所以将自效验的范围定为"MZ"到0XE5。(添加了新的节以后,记事本的头部会改变,但0xe6之前的不会变)
     (4)在调用ExitProcess时使用了硬编码:mov eax,07c81caa2h(Kernel32.ExitProcess),call eax

 

源码:

  1. // AddCRC32.h: interface for the CAddCRC32 class.  
  2. //  
  3. //  
  4. #include "PE.h"  
  5. #if !defined(AFX_ADDCRC32_H__187EB449_8B77_4294_946C_51C947245FA9__INCLUDED_)  
  6. #define AFX_ADDCRC32_H__187EB449_8B77_4294_946C_51C947245FA9__INCLUDED_  
  7. #if _MSC_VER > 1000  
  8. #pragma once  
  9. #pragma comment(lib,"CRC32Dll.lib")  
  10. extern "C" _declspec (dllimport)  _stdcall void init_crc32table(void);  
  11. extern "C" _declspec (dllimport)  _stdcall void arraycrc32(void);  
  12. #endif // _MSC_VER > 1000  
  13. class CAddCRC32  : public CPE  
  14. {  
  15. public:  
  16.     DWORD cNewOEP;  
  17. public:  
  18.     CAddCRC32();  
  19.     virtual ~CAddCRC32();  
  20.     InitCRC32();  
  21.     ArrayCRC32();  
  22.     AddSection(DWORD AddrToAdd);  
  23.     void InjectLoader();  
  24. };  
  25. #endif // !defined(AFX_ADDCRC32_H__187EB449_8B77_4294_946C_51C947245FA9__INCLUDED_)  

 

  1. // AddCRC32.cpp: implementation of the CAddCRC32 class.  
  2. //  
  3. //  
  4. #include "stdafx.h"  
  5. #include "crc_protector.h"  
  6. #include "AddCRC32.h"  
  7. #ifdef _DEBUG  
  8. #undef THIS_FILE  
  9. static char THIS_FILE[]=__FILE__;  
  10. #define new DEBUG_NEW  
  11. #endif  
  12. //=====================================  
  13. //用于Loader的全局变量(传递给内联汇编代码)  
  14. DWORD NewOEP;           //新的入口点  
  15. DWORD OldOEP;           //旧的入口点  
  16. DWORD CRC32;            //计算得到的CRC效验值  
  17. DWORD OriginalCRC32;    //原始CRC效验值  
  18. DWORD dwFileSize;       //文件的大小  
  19. DWORD InjectAddr;       //注入Loader的位置  
  20. DWORD CRC32Table[256]=  
  21.     {  
  22.  0x00000000,0x77073096,0xEE0E612C,0x990951BA,  
  23.  0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,  
  24.  0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,  
  25.  0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,  
  26.  0x1DB71064 ,0x6AB020F2 ,0xF3B97148,0x84BE41DE,  
  27.  0x1ADAD47D ,0x6DDDE4EB ,0xF4D4B551 ,0x83D385C7,  
  28.  0x136C9856 ,0x646BA8C0 ,0xFD62F97A ,0x8A65C9EC,  
  29.  0x14015C4F ,0x63066CD9 ,0xFA0F3D63 ,0x8D080DF5,  
  30.  0x3B6E20C8 ,0x4C69105E ,0xD56041E4 ,0xA2677172,  
  31.  0x3C03E4D1 ,0x4B04D447 ,0xD20D85FD ,0xA50AB56B,  
  32.  0x35B5A8FA ,0x42B2986C ,0xDBBBC9D6 ,0xACBCF940,  
  33.  0x32D86CE3 ,0x45DF5C75 ,0xDCD60DCF ,0xABD13D59,  
  34.  0x26D930AC ,0x51DE003A ,0xC8D75180 ,0xBFD06116,  
  35.  0x21B4F4B5 ,0x56B3C423 ,0xCFBA9599 ,0xB8BDA50F,  
  36.  0x2802B89E ,0x5F058808 ,0xC60CD9B2 ,0xB10BE924,  
  37.  0x2F6F7C87 ,0x58684C11 ,0xC1611DAB ,0xB6662D3D,  
  38.  0x76DC4190 ,0x01DB7106 ,0x98D220BC ,0xEFD5102A,  
  39.  0x71B18589 ,0x06B6B51F ,0x9FBFE4A5 ,0xE8B8D433,  
  40.  0x7807C9A2 ,0x0F00F934 ,0x9609A88E ,0xE10E9818,  
  41.  0x7F6A0DBB ,0x086D3D2D ,0x91646C97 ,0xE6635C01,  
  42.  0x6B6B51F4 ,0x1C6C6162 ,0x856530D8 ,0xF262004E,  
  43.  0x6C0695ED ,0x1B01A57B ,0x8208F4C1 ,0xF50FC457,  
  44.  0x65B0D9C6 ,0x12B7E950 ,0x8BBEB8EA ,0xFCB9887C,  
  45.  0x62DD1DDF ,0x15DA2D49 ,0x8CD37CF3 ,0xFBD44C65,  
  46.  0x4DB26158 ,0x3AB551CE ,0xA3BC0074 ,0xD4BB30E2,  
  47.  0x4ADFA541 ,0x3DD895D7 ,0xA4D1C46D ,0xD3D6F4FB,  
  48.  0x4369E96A ,0x346ED9FC ,0xAD678846 ,0xDA60B8D0,  
  49.  0x44042D73 ,0x33031DE5 ,0xAA0A4C5F ,0xDD0D7CC9,  
  50.  0x5005713C ,0x270241AA ,0xBE0B1010 ,0xC90C2086,  
  51.  0x5768B525 ,0x206F85B3 ,0xB966D409 ,0xCE61E49F,  
  52.  0x5EDEF90E ,0x29D9C998 ,0xB0D09822 ,0xC7D7A8B4,  
  53.  0x59B33D17 ,0x2EB40D81 ,0xB7BD5C3B ,0xC0BA6CAD,  
  54.  0xEDB88320 ,0x9ABFB3B6 ,0x03B6E20C ,0x74B1D29A,  
  55.  0xEAD54739 ,0x9DD277AF ,0x04DB2615 ,0x73DC1683,  
  56.  0xE3630B12 ,0x94643B84 ,0x0D6D6A3E ,0x7A6A5AA8,  
  57.  0xE40ECF0B ,0x9309FF9D ,0x0A00AE27 ,0x7D079EB1,  
  58.  0xF00F9344 ,0x8708A3D2 ,0x1E01F268 ,0x6906C2FE,  
  59.  0xF762575D ,0x806567CB ,0x196C3671 ,0x6E6B06E7,  
  60.  0xFED41B76 ,0x89D32BE0 ,0x10DA7A5A ,0x67DD4ACC,  
  61.  0xF9B9DF6F ,0x8EBEEFF9 ,0x17B7BE43 ,0x60B08ED5,  
  62.  0xD6D6A3E8 ,0xA1D1937E ,0x38D8C2C4 ,0x4FDFF252,  
  63.  0xD1BB67F1 ,0xA6BC5767 ,0x3FB506DD ,0x48B2364B,  
  64.  0xD80D2BDA ,0xAF0A1B4C ,0x36034AF6 ,0x41047A60,  
  65.  0xDF60EFC3 ,0xA867DF55 ,0x316E8EEF ,0x4669BE79,  
  66.  0xCB61B38C ,0xBC66831A ,0x256FD2A0 ,0x5268E236,  
  67.  0xCC0C7795 ,0xBB0B4703 ,0x220216B9 ,0x5505262F,  
  68.  0xC5BA3BBE ,0xB2BD0B28 ,0x2BB45A92 ,0x5CB36A04,  
  69.  0xC2D7FFA7 ,0xB5D0CF31 ,0x2CD99E8B ,0x5BDEAE1D,  
  70.  0x9B64C2B0 ,0xEC63F226 ,0x756AA39C ,0x026D930A,  
  71.  0x9C0906A9 ,0xEB0E363F ,0x72076785 ,0x05005713,  
  72.  0x95BF4A82 ,0xE2B87A14 ,0x7BB12BAE ,0x0CB61B38,  
  73.  0x92D28E9B ,0xE5D5BE0D ,0x7CDCEFB7 ,0x0BDBDF21,  
  74.  0x86D3D2D4 ,0xF1D4E242 ,0x68DDB3F8 ,0x1FDA836E,  
  75.  0x81BE16CD ,0xF6B9265B ,0x6FB077E1 ,0x18B74777,  
  76.  0x88085AE6 ,0xFF0F6A70 ,0x66063BCA ,0x11010B5C,  
  77.  0x8F659EFF ,0xF862AE69 ,0x616BFFD3 ,0x166CCF45,  
  78.  0xA00AE278 ,0xD70DD2EE ,0x4E048354 ,0x3903B3C2,  
  79.  0xA7672661 ,0xD06016F7 ,0x4969474D ,0x3E6E77DB,  
  80.  0xAED16A4A ,0xD9D65ADC ,0x40DF0B66 ,0x37D83BF0,  
  81.  0xA9BCAE53 ,0xDEBB9EC5 ,0x47B2CF7F ,0x30B5FFE9,  
  82.  0xBDBDF21C ,0xCABAC28A ,0x53B39330 ,0x24B4A3A6,  
  83.  0xBAD03605 ,0xCDD70693 ,0x54DE5729 ,0x23D967BF,  
  84.  0xB3667A2E ,0xC4614AB8 ,0x5D681B02 ,0x2A6F2B94,  
  85.  0xB40BBE37 ,0xC30C8EA1 ,0x5A05DF1B ,0x2D02EF8D  
  86.     };  
  87. //=====================================  
  88. //全局函数  
  89. //=====================================  
  90. DWORD GetFunctionRVA(void* FuncName)//计算函数的RVA  
  91. {  
  92.     DWORD dwRVA=DWORD(FuncName);  
  93.     return(dwRVA);  
  94. }  
  95. int NumOfNOP(PBYTE addrOfNOP)//计算NOP的个数  
  96. {  
  97.     BYTE OpNopCode=0x90;  
  98.     int NumOfNOP=0;  
  99.     PBYTE Pointer=addrOfNOP;  
  100.     do  
  101.     {  
  102.         NumOfNOP++;  
  103.         Pointer++;  
  104.     }  
  105.     while(*Pointer==OpNopCode);  
  106.     return NumOfNOP;  
  107. }  
  108. DWORD GetFunctionSize(void* FuncName)//计算函数的大小  
  109. {  
  110.     DWORD dwRVA=GetFunctionRVA(FuncName);  
  111.     PBYTE pFuncBody=(PBYTE)dwRVA;  
  112.     BYTE _temp;  
  113.     bool notEnd=TRUE;  
  114.     DWORD l=0;  
  115.     do  
  116.     {  
  117.         CopyMemory(&_temp,pFuncBody+l,1);  
  118.         if(_temp==0xC3)//0xC3为retn指令  
  119.         {  
  120.            notEnd=FALSE;  
  121.         }  
  122.         l++;  
  123.     }while(notEnd);  
  124.     return(l);  
  125. }  
  126. //全局函数  
  127. //=====================================  
  128. void Loader()//  
  129. {  
  130.     //放入被PE文件的.crc32节中,效验crc32值  
  131.    // PBYTE RAVOfDest=RVAOfEndSectionTable+pImageBase;  
  132.     _asm  
  133.     {  
  134.     //拷贝开始标志nop数目为3  
  135.     nop  
  136.     nop  
  137.     nop  
  138.     jmp  endofcrc32table  
  139. crc32tbl:  
  140.     nop  
  141.     nop  
  142.     nop  
  143.     nop  
  144.     nop  
  145.     nop  
  146.     nop  
  147.     nop  
  148.     nop  
  149.     nop  
  150.     nop  
  151.     nop  
  152.     nop  
  153.     nop  
  154.     nop  
  155.     nop  
  156.     nop  
  157.     nop  
  158.     nop  
  159.     nop  
  160.     nop  
  161.     nop  
  162.     nop  
  163.     nop  
  164.     nop  
  165.     nop  
  166.     nop  
  167.     nop  
  168.     nop  
  169.     nop  
  170.     nop  
  171.     nop  
  172.     nop  
  173.     nop  
  174.     nop  
  175.     nop  
  176.     nop  
  177.     nop  
  178.     nop  
  179.     nop  
  180.     nop  
  181.     nop  
  182.     nop  
  183.     nop  
  184.     nop  
  185.     nop  
  186.     nop  
  187.     nop  
  188.     nop  
  189.     nop  
  190.     nop  
  191.     nop  
  192.     nop  
  193.     nop  
  194.     nop  
  195.     nop  
  196.     nop  
  197.     nop  
  198.     nop  
  199.     nop  
  200.     nop  
  201.     nop  
  202.     nop  
  203.     nop  
  204.     nop  
  205.     nop  
  206.     nop  
  207.     nop  
  208.     nop  
  209.     nop  
  210.     nop  
  211.     nop  
  212.     nop  
  213.     nop  
  214.     nop  
  215.     nop  
  216.     nop  
  217.     nop  
  218.     nop  
  219.     nop  
  220.     nop  
  221.     nop  
  222.     nop  
  223.     nop  
  224.     nop  
  225.     nop  
  226.     nop  
  227.     nop  
  228.     nop  
  229.     nop  
  230.     nop  
  231.     nop  
  232.     nop  
  233.     nop  
  234.     nop  
  235.     nop  
  236.     nop  
  237.     nop  
  238.     nop  
  239.     nop  
  240.     nop  
  241.     nop  
  242.     nop  
  243.     nop  
  244.     nop  
  245.     nop  
  246.     nop  
  247.     nop  
  248.     nop  
  249.     nop  
  250.     nop  
  251.     nop  
  252.     nop  
  253.     nop  
  254.     nop  
  255.     nop  
  256.     nop  
  257.     nop  
  258.     nop  
  259.     nop  
  260.     nop  
  261.     nop  
  262.     nop  
  263.     nop  
  264.     nop  
  265.     nop  
  266.     nop  
  267.     nop  
  268.     nop  
  269.     nop  
  270.     nop  
  271.     nop  
  272.     nop  
  273.     nop  
  274.     nop  
  275.     nop  
  276.     nop  
  277.     nop  
  278.     nop  
  279.     nop  
  280.     nop  
  281.     nop  
  282.     nop  
  283.     nop  
  284.     nop  
  285.     nop  
  286.     nop  
  287.     nop  
  288.     nop  
  289.     nop  
  290.     nop  
  291.     nop  
  292.     nop  
  293.     nop  
  294.     nop  
  295.     nop  
  296.     nop  
  297.     nop  
  298.     nop  
  299.     nop  
  300.     nop  
  301.     nop  
  302.     nop  
  303.     nop  
  304.     nop  
  305.     nop  
  306.     nop  
  307.     nop  
  308.     nop  
  309.     nop  
  310.     nop  
  311.     nop  
  312.     nop  
  313.     nop  
  314.     nop  
  315.     nop  
  316.     nop  
  317.     nop  
  318.     nop  
  319.     nop  
  320.     nop  
  321.     nop  
  322.     nop  
  323.     nop  
  324.     nop  
  325.     nop  
  326.     nop  
  327.     nop  
  328.     nop  
  329.     nop  
  330.     nop  
  331.     nop  
  332.     nop  
  333.     nop  
  334.     nop  
  335.     nop  
  336.     nop  
  337.     nop  
  338.     nop  
  339.     nop  
  340.     nop  
  341.     nop  
  342.     nop  
  343.     nop  
  344.     nop  
  345.     nop  
  346.     nop  
  347.     nop  
  348.     nop  
  349.     nop  
  350.     nop  
  351.     nop  
  352.     nop  
  353.     nop  
  354.     nop  
  355.     nop  
  356.     nop  
  357.     nop  
  358.     nop  
  359.     nop  
  360.     nop  
  361.     nop  
  362.     nop  
  363.     nop  
  364.     nop  
  365.     nop  
  366.     nop  
  367.     nop  
  368.     nop  
  369.     nop  
  370.     nop  
  371.     nop  
  372.     nop  
  373.     nop  
  374.     nop  
  375.     nop  
  376.     nop  
  377.     nop  
  378.     nop  
  379.     nop  
  380.     nop  
  381.         nop  
  382.     nop  
  383.     nop  
  384.     nop  
  385.     nop  
  386.     nop  
  387.     nop  
  388.     nop  
  389.     nop  
  390.     nop  
  391.         nop  
  392.     nop  
  393.     nop  
  394.     nop  
  395.     nop  
  396.     nop  
  397.     nop  
  398.     nop  
  399.     nop  
  400.     nop  
  401.     nop  
  402.     nop  
  403.     nop  
  404.     nop  
  405.     nop  
  406.     nop  
  407.     nop  
  408.         nop  
  409.     nop  
  410.     nop  
  411.     nop  
  412.     nop  
  413.     nop  
  414.     nop  
  415.     nop  
  416.     nop  
  417.     nop  
  418.         nop  
  419.     nop  
  420.     nop  
  421.     nop  
  422.     nop  
  423.     nop  
  424.     nop  
  425.     nop  
  426.     nop  
  427.     nop  
  428.         nop  
  429.     nop  
  430.     nop  
  431.     nop  
  432.     nop  
  433.     nop  
  434.     nop  
  435.     nop  
  436.     nop  
  437.     nop  
  438.         nop  
  439.     nop  
  440.     nop  
  441.     nop  
  442.     nop  
  443.     nop  
  444.     nop  
  445.     nop  
  446.     nop  
  447.     nop  
  448.         nop  
  449.     nop  
  450.     nop  
  451.     nop  
  452.     nop  
  453.     nop  
  454.     nop  
  455.     nop  
  456.     nop  
  457.     nop  
  458.         nop  
  459.     nop  
  460.     nop  
  461.     nop  
  462.     nop  
  463.     nop  
  464.     nop  
  465.     nop  
  466.     nop  
  467.     nop  
  468.         nop  
  469.     nop  
  470.     nop  
  471.     nop  
  472.     nop  
  473.     nop  
  474.     nop  
  475.     nop  
  476.     nop  
  477.     nop  
  478.         nop  
  479.     nop  
  480.     nop  
  481.     nop  
  482.     nop  
  483.     nop  
  484.     nop  
  485.     nop  
  486.     nop  
  487.     nop  
  488.         nop  
  489.     nop  
  490.     nop  
  491.     nop  
  492.     nop  
  493.     nop  
  494.     nop  
  495.     nop  
  496.     nop  
  497.     nop  
  498.         nop  
  499.     nop  
  500.     nop  
  501.     nop  
  502.     nop  
  503.     nop  
  504.     nop  
  505.     nop  
  506.     nop  
  507.     nop  
  508.         nop  
  509.     nop  
  510.     nop  
  511.     nop  
  512.     nop  
  513.     nop  
  514.     nop  
  515.     nop  
  516.     nop  
  517.     nop  
  518.         nop  
  519.     nop  
  520.     nop  
  521.     nop  
  522.     nop  
  523.     nop  
  524.     nop  
  525.     nop  
  526.     nop  
  527.     nop  
  528.         nop  
  529.     nop  
  530.     nop  
  531.     nop  
  532.     nop  
  533.     nop  
  534.     nop  
  535.     nop  
  536.     nop  
  537.     nop  
  538.         nop  
  539.     nop  
  540.     nop  
  541.     nop  
  542.     nop  
  543.     nop  
  544.     nop  
  545.     nop  
  546.     nop  
  547.     nop  
  548.         nop  
  549.     nop  
  550.     nop  
  551.     nop  
  552.     nop  
  553.     nop  
  554.     nop  
  555.     nop  
  556.     nop  
  557.     nop  
  558.         nop  
  559.     nop  
  560.     nop  
  561.     nop  
  562.     nop  
  563.     nop  
  564.     nop  
  565.     nop  
  566.     nop  
  567.     nop  
  568.         nop  
  569.     nop  
  570.     nop  
  571.     nop  
  572.     nop  
  573.     nop  
  574.     nop  
  575.     nop  
  576.     nop  
  577.     nop  
  578.         nop  
  579.     nop  
  580.     nop  
  581.     nop  
  582.     nop  
  583.     nop  
  584.     nop  
  585.     nop  
  586.     nop  
  587.     nop  
  588.         nop  
  589.     nop  
  590.     nop  
  591.     nop  
  592.     nop  
  593.     nop  
  594.     nop  
  595.     nop  
  596.     nop  
  597.     nop  
  598.             nop  
  599.     nop  
  600.     nop  
  601.     nop  
  602.     nop  
  603.     nop  
  604.     nop  
  605.     nop  
  606.     nop  
  607.     nop  
  608.         nop  
  609.     nop  
  610.     nop  
  611.     nop  
  612.     nop  
  613.     nop  
  614.     nop  
  615.     nop  
  616.     nop  
  617.     nop  
  618.         nop  
  619.     nop  
  620.     nop  
  621.     nop  
  622.     nop  
  623.     nop  
  624.     nop  
  625.     nop  
  626.     nop  
  627.     nop  
  628.         nop  
  629.     nop  
  630.     nop  
  631.     nop  
  632.     nop  
  633.     nop  
  634.     nop  
  635.     nop  
  636.     nop  
  637.     nop  
  638.         nop  
  639.     nop  
  640.     nop  
  641.     nop  
  642.     nop  
  643.     nop  
  644.     nop  
  645.     nop  
  646.     nop  
  647.     nop  
  648.         nop  
  649.     nop  
  650.     nop  
  651.     nop  
  652.     nop  
  653.     nop  
  654.     nop  
  655.     nop  
  656.     nop  
  657.     nop  
  658.     nop  
  659.     nop  
  660.     nop  
  661.     nop  
  662.     nop  
  663.     nop  
  664.         nop  
  665.     nop  
  666.     nop  
  667.     nop  
  668.     nop  
  669.     nop  
  670.     nop  
  671.     nop  
  672.     nop  
  673.     nop  
  674.         nop  
  675.     nop  
  676.     nop  
  677.     nop  
  678.     nop  
  679.     nop  
  680.     nop  
  681.     nop  
  682.     nop  
  683.     nop  
  684.         nop  
  685.     nop  
  686.     nop  
  687.     nop  
  688.     nop  
  689.     nop  
  690.     nop  
  691.     nop  
  692.     nop  
  693.     nop  
  694.         nop  
  695.     nop  
  696.     nop  
  697.     nop  
  698.     nop  
  699.     nop  
  700.     nop  
  701.     nop  
  702.     nop  
  703.     nop  
  704.         nop  
  705.     nop  
  706.     nop  
  707.     nop  
  708.     nop  
  709.     nop  
  710.     nop  
  711.     nop  
  712.     nop  
  713.     nop  
  714.         nop  
  715.     nop  
  716.     nop  
  717.     nop  
  718.     nop  
  719.     nop  
  720.     nop  
  721.     nop  
  722.     nop  
  723.     nop  
  724.         nop  
  725.     nop  
  726.     nop  
  727.     nop  
  728.     nop  
  729.     nop  
  730.     nop  
  731.     nop  
  732.     nop  
  733.     nop  
  734.         nop  
  735.     nop  
  736.     nop  
  737.     nop  
  738.     nop  
  739.     nop  
  740.     nop  
  741.     nop  
  742.     nop  
  743.     nop  
  744.         nop  
  745.     nop  
  746.     nop  
  747.     nop  
  748.     nop  
  749.     nop  
  750.     nop  
  751.     nop  
  752.     nop  
  753.     nop  
  754.         nop  
  755.     nop  
  756.     nop  
  757.     nop  
  758.     nop  
  759.     nop  
  760.     nop  
  761.     nop  
  762.     nop  
  763.     nop  
  764.         nop  
  765.     nop  
  766.     nop  
  767.     nop  
  768.     nop  
  769.     nop  
  770.     nop  
  771.     nop  
  772.     nop  
  773.     nop  
  774.         nop  
  775.     nop  
  776.     nop  
  777.     nop  
  778.     nop  
  779.     nop  
  780.     nop  
  781.     nop  
  782.     nop  
  783.     nop  
  784.         nop  
  785.     nop  
  786.     nop  
  787.     nop  
  788.     nop  
  789.     nop  
  790.     nop  
  791.     nop  
  792.     nop  
  793.     nop  
  794.         nop  
  795.     nop  
  796.     nop  
  797.     nop  
  798.     nop  
  799.     nop  
  800.     nop  
  801.     nop  
  802.     nop  
  803.     nop  
  804.         nop  
  805.     nop  
  806.     nop  
  807.     nop  
  808.     nop  
  809.     nop  
  810.     nop  
  811.     nop  
  812.     nop  
  813.     nop  
  814.         nop  
  815.     nop  
  816.     nop  
  817.     nop  
  818.     nop  
  819.     nop  
  820.     nop  
  821.     nop  
  822.     nop  
  823.     nop  
  824.         nop  
  825.     nop  
  826.     nop  
  827.     nop  
  828.     nop  
  829.     nop  
  830.     nop  
  831.     nop  
  832.     nop  
  833.     nop  
  834.         nop  
  835.     nop  
  836.     nop  
  837.     nop  
  838.     nop  
  839.     nop  
  840.     nop  
  841.     nop  
  842.     nop  
  843.     nop  
  844.         nop  
  845.     nop  
  846.     nop  
  847.     nop  
  848.     nop  
  849.     nop  
  850.     nop  
  851.     nop  
  852.     nop  
  853.     nop  
  854.             nop  
  855.     nop  
  856.     nop  
  857.     nop  
  858.     nop  
  859.     nop  
  860.     nop  
  861.     nop  
  862.     nop  
  863.     nop  
  864.         nop  
  865.     nop  
  866.     nop  
  867.     nop  
  868.     nop  
  869.     nop  
  870.     nop  
  871.     nop  
  872.     nop  
  873.     nop  
  874.         nop  
  875.     nop  
  876.     nop  
  877.     nop  
  878.     nop  
  879.     nop  
  880.     nop  
  881.     nop  
  882.     nop  
  883.     nop  
  884.         nop  
  885.     nop  
  886.     nop  
  887.     nop  
  888.     nop  
  889.     nop  
  890.     nop  
  891.     nop  
  892.     nop  
  893.     nop  
  894.         nop  
  895.     nop  
  896.     nop  
  897.     nop  
  898.     nop  
  899.     nop  
  900.     nop  
  901.     nop  
  902.     nop  
  903.     nop  
  904.         nop  
  905.     nop  
  906.     nop  
  907.     nop  
  908.     nop  
  909.     nop  
  910.     nop  
  911.     nop  
  912.     nop  
  913.     nop  
  914.     nop  
  915.     nop  
  916.     nop  
  917.     nop  
  918.     nop  
  919.     nop  
  920.         nop  
  921.     nop  
  922.     nop  
  923.     nop  
  924.     nop  
  925.     nop  
  926.     nop  
  927.     nop  
  928.     nop  
  929.     nop  
  930.         nop  
  931.     nop  
  932.     nop  
  933.     nop  
  934.     nop  
  935.     nop  
  936.     nop  
  937.     nop  
  938.     nop  
  939.     nop  
  940.         nop  
  941.     nop  
  942.     nop  
  943.     nop  
  944.     nop  
  945.     nop  
  946.     nop  
  947.     nop  
  948.     nop  
  949.     nop  
  950.         nop  
  951.     nop  
  952.     nop  
  953.     nop  
  954.     nop  
  955.     nop  
  956.     nop  
  957.     nop  
  958.     nop  
  959.     nop  
  960.         nop  
  961.     nop  
  962.     nop  
  963.     nop  
  964.     nop  
  965.     nop  
  966.     nop  
  967.     nop  
  968.     nop  
  969.     nop  
  970.         nop  
  971.     nop  
  972.     nop  
  973.     nop  
  974.     nop  
  975.     nop  
  976.     nop  
  977.     nop  
  978.     nop  
  979.     nop  
  980.         nop  
  981.     nop  
  982.     nop  
  983.     nop  
  984.     nop  
  985.     nop  
  986.     nop  
  987.     nop  
  988.     nop  
  989.     nop  
  990.         nop  
  991.     nop  
  992.     nop  
  993.     nop  
  994.     nop  
  995.     nop  
  996.     nop  
  997.     nop  
  998.     nop  
  999.     nop  
  1000.         nop  
  1001.     nop  
  1002.     nop  
  1003.     nop  
  1004.     nop  
  1005.     nop  
  1006.     nop  
  1007.     nop  
  1008.     nop  
  1009.     nop  
  1010.         nop  
  1011.     nop  
  1012.     nop  
  1013.     nop  
  1014.     nop  
  1015.     nop  
  1016.     nop  
  1017.     nop  
  1018.     nop  
  1019.     nop  
  1020.         nop  
  1021.     nop  
  1022.     nop  
  1023.     nop  
  1024.     nop  
  1025.     nop  
  1026.     nop  
  1027.     nop  
  1028.     nop  
  1029.     nop  
  1030.         nop  
  1031.     nop  
  1032.     nop  
  1033.     nop  
  1034.     nop  
  1035.     nop  
  1036.     nop  
  1037.     nop  
  1038.     nop  
  1039.     nop  
  1040.         nop  
  1041.     nop  
  1042.     nop  
  1043.     nop  
  1044.     nop  
  1045.     nop  
  1046.     nop  
  1047.     nop  
  1048.     nop  
  1049.     nop  
  1050.         nop  
  1051.     nop  
  1052.     nop  
  1053.     nop  
  1054.     nop  
  1055.     nop  
  1056.     nop  
  1057.     nop  
  1058.     nop  
  1059.     nop  
  1060.         nop  
  1061.     nop  
  1062.     nop  
  1063.     nop  
  1064.     nop  
  1065.     nop  
  1066.     nop  
  1067.     nop  
  1068.     nop  
  1069.     nop  
  1070.         nop  
  1071.     nop  
  1072.     nop  
  1073.     nop  
  1074.     nop  
  1075.     nop  
  1076.     nop  
  1077.     nop  
  1078.     nop  
  1079.     nop  
  1080.         nop  
  1081.     nop  
  1082.     nop  
  1083.     nop  
  1084.     nop  
  1085.     nop  
  1086.     nop  
  1087.     nop  
  1088.     nop  
  1089.     nop  
  1090.         nop  
  1091.     nop  
  1092.     nop  
  1093.     nop  
  1094.     nop  
  1095.     nop  
  1096.     nop  
  1097.     nop  
  1098.     nop  
  1099.     nop  
  1100.         nop  
  1101.     nop  
  1102.     nop  
  1103.     nop  
  1104.     nop  
  1105.     nop  
  1106.     nop  
  1107.     nop  
  1108.     nop  
  1109.     nop  
  1110.     nop  
  1111.     nop  
  1112.     nop  
  1113.     nop  
  1114.     nop  
  1115.     nop  
  1116.     nop  
  1117.     nop  
  1118.     nop  
  1119.     nop  
  1120.     nop  
  1121.     nop  
  1122.     nop  
  1123.     nop  
  1124.     nop  
  1125.     nop  
  1126.     nop  
  1127.     nop  
  1128.     nop  
  1129.     nop  
  1130.     nop  
  1131.     nop  
  1132.     nop  
  1133.     nop  
  1134.     nop  
  1135.     nop  
  1136.     nop  
  1137.     nop  
  1138.     nop  
  1139.     nop  
  1140.     nop  
  1141.     nop  
  1142.     nop  
  1143.     nop  
  1144.     nop  
  1145.     nop  
  1146.     nop  
  1147.     nop  
  1148.     nop  
  1149.     nop  
  1150.     nop  
  1151.     nop  
  1152.     nop  
  1153.     nop  
  1154.     nop  
  1155.     nop  
  1156.     nop  
  1157.     nop  
  1158.     nop  
  1159.     nop  
  1160.     nop  
  1161.     nop  
  1162.     nop  
  1163.     nop  
  1164.     //给crc32table预留的256个DWORD空间  
  1165. endofcrc32table:  
  1166.     nop  
  1167.     nop  
  1168.     xor eax,eax  
  1169.     //  
  1170.     nop  
  1171.     nop  
  1172.     nop  
  1173.     nop  
  1174.     nop  
  1175.     nop  
  1176.     nop  
  1177.     nop  
  1178.     nop  
  1179.     nop  
  1180.     nop  
  1181.     nop  
  1182.     nop  
  1183.     nop  
  1184.     nop  
  1185.     nop  
  1186.     nop  
  1187.     nop  
  1188. //18个nop  
  1189.     //mov ebx,开头的位置  
  1190.     //mov ecx,总的字节数  
  1191.     //mov edi,originalcrc32  
  1192.     mov eax,-1  
  1193.     or ecx,ecx  
  1194.     jz $Done  
  1195.     or ebx,ebx  
  1196.     jz $Done  
  1197. next:  
  1198.     mov dl,[ebx]  
  1199.     xor dl,al  
  1200.     movzx edx,dl  
  1201.     shr eax,8  
  1202.     //use esi  
  1203.     nop  
  1204.     nop  
  1205.     nop  
  1206.     nop  
  1207.     nop  
  1208.     nop  
  1209.     //4个nop,标记此处插入mov esi,crc32table地址  
  1210.     xor eax,[esi+edx*4]  
  1211.     //use esi  
  1212.     inc ebx  
  1213.     dec ecx  
  1214.     jne next  
  1215.     not eax  
  1216.     cmp eax,edi  
  1217.     jz $Done//  
  1218.     mov eax,07c81caa2h//exitprocess  
  1219.     call eax  
  1220.     //push   
  1221.     //call   
  1222. $Done://计算crc32的部分  
  1223.     nop  
  1224.     nop  
  1225.     nop  
  1226.     nop  
  1227.     nop//5个nop,nop的数量来标示injection结束  
  1228.     }  
  1229. }  
  1230. //=====================================  
  1231. //全局函数  
  1232. //  
  1233. // Construction/Destruction  
  1234. //  
  1235.   
  1236. CAddCRC32::CAddCRC32()  
  1237. {  
  1238. }  
  1239. CAddCRC32::~CAddCRC32()  
  1240. {  
  1241.   
  1242. }  
  1243. CAddCRC32::InitCRC32()  
  1244. {  
  1245.     init_crc32table();  
  1246. }  
  1247. CAddCRC32::ArrayCRC32()  
  1248. {  
  1249.     DWORD tmp1=0xe5;//baseofdata-baseofcode  
  1250.     DWORD tmp2=(DWORD)(pImageBase);//  
  1251.     __asm  
  1252.     {  
  1253.         mov ebx,tmp2  
  1254.         mov ecx,tmp1  
  1255.     }  
  1256.     OriginalCRC32=arraycrc32();//计算crc32值  
  1257. }  
  1258. CAddCRC32::AddSection(DWORD AddrToAdd)  
  1259. {  
  1260.       
  1261.     //pSection指向新添加的节表  
  1262.     PIMAGE_SECTION_HEADER pSection=(PIMAGE_SECTION_HEADER)AddrToAdd;  
  1263.     //  
  1264.     //添加节表名  
  1265.     BYTE    Name[8]=".crc32";  
  1266.     PBYTE ptmp;  
  1267.     ptmp=pSection->Name;  
  1268.     for(int i=0;i<8;i++)  
  1269.     {  
  1270.       *(ptmp)=Name[i];  
  1271.       ptmp++;  
  1272.     }  
  1273.     //  
  1274.     //将VirtualSize(内存块大小)的大小设置为LenOfNewSection  
  1275.     DWORD LenOfNewSection=0x789;  
  1276.     pSection->Misc.VirtualSize=LenOfNewSection;  
  1277.     //  
  1278.     //计算相关的数据:  
  1279.     //(1)新节的virtual offset  
  1280.     //(2)新节的对齐文件大小  
  1281.     //(1)  
  1282.     DWORD SectionAlignment,FileAlignment;  
  1283.     SectionAlignment=pImageOptionalHeader->SectionAlignment;  
  1284.     FileAlignment=pImageOptionalHeader->FileAlignment;  
  1285.     PIMAGE_SECTION_HEADER ForwardSection=(PIMAGE_SECTION_HEADER)(AddrToAdd-0x28);  
  1286.     DWORD ForwardVA,ForwardVS;  
  1287.     ForwardVA=ForwardSection->VirtualAddress;  
  1288.     ForwardVS=ForwardSection->Misc.VirtualSize;  
  1289.     UINT residue,quotient,tmp1,sec_NewVA;  
  1290.     residue=(UINT)ForwardVS%SectionAlignment;  
  1291.     quotient=(UINT)ForwardVS/SectionAlignment;  
  1292.     if(residue!=0x0)quotient++;  
  1293.     tmp1=(UINT)quotient*SectionAlignment;  
  1294.     sec_NewVA=tmp1+ForwardVA;  
  1295.     //(1)  
  1296.     //(2)  
  1297.     UINT tmp2,tmp3,tmp4,sec_NewSR;  
  1298.     tmp2=(UINT)LenOfNewSection%FileAlignment;  
  1299.     tmp3=(UINT)LenOfNewSection/FileAlignment;  
  1300.     if(tmp2!=0x0)tmp3++;  
  1301.     tmp4=(UINT)tmp3*FileAlignment;  
  1302.     sec_NewSR=tmp4;  
  1303.     //(2)  
  1304.     //内存中块的rva值  
  1305.     pSection->VirtualAddress=sec_NewVA;  
  1306.     NewOEP=sec_NewVA+pImageOptionalHeader->ImageBase;;  
  1307.     cNewOEP=sec_NewVA;  
  1308.     //  
  1309.     //文件中的块大小  
  1310.     pSection->SizeOfRawData=sec_NewSR;  
  1311.     //  
  1312.     //文件中的块偏移  
  1313.     pSection->PointerToRawData=ForwardSection->PointerToRawData+ForwardSection->SizeOfRawData;  
  1314.     InjectAddr=pSection->PointerToRawData;//文件偏移量  
  1315.     //  
  1316.     //obj文件使用  
  1317.     pSection->NumberOfLinenumbers=0x0;  
  1318.     pSection->NumberOfRelocations=0x0;  
  1319.     pSection->PointerToLinenumbers=0x0;  
  1320.     pSection->PointerToRelocations=0x0;  
  1321.     //  
  1322.     //修改该节的属性(可读写)  
  1323.     pSection->Characteristics=0x0C00000E0;  
  1324.     //  
  1325.     //  
  1326.     //修改节的数目  
  1327.     UINT NewNum=NumberOfSection+1;  
  1328.     CopyMemory(&pImageFileHeader->NumberOfSections,&NewNum,2);  
  1329.     //  
  1330.     //更新imagesize  
  1331.     UINT tmp3_1,tmp3_2,tmp3_3,tmp3_4;  
  1332.     tmp3_1=LenOfNewSection+pImageOptionalHeader->SizeOfImage;  
  1333.     tmp3_2=tmp3_1/SectionAlignment;  
  1334.     tmp3_3=tmp3_1%SectionAlignment;  
  1335.     if(tmp3_3!=0)tmp3_2++;  
  1336.     tmp3_4=(UINT)tmp3_2*SectionAlignment;  
  1337.     pImageOptionalHeader->SizeOfImage=tmp3_4;  
  1338.     //将bound import设置成零  
  1339.     pImageOptionalHeader->DataDirectory[11].VirtualAddress=0x0;  
  1340.     pImageOptionalHeader->DataDirectory[11].Size=0x0;  
  1341.     //修改文件的大小  
  1342.     ::SetFilePointer(hFile,pSection->PointerToRawData+pSection->SizeOfRawData,0,FILE_BEGIN);  
  1343.     ::SetEndOfFile(hFile);  
  1344. }  
  1345. void CAddCRC32::InjectLoader()//InjectAddr注入的位置  
  1346. {  
  1347.     //保存老的ep  
  1348.     OldOEP=pImageOptionalHeader->AddressOfEntryPoint+pImageOptionalHeader->ImageBase;  
  1349.     //  
  1350.     BYTE OpNOPCode=0x90;  
  1351.     DWORD Pointer=InjectAddr;  
  1352.     PBYTE ptmp=(PBYTE)Pointer;//指向待Inject的位置  
  1353.     DWORD FuncRVA=GetFunctionSize(Loader);//Loader的大小  
  1354.     DWORD dwRVA=GetFunctionRVA(Loader);//Loader的RVA  
  1355.     PBYTE pFuncBody=(PBYTE)dwRVA;  
  1356.     while(1)  
  1357.     {  
  1358.         if(NumOfNOP(pFuncBody)==3)  
  1359.         {  
  1360.             pFuncBody=pFuncBody+3;  
  1361.             break;  
  1362.         }  
  1363.         else  
  1364.         {  
  1365.             pFuncBody++;  
  1366.         }  
  1367.     }  
  1368.     //定位到1024个nop上  
  1369.     //将loader的Opcode写入PE文件的.crc32节中  
  1370.     for(;ptmp<(PBYTE)(Pointer+FuncRVA);)  
  1371.     {  
  1372.         if(*pFuncBody==OpNOPCode && NumOfNOP(pFuncBody)>256)//若为NOP,则开始Inject  
  1373.         {  
  1374.             PDWORD CRC=CRC32Table;  
  1375.             for(int i=0;i<256;i++)//将crc32table写入.crc节  
  1376.             {  
  1377.             DWORD num=4;  
  1378.             ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1379.             ::WriteFile(hFile,CRC,num,&num,NULL);  
  1380.             ptmp=ptmp+4;  
  1381.             CRC++;  
  1382.             }  
  1383.             pFuncBody=pFuncBody+1024;  
  1384.         }  
  1385.         if(*pFuncBody==OpNOPCode && NumOfNOP(pFuncBody)==18 )  
  1386.         {  
  1387.            //  
  1388.            BYTE OpMovEbx=0xBB;  
  1389.            DWORD tmp=(DWORD)(pImageOptionalHeader->ImageBase);//效验计算开始位置:imagebase  
  1390.            BYTE MovEbx[5];  
  1391.            CopyMemory(MovEbx,&OpMovEbx,1);  
  1392.            CopyMemory(&MovEbx[1],&tmp,4);//mov eax,ep  
  1393.            DWORD  num=5;  
  1394.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1395.           ::WriteFile(hFile,MovEbx,num,&num,NULL);  
  1396.           ptmp=ptmp+5;  
  1397.           pFuncBody=pFuncBody+5;  
  1398.           //  
  1399.           BYTE OpMovEcx=0xB9;  
  1400.           tmp=0xe5;//效验计算的结束位置:新的入口点的前一个字节  
  1401.           BYTE MovEcx[5];  
  1402.           CopyMemory(MovEcx,&OpMovEcx,1);  
  1403.           CopyMemory(&MovEcx[1],&tmp,4);//mov eax,ep  
  1404.           num=5;  
  1405.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1406.           ::WriteFile(hFile,MovEcx,num,&num,NULL);  
  1407.           ptmp=ptmp+5;  
  1408.           pFuncBody=pFuncBody+5;  
  1409.           //  
  1410.           BYTE OpMovEdi=0xBF;  
  1411.           tmp=OriginalCRC32;//效验计算的结束位置:新的入口点的前一个字节  
  1412.           BYTE MovEdi[5];  
  1413.           CopyMemory(MovEdi,&OpMovEdi,1);  
  1414.           CopyMemory(&MovEdi[1],&tmp,4);//mov eax,ep  
  1415.           num=5;  
  1416.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1417.           ::WriteFile(hFile,MovEdi,num,&num,NULL);  
  1418.           ptmp=ptmp+5;  
  1419.           pFuncBody=pFuncBody+5;  
  1420.         }  
  1421.         if(*pFuncBody==OpNOPCode && NumOfNOP(pFuncBody)==6 )  
  1422.         {  
  1423.            BYTE OpMovEsi=0xBE;  
  1424.            DWORD tmp=NewOEP+5;//jmp xxxx  
  1425.            BYTE MovEsi[5];  
  1426.            CopyMemory(MovEsi,&OpMovEsi,1);  
  1427.            CopyMemory(&MovEsi[1],&tmp,4);//mov eax,ep  
  1428.            DWORD  num=5;  
  1429.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1430.           ::WriteFile(hFile,MovEsi,num,&num,NULL);  
  1431.           ptmp=ptmp+5;  
  1432.           pFuncBody=pFuncBody+5;  
  1433.         }  
  1434.         if(*pFuncBody==OpNOPCode && NumOfNOP(pFuncBody)==5  )  
  1435.         {  
  1436.            BYTE OpMovEax=0xB8;  
  1437.            BYTE OEP_Jmp[7];  
  1438.            CopyMemory(OEP_Jmp,&OpMovEax,1);  
  1439.            CopyMemory(&OEP_Jmp[1],&OldOEP,4);//mov eax,ep  
  1440.            OEP_Jmp[5]=0xFF;  
  1441.            OEP_Jmp[6]=0xE0;//jmp eax  
  1442.            DWORD  num=7;  
  1443.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1444.           ::WriteFile(hFile,OEP_Jmp,num,&num,NULL);  
  1445.             goto exit;  
  1446.         }  
  1447.         //处理不是nop的部分,直接拷贝  
  1448.           DWORD num=1;  
  1449.           ::SetFilePointer(hFile,(LONG)ptmp,0,FILE_BEGIN);  
  1450.           ::WriteFile(hFile,pFuncBody,num,&num,NULL);  
  1451.           pFuncBody++;  
  1452.           ptmp++;  
  1453.     }  
  1454.     //修改程序的oe  
  1455. exit:  
  1456.     pImageOptionalHeader->AddressOfEntryPoint=cNewOEP;  
  1457. }  

 

本文转自:http://blog.csdn.net/rainertop/archive/2008/08/09/2789491.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值