郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

郁金香终身VIP管理员QQ150330575项目合作(有实力的+)视频教程+每月更新+QQ群
飞郁视频分享(每周更新)
查看: 574|回复: 1

HideDll 跳过hook头

[复制链接]
发表于 2020-2-23 19:39:58 | 显示全部楼层 |阅读模式

#include "stdafx.h"

//修正API的函数
//BOOL VirtualProtectAD(LPVOID lpAddress, // 目标地址起始位置
//        DWORD dwSize,//大小
//        DWORD flNewProtect, // 请求的保护方式
//        PDWORD lpflOldProtect // 保存老的保护方式
//);
//
//
//HANDLE CreateFileAD(
//        LPCTSTR lpFileName,    // 指向文件名的指针
//        DWORD dwDesiredAccess,    // 访问模式(写 / 读)
//        DWORD dwShareMode,    // 共享模式
//        LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
//        DWORD dwCreationDisposition,   // 如何创建
//        DWORD dwFlagsAndAttributes,   // 文件属性
//        HANDLE hTemplateFile    // 用于复制文件句柄
//);


//修正API的函数
BOOL VirtualProtectAD(LPVOID lpAddress, // 目标地址起始位置
                                          DWORD dwSize,//大小
                                          DWORD flNewProtect, // 请求的保护方式
                                          PDWORD lpflOldProtect // 保存老的保护方式
                                          ){
                                                  DWORD lpFunc=(DWORD)::VirtualProtect+0x5;
                                                  BOOL result=FALSE;
                                                  __asm{
                                                          push lpflOldProtect
                                                                  push flNewProtect
                                                                  push dwSize
                                                                  push lpAddress
                                                                  call labeltop
                                                                  jmp labelend
labeltop:
                                                          mov eax,lpFunc
                                                                  //头部被修改的部分修复
                                                                  mov edi,edi
                                                                  push ebp
                                                                  mov ebp,esp
                                                                  jmp eax
labelend:
                                                          mov result,eax
                                                  }
                                                  //        if(result){
                                                  //                ::AfxMessageBox("成功,很牛逼");
                                                  //        }
                                                  return result;
}




HANDLE CreateFileAD(
                                        LPCTSTR lpFileName,    // 指向文件名的指针
                                        DWORD dwDesiredAccess,    // 访问模式(写 / 读)
                                        DWORD dwShareMode,    // 共享模式
                                        LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
                                        DWORD dwCreationDisposition,   // 如何创建
                                        DWORD dwFlagsAndAttributes,   // 文件属性
                                        HANDLE hTemplateFile    // 用于复制文件句柄
                                        ){

                                                DWORD lpFunc=(DWORD)::CreateFileA+0x5;
                                                HANDLE result=NULL;
                                                __asm{
                                                        push hTemplateFile
                                                                push dwFlagsAndAttributes
                                                                push dwCreationDisposition
                                                                push lpSecurityAttributes
                                                                push dwShareMode
                                                                push dwDesiredAccess
                                                                push lpFileName
                                                                call labeltop
                                                                jmp labelend
labeltop:
                                                        mov eax,lpFunc
                                                                //头部被修改的部分修复
                                                                mov edi,edi
                                                                push ebp
                                                                mov ebp,esp
                                                                jmp eax
labelend:
                                                        mov result,eax
                                                }
                                                return result;

}



BOOL Executable(LPVOID lpAddress, DWORD dwSize)
{
        BOOL ret = TRUE;
        {
                DWORD count = (dwSize < 2 ? dwSize : 2);
                LPBYTE lpData[2] = {(LPBYTE)lpAddress, ((LPBYTE)lpAddress) + dwSize - 1};
                BYTE byOld = 0;
                while ((count) && (ret))
                {
                        count--;
                        byOld = *lpData[count];
                        *lpData[count] = 0xC3;
                        try
                        {
                                ((FARPROC)lpData[count])();
                        }
                        catch(...)
                        {
                                ret = FALSE;
                        }
                        *lpData[count] = byOld;
                }
        }
        if (!ret)
        {
                DWORD dwTemp = 0;
                ret = VirtualProtectAD(lpAddress, dwSize, PAGE_EXECUTE_READWRITE, &dwTemp);
        }
        return ret;
}

