首页
社区
课程
招聘
[原创]修改已加载DLL的模块名和路径
发表于: 2008-7-31 16:48 21450

[原创]修改已加载DLL的模块名和路径

2008-7-31 16:48
21450

标 题: 【原创】修改已加载DLL的模块名和路径
作 者: achillis
时 间: 2008-07-31,16:50
链 接: http://bbs.pediy.com/showthread.php?t=69730

简单说就是修改PEB中的内容,从修改PEB中的进程路径想到的,纯属小玩意儿,大牛牛飘过~

首先说说从PEB中获取已加载的模块信息,这个不清楚的可以参考下面这篇文章:
http://bbs.pediy.com/showthread.php?t=59932

里面讲得很清楚了,实在好文,我不再多说哈
在获取到每一个模块的信息时,需要用到以下结构:
typedef struct _LDR_MODULE
{
LIST_ENTRY          InLoadOrderModuleList;
LIST_ENTRY          InMemoryOrderModuleList;
LIST_ENTRY          InInitializationOrderModuleList;
void*               BaseAddress;
void*               EntryPoint;   
ULONG               SizeOfImage;
UNICODE_STRING    FullDllName; //全路径
UNICODE_STRING      BaseDllName; //模块名称
ULONG               Flags;
SHORT               LoadCount;
SHORT               TlsIndex;
HANDLE              SectionHandle;
ULONG               CheckSum;
ULONG               TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE

加红的两项就是我们要修改的内容了.用代码说话:
#include <windows.h>
#include <stdio.h>

typedef struct _UNICODE_STRING
{
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _PEB_LDR_DATA
{
        ULONG Length;
        BOOLEAN Initialized;
        PVOID SsHandle;
        LIST_ENTRY InLoadOrderModuleList;
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA,*PPEB_LDR_DATA;

typedef struct _LDR_MODULE
{
        LIST_ENTRY          InLoadOrderModuleList;
        LIST_ENTRY          InMemoryOrderModuleList;  
        LIST_ENTRY          InInitializationOrderModuleList;
        void*               BaseAddress;  
        void*               EntryPoint;   
        ULONG               SizeOfImage;
        UNICODE_STRING                FullDllName;
        UNICODE_STRING      BaseDllName;
        ULONG               Flags;
        SHORT               LoadCount;
        SHORT               TlsIndex;
        HANDLE              SectionHandle;
        ULONG               CheckSum;
        ULONG               TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

int main(int argc, char* argv[])
{
        PEB_LDR_DATA *pPEBLDR;
        LDR_MODULE *pLdrMod;
        LIST_ENTRY *pListEntry,*pStart;
        DWORD dwKernelBase;
        PWSTR fakemodulename=L"假名字啊";
        PWSTR fakemodulepath=L"这是假路径,看能骗到谁";
        _asm
        {
                        mov eax,fs:[0x30] //TEB->PEB
                        mov eax,[eax+0xC] //PEB->Ldr
                        mov pPEBLDR,eax
        }
        printf("准备改名字了...\n");
        dwKernelBase=(DWORD)GetModuleHandle("kernel32.dll");
        printf("Base of kernel32.dll is 0x%08x\n",dwKernelBase);
        pStart=pListEntry=(LIST_ENTRY*)(PUCHAR)&(pPEBLDR->InLoadOrderModuleList);
        do
        {
                pListEntry=pListEntry->Flink;
                pLdrMod=(LDR_MODULE*)(pListEntry);
                if ((DWORD)pLdrMod->BaseAddress==dwKernelBase)
                {
                        printf("Found kernel32.dll...");
                        lstrcpyW(pLdrMod->BaseDllName.Buffer,fakemodulename);
                        lstrcpyW(pLdrMod->FullDllName.Buffer,fakemodulepath);
                        printf("Change OK.\n");
                        break;
                }
               
        } while(pListEntry!=pStart);
        printf("现在你可以用工具来看看本进程的模块列表\n");
        while (1)
        {
                Sleep(1000);
        }
        return 0;
}

不喜欢结构的可以自己用偏移代替~~
附效果图,修改了user32.dll的,(用RKU查看的):


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
不错不错
2008-7-31 17:17
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
ZwQueryXXX就出来真名了~~
2008-7-31 17:30
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
老V现身了~
2008-7-31 17:48
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
恩,骗了好多工具,就是过不了IS的ZwQueryVXXX
2008-7-31 17:49
0
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
不错不错
2008-7-31 19:06
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
谢谢分享,喜欢这样有摸索精神的小朋友
2008-7-31 21:31
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
大米觉得我的代码风格怎么样?
2008-7-31 22:44
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
我已经做到这一点了额~~~答案是VAD。呵呵

我弄出了XP的~Sysnap大牛弄出了2K3的。

2008-7-31 23:26
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
lkd> dt _EPROCESS
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   ...
   +0x11c VadRoot          : Ptr32 Void
   +0x120 VadHint          : Ptr32 Void


是这个吗?好像是二叉树?
2008-8-1 00:01
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
嗯是的。

可以隐藏,也可以修改。

http://bbs.pediy.com/showthread.php?t=66886
2008-8-1 10:04
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
以后看啊先标记一下
2008-8-1 11:05
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
13
没想过要隐藏DLL,学习了...
2008-8-1 20:58
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不知道LZ有没试过在ring0下改其它进程的PEB,是行不通的。
2008-8-8 20:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个方法好像不错!
2008-8-8 22:47
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
还没试过,为什么行不通?
KeAttachProcess/KeStackAttackProcess切换到指定进程,然后修改不行吗?
2008-8-9 00:21
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
KeAttachProcess以后,
__asm{
mov eax,fs:[0x124] //ETHREAD
mov eax, [eax+44] //EPROCESS
mov eax, [eax+0x1B0]//peb
mov peb, eax
}
我随便写得,你试一下,我当初也是想KeAttachProcess/KeStackAttackProcess切换到指定进程,然后挂了。。这种方法连PEB都读不出

不用这种方法,直接PsLookupProces**yProcessId得到EPROCESS,然后找PEB,
这种方法可以读出PEB,但是在想读ldr就挂了,不解中。。。。。。
郁闷,等待高手解惑ing......        
http://hi.baidu.com/hljleo/blog/item/838cce082a2b2436e92488d9.html
去看看这篇文章和评论。
2008-8-9 02:19
0
雪    币: 257
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
好!
合影留念
2008-8-22 01:46
0
雪    币: 223
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
正在找这个,谢谢!
2009-5-19 20:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
IceSword 过不了,其他没测试
2009-6-1 10:33
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
21
说了过不了IS的,能没有就没有,不能没有的就藏之,藏不了就伪装~
2009-6-1 11:13
0
雪    币: 983
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不错 学习学习 谢了先
2009-6-1 13:19
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
如果能在创建子进程的时候,动态修改子进程加载的DLL为指定的DLL就更完美了,,当然是同名的替换
2009-6-28 08:12
0
游客
登录 | 注册 方可回帖
返回
//