, 다음이 당신을 위해 잘 작동합니다 :
/// <summary>
/// Gets the base address of a process' module with the specified name.
/// </summary>
/// <param name="moduleName">Name of the module.</param>
/// <returns>The module BaseAddress if successful; otherwise, IntPtr.Zero.</returns>
public IntPtr GetModuleBaseAddress(string moduleName)
{
var module = Memory.Process.Modules.Cast<ProcessModule>().FirstOrDefault(m => m.ModuleName == moduleName);
return module != null ? module.BaseAddress : IntPtr.Zero;
}
을 Memory.Process 그냥 System.Diagnostics.Process
객체입니다. 실제 x64 프로세스에서 작동하는지는 확실치 않지만 32 비트 프로세스 (64 비트 플랫폼에서도)를 목표로 삼고있는 한이 코드는 프로세스 모듈의 기본 주소를 얻을 수 있습니다.
염두에 두어야 할 점은 ProcessModules
을 열거 할 때마다 호출 수신자 아키텍처 (x86 또는 x64)에있는 모델 만 가져올 수 있다는 것입니다. x86 프로세스를 실행 중이고 다른 프로세스에서 Process.Modules
을 호출하면 해당 프로세스의 x86 모듈 만 표시됩니다. x64에도 동일하게 적용됩니다. 이 문제를 해결하거나 x86 및 x64 용으로 프로젝트를 컴파일하고 각 응용 프로그램에 적합한 방법을 사용해야합니다.
편집 :
unsigned long ProcessDevice::getModuleAddress(DWORD proc, const char *modname)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, proc);
if(snapshot == INVALID_HANDLE_VALUE)
{
return 0;
}
MODULEENTRY32 mod;
mod.dwSize = sizeof(MODULEENTRY32);
if(Module32First(snapshot, &mod))
{
if(strcmp(mod.szModule, modname) == 0)
return (unsigned long)mod.modBaseAddr;
while(Module32Next(snapshot, &mod))
{
if(strcmp(mod.szModule, modname) == 0)
return (unsigned long)mod.modBaseAddr;
}
/* Failed to find the module */
return 0;
}
else
{
/* Failed to read any module info */
return 0;
}
}
"기본 주소"란 무엇입니까? –
모듈 핸들 ... –
질문을 더 명확하게해야합니다. 다른 프로세스를 조사하려고한다는 것은 언급하지 않았습니다. 'ProcessModuleCollection'는 x64에서 잘 작동하지만 예상되는 프로세스는 32 비트 WOW64 프로세스입니다. 아니면 다른 방향 일 수도 있습니다. 그럼 좀 더 자세히 설명해주세요. 질문을 편집하십시오. 외부 프로세스를 참조하는지 확인하십시오. 그리고 프로세스에 대해 알려주십시오. 그들은 둘 다 32 비트, 또는 둘 다 64 비트, 또는 혼합되어 있습니다. 그리고 혼합되면, 어떤 방법으로 라운드. 32 비트 에뮬레이터에서 64 비트 모듈을 쉽게 열거 할 수 없습니다. –