extern "C" BOOL WINAPI _DllMainCRTStartup(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved);

BOOL DllDetach(HMODULE hMod){
        DWORD dwSizeOfImage = ((IMAGE_NT_HEADERS32*)(((BYTE*)hMod) + ((IMAGE_DOS_HEADER*)hMod)->e_lfanew))->OptionalHeader.SizeOfImage;
        LPVOID lpTemp = VirtualAlloc(NULL, dwSizeOfImage, MEM_COMMIT, PAGE_READWRITE);                //分配内存用于保存Dll内容
        if (lpTemp)
        {
                memcpy(lpTemp, hMod, dwSizeOfImage);                //复制Dll内容
                DWORD* lpEntry = (DWORD*)(_DllMainCRTStartup);
                if (*(BYTE*)lpEntry == 0xE9){   //获得真正的DLLMAIN函数地址
                        ((BYTE*&)lpEntry) += (5 + *(DWORD*)(((BYTE*)lpEntry) + 1));
                }else if (*(BYTE*)lpEntry == 0xEB){
                        ((BYTE*&)lpEntry) += (2 + *(((char*)lpEntry) + 1));
                }
                DWORD dwOldProtect = 0;
                VirtualProtectAD(lpEntry, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect);
        lpEntry[0] = 0x000001B8;                //破坏Dll入口为直接返回1
                lpEntry[1] = 0x0012C200;

                char byExeCode[80];
                if (Executable(byExeCode, sizeof(byExeCode)))        //保证栈可执行
                {
                        DWORD dwSize = 0;
                        LPVOID lpExeCode = NULL;
                        _asm
                        {
                                lea edx, labelb
                                mov dword ptr[lpExeCode], edx
                                lea eax, labele
                                sub eax, edx
                                mov dword ptr[dwSize], eax
                                jmp labele
                        labelb:
                                push esi
                                push edi
                                mov esi, dword ptr[VirtualAlloc]
                                push dword ptr[esp + 12]
                                call dword ptr[FreeLibrary]
                                push PAGE_EXECUTE_READWRITE
                                push (MEM_COMMIT | MEM_RESERVE)
                                push dword ptr[esp + 28]
                                push dword ptr[esp + 24]
                                call esi
                                mov edi, dword ptr[esp + 12]
                                mov esi, dword ptr[esp + 16]
                                mov ecx, dword ptr[esp + 20]
                                mov edx, ecx
                                shr ecx, 2
                                rep movs dword ptr [edi],dword ptr [esi]
                                mov ecx, edx
                                and ecx, 3
                                rep movs byte ptr [edi],byte ptr [esi]
                                pop edi
                                pop esi
                                ret 12
                        labele:
                        }
                        //复制代码到栈上面
                        memcpy(byExeCode, lpExeCode, dwSize);
                        //执行代码,包括卸载DLL,分配DLL原空间内存,还原DLL内容等等,返回时,虽然DLL已经被卸载了,但内容还在,所以执行不会出问题
                        ((void (__stdcall*)(void*, void*, DWORD))&byExeCode)(hMod, lpTemp, dwSizeOfImage);
                        VirtualFree(lpTemp, 0, MEM_RELEASE);
                }
        }
        return FALSE;
}

郁金香外挂教程,学习中...
回复

使用道具 举报

发表于 2020-3-10 14:41:23 | 显示全部楼层
如果有喜欢学习游戏安全逆向的小伙伴可以加QQ:303718320
郁金香外挂教程,学习中...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

限时限量优惠

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2020-4-8 00:12 , Processed in 0.038560 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表