zoukankan      html  css  js  c++  java
  • R3获取kernel32地址

    获取Kernel32地址

        如果是搞PE变形或者PE重构,再或者代码注入,很多时候我们要动态获取Loadlibrary()以及GetPeocAddress()两个函数的地址,通过这两个函数再动态获取其他函数地址,这样就可以免导入了。不然导入表里会暴露自己的调用。

        对于静态PE文件重组来说,可以通过查看原有的PE文件是不是调用了这两个,或者加载了Kernell32.dll(通常都是已经加载了的),然后获取原来的地址,再自己调用。

    而对于代码注入这种内存里跑的,通常是在注入程序里自己获取了相关函数的地址(同一一个运行的系统中,多个进程获取到的这两个函数的地址是一样的)so....

    这次是直接通过其他方法获取kernel32的地址,通常用在PE文件变形中。主要还是处理内嵌机器码对导入表的依赖问题。

        Ok就在刚刚搜索相关资料的时候,我发现有人通过类似姿在R3层隐藏DLL的调用。一会总结完这个再学习下那个东西。

        获取Kernel32的地址网上也有很多姿势,我总结一个我觉得靠谱的,之前一直在研究驱动相关,想在R0搞一些事情,很多时候都要通过统配标识符来定位相关地址,比如Hook SSDT,64位里很多东西都要通过寻找特征码来找,要么就通过回调,但是因为是要搞事情,很多时候回调搞不定。So...,但是面临的问题就是寻找特征码这个姿势并不稳定,很容易就出问题。你分析了XP win7 win10 那么写了个代码,测试OK敢上线吗?一个问题是不同系统之间可能不一样,同一个系统之间不同版本也可能不同,没有公开的东西,微软有权利随便更改结构(虽然通常不会改,以为没必要)。最后导致的不兼容等蓝屏问题,这个锅当然也是自己背,尤其是做产品,很多时候我们要记住,自己是产品,不是什么外挂和小众软件。很多时候,用户并不懂,蓝屏了的话就是你产品不行,不管你采取了多底层的保护方式,所以很多安全厂商也不想在自己的产品上做减法。这也是为什么如果你搞对抗,就会发现64位出来之后,很多杀软都变得低调了很多,经过测试,在R0里的话,90%的杀软你直接一个基本结束线程的函数就能KO掉服务进程了。好了就这样,废话说多了。回来找kernel32地址。

    大体姿势是这样:

    FS--->TEB--->PEB---> PEB_LDR_DATA.InInitialzationOrderModuleList

    1.FS寄存器指向的是TEB的地址。

    2.TEB的偏移[0x30]处是PEB地址。

    3.PEB里面偏移[0xc]处是PEB_LDR_DATA地址。

    4.PEB_LDR_DATA结构体里面偏移[0xc]是InLoadOrderModuleList地址,得到这个链表地址之后往下走两个位置就是kernel32.dll模块了,到了这个模块之后偏移[0x18]就是存的地址。

    我写了个C++函数。

    HMODULE GetKernel32BaseAddress() {
    HMODULE hsKernel32BaseAddress = 0;
    __asm {
    mov ebx, fs:[0x30]         //得到peb结构体的地址
    mov ebx, [ebx + 0xc]       //得到Ldr结构体的地址
    mov ebx, [ebx + 0xc]       //得到ldr.InLoadOrderModuleList.Flink 第一个模块,当前进程
    mov ebx, [ebx]             //得到第二个模块地址 ntdll.dll
    mov ebx, [ebx]             //得到第三个模块地址 kernel32.dll
    mov ebx, [ebx + 0x18]        //得到第三个模块地址(kernel32模块的dllbase)      
    mov hsKernel32BaseAddress, ebx
    }
    return hsKernel32BaseAddress;
    }

    测试代码如下:

    int main() {

    HMODULE hdKernel32BaseAddress1 = GetKernel32BaseAddress();

    HMODULE hdKernel32BaseAddress2 = LoadLibrary(L"Kernel32.dll");

    hdKernel32BaseAddress1 == hdKernel32BaseAddress2 ?

    MessageBox(NULLL"yes"L"hi"MB_OK) :

    MessageBox(NULL ,L"no" ,L"hi" ,MB_OK);

    return 0;

    }

    OK这样就可以了,我是随机测了几个系统XP Win7 Win10。

    如果是要上线到产品模块,记得要详细测试。最后是提供三个结构体定义,方便看细节。PEB_LDR_DATA、TEB、PEB。

    typedef struct _PEB_LDR_DATA
    {
         ULONG Length;
         UCHAR Initialized;
         PVOID SsHandle;
         LIST_ENTRY InLoadOrderModuleList;
         LIST_ENTRY InMemoryOrderModuleList;
         LIST_ENTRY InInitializationOrderModuleList;
         PVOID EntryInProgress;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    //
    // Thread Environment Block (TEB)
    //
    typedef struct _TEB
    {
        NT_TIB Tib;                             /* 00h */
        PVOID EnvironmentPointer;               /* 1Ch */
        CLIENT_ID Cid;                          /* 20h */
        PVOID ActiveRpcHandle;                  /* 28h */
        PVOID ThreadLocalStoragePointer;        /* 2Ch */
        struct _PEB *ProcessEnvironmentBlock;   /* 30h */
        ULONG LastErrorValue;                   /* 34h */
        ULONG CountOfOwnedCriticalSections;     /* 38h */
        PVOID CsrClientThread;                  /* 3Ch */
        struct _W32THREAD* Win32ThreadInfo;     /* 40h */
        ULONG User32Reserved[0x1A];             /* 44h */
        ULONG UserReserved[5];                  /* ACh */
        PVOID WOW32Reserved;                    /* C0h */
        LCID CurrentLocale;                     /* C4h */
        ULONG FpSoftwareStatusRegister;         /* C8h */
        PVOID SystemReserved1[0x36];            /* CCh */
        LONG ExceptionCode;                     /* 1A4h */
        struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */
        UCHAR SpareBytes1[0x28];                /* 1ACh */
        GDI_TEB_BATCH GdiTebBatch;              /* 1D4h */
        CLIENT_ID RealClientId;                 /* 6B4h */
        PVOID GdiCachedProcessHandle;           /* 6BCh */
        ULONG GdiClientPID;                     /* 6C0h */
        ULONG GdiClientTID;                     /* 6C4h */
        PVOID GdiThreadLocalInfo;               /* 6C8h */
        ULONG Win32ClientInfo[62];              /* 6CCh */
        PVOID glDispatchTable[0xE9];            /* 7C4h */
        ULONG glReserved1[0x1D];                /* B68h */
        PVOID glReserved2;                      /* BDCh */
        PVOID glSectionInfo;                    /* BE0h */
        PVOID glSection;                        /* BE4h */
        PVOID glTable;                          /* BE8h */
        PVOID glCurrentRC;                      /* BECh */
        PVOID glContext;                        /* BF0h */
        NTSTATUS LastStatusValue;               /* BF4h */
        UNICODE_STRING StaticUnicodeString;     /* BF8h */
        WCHAR StaticUnicodeBuffer[0x105];       /* C00h */
        PVOID DeallocationStack;                /* E0Ch */
        PVOID TlsSlots[0x40];                   /* E10h */
        LIST_ENTRY TlsLinks;                    /* F10h */
        PVOID Vdm;                              /* F18h */
        PVOID ReservedForNtRpc;                 /* F1Ch */
        PVOID DbgSsReserved[0x2];               /* F20h */
        ULONG HardErrorDisabled;                /* F28h */
        PVOID Instrumentation[14];              /* F2Ch */
        PVOID SubProcessTag;                    /* F64h */
        PVOID EtwTraceData;                     /* F68h */
        PVOID WinSockData;                      /* F6Ch */
        ULONG GdiBatchCount;                    /* F70h */
        BOOLEAN InDbgPrint;                     /* F74h */
        BOOLEAN FreeStackOnTermination;         /* F75h */
        BOOLEAN HasFiberData;                   /* F76h */
        UCHAR IdealProcessor;                   /* F77h */
        ULONG GuaranteedStackBytes;             /* F78h */
        PVOID ReservedForPerf;                  /* F7Ch */
        PVOID ReservedForOle;                   /* F80h */
        ULONG WaitingOnLoaderLock;              /* F84h */
        ULONG SparePointer1;                    /* F88h */
        ULONG SoftPatchPtr1;                    /* F8Ch */
        ULONG SoftPatchPtr2;                    /* F90h */
        PVOID *TlsExpansionSlots;               /* F94h */
        ULONG ImpersionationLocale;             /* F98h */
        ULONG IsImpersonating;                  /* F9Ch */
        PVOID NlsCache;                         /* FA0h */
        PVOID pShimData;                        /* FA4h */
        ULONG HeapVirualAffinity;               /* FA8h */
        PVOID CurrentTransactionHandle;         /* FACh */
        PTEB_ACTIVE_FRAME ActiveFrame;          /* FB0h */
        PVOID FlsData;                          /* FB4h */
        UCHAR SafeThunkCall;                    /* FB8h */
        UCHAR BooleanSpare[3];                  /* FB9h */
    } TEB, *PTEB;
     
     
    typedef struct _PEB
    {
        UCHAR InheritedAddressSpace; // 00h
        UCHAR ReadImageFileExecOptions; // 01h
        UCHAR BeingDebugged; // 02h
        UCHAR Spare; // 03h
        PVOID Mutant; // 04h
        PVOID ImageBaseAddress; // 08h
        PPEB_LDR_DATA Ldr; // 0Ch
        PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h
        PVOID SubSystemData; // 14h
        PVOID ProcessHeap; // 18h
        PVOID FastPebLock; // 1Ch
        PPEBLOCKROUTINE FastPebLockRoutine; // 20h
        PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h
        ULONG EnvironmentUpdateCount; // 28h
        PVOID* KernelCallbackTable; // 2Ch
        PVOID EventLogSection; // 30h
        PVOID EventLog; // 34h
        PPEB_FREE_BLOCK FreeList; // 38h
        ULONG TlsExpansionCounter; // 3Ch
        PVOID TlsBitmap; // 40h
        ULONG TlsBitmapBits[0x2]; // 44h
        PVOID ReadOnlySharedMemoryBase; // 4Ch
        PVOID ReadOnlySharedMemoryHeap; // 50h
        PVOID* ReadOnlyStaticServerData; // 54h
        PVOID AnsiCodePageData; // 58h
        PVOID OemCodePageData; // 5Ch
        PVOID UnicodeCaseTableData; // 60h
        ULONG NumberOfProcessors; // 64h
        ULONG NtGlobalFlag; // 68h
        UCHAR Spare2[0x4]; // 6Ch
        LARGE_INTEGER CriticalSectionTimeout; // 70h
        ULONG HeapSegmentReserve; // 78h
        ULONG HeapSegmentCommit; // 7Ch
        ULONG HeapDeCommitTotalFreeThreshold; // 80h
        ULONG HeapDeCommitFreeBlockThreshold; // 84h
        ULONG NumberOfHeaps; // 88h
        ULONG MaximumNumberOfHeaps; // 8Ch
        PVOID** ProcessHeaps; // 90h
        PVOID GdiSharedHandleTable; // 94h
        PVOID ProcessStarterHelper; // 98h
        PVOID GdiDCAttributeList; // 9Ch
        PVOID LoaderLock; // A0h
        ULONG OSMajorVersion; // A4h
        ULONG OSMinorVersion; // A8h
        ULONG OSBuildNumber; // ACh
        ULONG OSPlatformId; // B0h
        ULONG ImageSubSystem; // B4h
        ULONG ImageSubSystemMajorVersion; // B8h
        ULONG ImageSubSystemMinorVersion; // C0h
        ULONG GdiHandleBuffer[0x22]; // C4h
        PVOID ProcessWindowStation; // ???
    } PEB, *PPEB;

    宋孖健,13

  • 相关阅读:
    关于同余最短路
    【水】关于 __attribute__
    题解【AtCoder
    一些简单图论问题
    浅谈简单动态规划
    关于博客园主题(美化博客园)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第47章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第46章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第45章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第44章 读书笔记(待更新)
  • 原文地址:https://www.cnblogs.com/csnd/p/12061968.html
Copyright © 2011-2022 走看看