能力值:
( 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里面存放的就是加载基址了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
弄错楼主的意思了。。这个比较麻烦的。
如果C在B中的加载基址在A中没被占用,上面的方法应该是可以的。
如果占用了,就不记得了,好像要枚举进程加载模块吧
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
GetModuleHandle?
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
asm
call $+5
pop eax
@@:
dec eax
xor ax,ax
cmp [eax],'MZ'
jne @B
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
GetModuleHandle()获得的好像当前进程已经加载的DLL的基址。
对于远程进程的好像不行。
我用LoadLibrary()的想法是基于操作系统能不重定位dll就尽量不重定位这个一般事实。
|
能力值:
( 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.没有异常处理,如果遇到了未划分的内存就挂了
内存访问出错截图
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
还有一个问题
cmp [eax],'MZ'默认是DWORD,要强制为WORD
cmp WORD ptr ds:[eax],'MZ'
不然编译不通过。MASM6.0
|
能力值:
( LV8,RANK:130 )
|
-
-
9 楼
读一下PEB就是了
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
LS的意思是调试目标进程,然后ReadProcessMemory()?
LZ要的是读取另一个进程的DLL加载基址
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
读PEB不用调试目标进程啊?
ZwQueryInformationProcess得到PebBaseAddress,然后读Ldr
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
感谢几位的指点,可能没有各位大牛想的那么复杂,是小弟我表述的不太清楚。我用VB的GetModuleHandle获得Main.DLL的内存地址的时候,总是返回0,而我在CE里面直接输入Main.DLL的文件名,则可以获得正确的内存地址。想请教各位大牛在VB中如何获得这个内存地址。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我也想知道这个问题,顶起,让高手来帮个忙
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
Toolhelp32 Module32First Module32Next
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
写个dll文件,把dll插到目标进程中 在dll中用GetModuleHandle这个api来获取就可以
|
能力值:
( 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;
}
|
|
|