首页
社区
课程
招聘
[求助]VB如何获得dll的基址
发表于: 2009-1-1 13:13 7622

[求助]VB如何获得dll的基址

2009-1-1 13:13
7622
某程序B.exe带一个C.dll,现在我想在A.exe中写代码得到C.dll的基址,用VB该怎么实现?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Dim CBase as long
CBase=LoadLibrary("c.dll")
CBase里面存放的就是加载基址了
2009-1-1 14:32
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
弄错楼主的意思了。。这个比较麻烦的。
如果C在B中的加载基址在A中没被占用,上面的方法应该是可以的。
如果占用了,就不记得了,好像要枚举进程加载模块吧
2009-1-1 14:34
0
雪    币: 371
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyp
4
GetModuleHandle?
2009-1-1 16:21
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
asm
call $+5
pop eax
@@:
dec eax
xor ax,ax
cmp [eax],'MZ'
jne @B
2009-1-1 17:47
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
GetModuleHandle()获得的好像当前进程已经加载的DLL的基址。
对于远程进程的好像不行。

我用LoadLibrary()的想法是基于操作系统能不重定位dll就尽量不重定位这个一般事实。
2009-1-1 23:12
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=洋洋洒洒;559486]asm
call $+5
pop eax
@@:
dec eax
xor ax,ax
cmp [eax],'MZ'
jne @B[/QUOTE]

这段代码肯定是只能获取当前进程的DLL或者EXE的。
而且有两个问题。
1.是冲当前位置开始向前找,那么找到的第一个“MZ”应该是可执行文件的MZ标记而不是DLL的
2.没有异常处理,如果遇到了未划分的内存就挂了


内存访问出错截图
上传的附件:
2009-1-1 23:39
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还有一个问题
cmp [eax],'MZ'默认是DWORD,要强制为WORD
cmp WORD ptr ds:[eax],'MZ'
不然编译不通过。MASM6.0
2009-1-1 23:40
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
读一下PEB就是了
2009-1-2 12:03
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
LS的意思是调试目标进程,然后ReadProcessMemory()?
LZ要的是读取另一个进程的DLL加载基址
2009-1-2 14:07
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
读PEB不用调试目标进程啊?
ZwQueryInformationProcess得到PebBaseAddress,然后读Ldr
2009-1-2 14:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢几位的指点,可能没有各位大牛想的那么复杂,是小弟我表述的不太清楚。我用VB的GetModuleHandle获得Main.DLL的内存地址的时候,总是返回0,而我在CE里面直接输入Main.DLL的文件名,则可以获得正确的内存地址。想请教各位大牛在VB中如何获得这个内存地址。
2009-1-2 14:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我也想知道这个问题,顶起,让高手来帮个忙
2009-3-18 11:34
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX
14
Toolhelp32  Module32First Module32Next
2009-3-18 11:40
0
雪    币: 204
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
写个dll文件,把dll插到目标进程中 在dll中用GetModuleHandle这个api来获取就可以
2009-3-19 00:58
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
DWORD EnumProcesses(char *ProcessPid,char *Name)
{
	CString output;
	HANDLE            hToken;
	TOKEN_PRIVILEGES  TokenPrivileges;

	if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
	{
				
		//output.Format("OpenProcessToken Error: %d\n",GetLastError());
		//::OutputDebugString(output);
		exit(0);
	}
	TokenPrivileges.PrivilegeCount           = 1;
	TokenPrivileges.Privileges[0].Attributes = TRUE;
	LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
	AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
	if(GetLastError() != ERROR_SUCCESS)
	{
	  //output.Format("AdjustTokenPrivileges Error: %d\n",GetLastError());
	  //::OutputDebugString(output);
			exit(0);
	}
	CloseHandle(hToken);
	

	HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,atoi(ProcessPid));
	if (hModuleSnap == INVALID_HANDLE_VALUE) 
	{
	  ::OutputDebugString("初始化错误,不支持该进程模块枚举\n"); 
	}

	MODULEENTRY32   ModuleEntry32;
	ModuleEntry32.dwSize = sizeof(MODULEENTRY32); 
	if(Module32First(hModuleSnap, &ModuleEntry32)) 
	{ 
		while (Module32Next(hModuleSnap, &ModuleEntry32))
		{    
			SHFILEINFO sfi;
			int nFlag;
			nFlag=SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_ICON| SHGFI_SMALLICON;
			if (SHGetFileInfo (ModuleEntry32.szExePath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO),nFlag))
			{
				CString Filename,checkname;
				Filename=ModuleEntry32.szExePath;
				Filename.MakeUpper();
				checkname=Name;
				checkname.MakeUpper();
				//output.Format("dll文件地址: %s\r\n",ModuleEntry32.szExePath);
				if(Filename.Find(checkname,0)>0)
				{
					return (DWORD)ModuleEntry32.modBaseAddr;
				}
				//::OutputDebugString(output);
				//output.Format("模块地址: 0X%X\r\n",ModuleEntry32.modBaseAddr);
				//::OutputDebugString(output);
				
				//output.Format("内存使用大小: %dK\r\n",ModuleEntry32.modBaseSize/1024);
				//::OutputDebugString(output);
				//output.Format("***********************************\n");
				//::OutputDebugString(output);			
			}

	   }
	}
  return 0;
}
2009-3-19 01:32
0
游客
登录 | 注册 方可回帖
返回
//