Skip to content

Commit f770550

Browse files
committed
Merge branch 'Unc3nZureD-master'
2 parents 32e5bb6 + 7a2f7b2 commit f770550

File tree

4 files changed

+55
-16
lines changed

4 files changed

+55
-16
lines changed

src/BlackBone/ManualMap/MMap.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,12 @@ call_result_t<ModuleDataPtr> MMap::MapImageInternal(
9292
CustomArgs_t* pCustomArgs /*= nullptr*/
9393
)
9494
{
95-
// Already loaded
96-
if (auto hMod = _process.modules().GetModule( path ))
97-
return hMod;
95+
if (!(flags & ForceRemap))
96+
{
97+
// Already loaded
98+
if (auto hMod = _process.modules().GetModule(path))
99+
return hMod;
100+
}
98101

99102
// Prepare target process
100103
auto mode = (flags & NoThreads) ? Worker_UseExisting : Worker_CreateNew;
@@ -293,11 +296,14 @@ call_result_t<ModuleDataPtr> MMap::FindOrMapModule(
293296
return status;
294297
}
295298

296-
// Check if already loaded
297-
if (auto hMod = _process.modules().GetModule( path, LdrList, pImage->peImage.mType() ))
299+
// Check if already loaded, but only if doesn't explicitly excluded
300+
if (!(flags & ForceRemap))
298301
{
299-
pImage->peImage.Release();
300-
return hMod;
302+
if (auto hMod = _process.modules().GetModule( path, LdrList, pImage->peImage.mType() ))
303+
{
304+
pImage->peImage.Release();
305+
return hMod;
306+
}
301307
}
302308

303309
// Check architecture
@@ -402,8 +408,14 @@ call_result_t<ModuleDataPtr> MMap::FindOrMapModule(
402408
}
403409

404410
auto mt = ldrEntry.type;
405-
auto pMod = _process.modules().AddManualModule( static_cast<ModuleData&>(ldrEntry) );
406-
{
411+
ModuleDataPtr pMod;
412+
413+
if (flags & ForceRemap)
414+
pMod = std::make_shared<const ModuleData>( _process.modules().Canonicalize( ldrEntry, true ) );
415+
else
416+
pMod = _process.modules().AddManualModule( ldrEntry );
417+
418+
{
407419
// Handle x64 system32 dlls for wow64 process
408420
bool fsRedirect = !(flags & IsDependency) && mt == mt_mod64 && _process.barrier().sourceWow64;
409421

src/BlackBone/ManualMap/MMap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ enum eLoadFlags
100100
MapInHighMem = 0x20, // Try to map image in address space beyond 4GB limit
101101
RebaseProcess = 0x40, // If target image is an .exe file, process base address will be replaced with mapped module value
102102
NoThreads = 0x80, // Don't create new threads, use hijacking
103+
ForceRemap = 0x100, // Force remapping module even if it's already loaded
103104

104105
NoExceptions = 0x01000, // Do not create custom exception handler
105106
PartialExcept = 0x02000, // Only create Inverted function table, without VEH

src/BlackBone/Process/ProcessModules.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -581,14 +581,32 @@ bool ProcessModules::ValidateModule( module_t base )
581581
/// </summary>
582582
/// <param name="mod">Module data</param>
583583
/// <returns>Module info</returns>
584-
ModuleDataPtr ProcessModules::AddManualModule( ModuleData mod )
584+
ModuleDataPtr ProcessModules::AddManualModule( const ModuleData& mod )
585585
{
586-
mod.fullPath = Utils::ToLower( std::move( mod.fullPath ) );
587-
mod.name = Utils::ToLower( std::move( mod.name ) );
588-
mod.manual = true;
586+
auto canonicalized = Canonicalize( mod, true );
587+
auto key = std::make_pair( canonicalized.name, canonicalized.type );
588+
return _modules.emplace( key, std::make_shared<const ModuleData>( canonicalized ) ).first->second;
589+
}
590+
591+
/// <summary>
592+
/// Canonicalize paths and set module type to manual if requested
593+
/// </summary>
594+
/// <param name="mod">Module data</param>
595+
/// <param name="manual">Value to set ModuleData::manual to</param>
596+
/// <returns>Module data</returns>
597+
ModuleData ProcessModules::Canonicalize( const ModuleData& mod, bool manual )
598+
{
599+
ModuleData result = {};
600+
601+
result.baseAddress = mod.baseAddress;
602+
result.ldrPtr = mod.ldrPtr;
603+
result.size = mod.size;
604+
result.type = mod.type;
605+
result.fullPath = Utils::ToLower( mod.fullPath );
606+
result.name = Utils::ToLower( mod.name );
607+
result.manual = manual;
589608

590-
auto key = std::make_pair( mod.name, mod.type );
591-
return _modules.emplace( key, std::make_shared<const ModuleData>( mod ) ).first->second;
609+
return result;
592610
}
593611

594612
/// <summary>

src/BlackBone/Process/ProcessModules.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,15 @@ class ProcessModules
206206
/// </summary>
207207
/// <param name="mod">Module data</param>
208208
/// <returns>Module info</returns>
209-
BLACKBONE_API ModuleDataPtr AddManualModule( ModuleData mod );
209+
BLACKBONE_API ModuleDataPtr AddManualModule( const ModuleData& mod );
210+
211+
/// <summary>
212+
/// Canonicalize paths and set module type to manual if requested
213+
/// </summary>
214+
/// <param name="mod">Module data</param>
215+
/// <param name="manual">Value to set ModuleData::manual to</param>
216+
/// <returns>Module data</returns>
217+
BLACKBONE_API ModuleData Canonicalize( const ModuleData& mod, bool manual );
210218

211219
/// <summary>
212220
/// Remove module from module list

0 commit comments

Comments
 (0)