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

  • 相关阅读:
    RabbitMQ 内存控制 硬盘控制
    Flannel和Docker网络不通定位问题
    kafka集群扩容后的topic分区迁移
    CLOSE_WAIT状态的原因与解决方法
    搭建Harbor企业级docker仓库
    Redis哨兵模式主从持久化问题解决
    mysql杂谈(爬坑,解惑,总结....)
    Linux的信号量(semaphore)与互斥(mutex)
    SIP协议的传输层原理&报文解析(解读rfc3581)(待排版) && opensips
    SIP协议的传输层原理&报文解析(解读RFC3261)(待排版)&&启动
  • 原文地址:https://www.cnblogs.com/csnd/p/12061968.html
Copyright © 2011-2022 走看看