zoukankan      html  css  js  c++  java
  • 逆向基础-模块隐藏之断链

    // moduleHide.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include "afxwin.h"
    typedef struct _UNICODE_STRING
    {
        USHORT Length;
        USHORT MaxInumLength;
        PWSTR  Buffer;
    }UNICODE_STRING,*PUNICODE_STRING;
    
    typedef struct _PEB_LDR_DATA
    {
        ULONG Length;            //  : Uint4B
        BOOLEAN Initialized;    //  : UChar
        PVOID SsHandle;         // : Ptr32 Void
        LIST_ENTRY  InLoadOrderModuleList; //_LIST_ENTRY        	//加载的模块列表
        LIST_ENTRY  InMemoryOrderModuleList;// _LIST_ENTRY        	//加载的在内存中的模块列表
        LIST_ENTRY  InInitializationOrderModuleList;// _LIST_ENTRY	//模块初始化的顺序列表
        PVOID  EntryInProgress;// Ptr32 Void
    }PEB_LDR_DATA,*PPEB_LDR_DATA;
    
    typedef struct _LDR_DATA_TABLE_ENTRY
    {
        LIST_ENTRY  InLoadOrderModuleList; //_LIST_ENTRY        	//加载的模块列表
        LIST_ENTRY  InMemoryOrderModuleList;// _LIST_ENTRY        	//加载的在内存中的模块列表
        LIST_ENTRY  InInitializationOrderModuleList;// _LIST_ENTRY	//模块初始化的顺序列表
        PVOID    DllBase;
        PVOID    EntryPoint;
        ULONG    SizeOfImage;
        UNICODE_STRING  FullDllName;
        UNICODE_STRING  BaseDllName;
        ULONG   Flags;
        ULONG   LoadCount;
        SHORT   TlsIndex;
        LIST_ENTRY  HashLinks;
        PVOID   SectionPointer;
        ULONG   CheckSum;
        ULONG   TimeDateStamp;
        PVOID   LoadedImports;
        PVOID   EntryPointActivationContext;
        PVOID   PatchInformation;
    }LDR_DATA_TABLE_ENTRY,* PLDR_DATA_TABLE_ENTRY;
    
    void HideModule(char* szModuleName)
    {
        HMODULE hMod = ::GetModuleHandleA(szModuleName);
        PLIST_ENTRY head, cur;
        PPEB_LDR_DATA ldr;
        PLDR_DATA_TABLE_ENTRY ldm;
        __asm
        {
            mov  eax, Fs: [0x30]        //PEB   获取PEB基址 
            mov  eax, [eax + 0x0c]    // PEB->LDR   获取PEB_LDR_DATA结构指针
            mov ldr,eax
        }
        head = &(ldr->InLoadOrderModuleList);
        cur = head->Flink;
        do
        {
            //宏 CONTAINING_RECORD 根据结构体中的某成员的地址来推算出该结构体整体的地址
            ldm = CONTAINING_RECORD(cur,LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
            
            if (hMod == ldm->DllBase)  //查找到要隐藏的模块,实现断链
            {
                ldm->InLoadOrderModuleList.Blink->Flink = ldm->InLoadOrderModuleList.Flink;
                ldm->InLoadOrderModuleList.Flink->Blink = ldm->InLoadOrderModuleList.Blink;
                ldm->InInitializationOrderModuleList.Blink->Flink = ldm->InInitializationOrderModuleList.Flink;
                ldm->InInitializationOrderModuleList.Flink->Blink = ldm->InInitializationOrderModuleList.Blink;
                ldm->InMemoryOrderModuleList.Blink->Flink = ldm->InMemoryOrderModuleList.Flink;
                break;
            }
            cur = cur->Flink;
        } while (head!=cur);
    
    
    }
    int main(int argc, char* argv[])
    {
         
        printf("********按任意键隐藏模块*********");
        getchar();
        char dllName[] = "user32.dll";
        HideModule(dllName);
        printf("********隐藏模块成功*********");
      
    
      
      
    
    }
    

      

  • 相关阅读:
    malloc函数具体解释
    GeeksforGeeks
    debugging python with IDLE
    sqlplus登录问题
    SNMP协议具体解释
    MP4文件格式具体解释——结构概述
    【C++模版之旅】项目中一次活用C++模板(traits)的经历
    简单的REST的框架实现
    23种设计模式(3):抽象工厂模式
    给字符数组赋值的方法
  • 原文地址:https://www.cnblogs.com/zuolun2017/p/14690625.html
Copyright © 2011-2022 走看看