BlackBone
Windows memory hacking library
 All Classes Functions
ProcessModules.h
1 #pragma once
2 
3 #include "../Config.h"
4 #include "../Include/Winheaders.h"
5 #include "../PE/PEImage.h"
6 #include "../Misc/Utils.h"
7 
8 #include <string>
9 #include <map>
10 #include <unordered_map>
11 #include <algorithm>
12 
13 namespace std
14 {
15  template <>
16  struct hash < struct pair<wstring, blackbone::eModType> >
17  {
18  size_t operator()( const pair<wstring, blackbone::eModType>& value ) const
19  {
20  hash<wstring> sh;
21  return sh( value.first ) ^ value.second;
22  }
23  };
24 }
25 
26 
27 namespace blackbone
28 {
29 
30 struct exportData
31 {
32  ptr_t procAddress = 0; // Function address
33 
34  std::wstring forwardModule; // Name of forward module
35  std::string forwardName; // Forwarded function name
36  WORD forwardOrdinal = 0; // Forwarded function ordinal
37 
38  bool isForwarded = false; // Function is forwarded to another module
39  bool forwardByOrd = false; // Forward is done by ordinal
40 };
41 
43 {
44 public:
45  typedef std::unordered_map<std::pair<std::wstring, eModType>, ModuleData> mapModules;
46 
47 public:
48  BLACKBONE_API ProcessModules( class Process& proc );
49  BLACKBONE_API ~ProcessModules();
50 
58  BLACKBONE_API const ModuleData* GetModule(
59  const std::wstring& name,
60  eModSeachType search = LdrList,
61  eModType type = mt_default
62  );
63 
71  BLACKBONE_API const ModuleData* GetModule(
72  std::wstring& name,
73  eModSeachType search = LdrList,
74  eModType type = mt_default,
75  const wchar_t* baseModule = L""
76  );
77 
85  BLACKBONE_API const ModuleData* GetModule(
86  module_t modBase,
87  eModSeachType search = LdrList,
88  eModType type = mt_default
89  );
90 
95  BLACKBONE_API const ModuleData* GetMainModule();
96 
102  BLACKBONE_API const ProcessModules::mapModules& GetAllModules( eModSeachType search = LdrList );
103 
108  BLACKBONE_API void GetManualModules( ProcessModules::mapModules& mods );
109 
117  BLACKBONE_API exportData GetExport( const ModuleData* hMod, const char* name_ord, const wchar_t* baseModule = L"" );
118 
125  BLACKBONE_API const ModuleData* Inject( const std::wstring& path, NTSTATUS* pStatus = nullptr );
126 
127 #ifdef COMPILER_MSVC
128  BLACKBONE_API bool InjectPureIL(
138  const std::wstring& netVersion,
139  const std::wstring& netAssemblyPath,
140  const std::wstring& netAssemblyMethod,
141  const std::wstring& netAssemblyArgs,
142  DWORD& returnCode
143  );
144 #endif
145 
151  BLACKBONE_API bool Unload( const ModuleData* hMod );
152 
158  BLACKBONE_API bool Unlink( const ModuleData* mod );
159 
168  BLACKBONE_API const ModuleData* AddManualModule(
169  const std::wstring& FilePath,
170  module_t base,
171  size_t size,
172  eModType mt
173  );
174 
180  BLACKBONE_API void RemoveManualModule( const std::wstring& filename, eModType mt );
181 
187  BLACKBONE_API bool ValidateModule( module_t base );
188 
192  BLACKBONE_API void reset();
193 
194 private:
195  ProcessModules( const ProcessModules& ) = delete;
196  ProcessModules operator =(const ProcessModules&) = delete;
197 
198 private:
199  class Process& _proc;
200  class ProcessMemory& _memory;
201  class ProcessCore& _core;
202 
203  mapModules _modules; // Fast lookup cache
204  CriticalSection _modGuard; // Module guard
205  bool _ldrPatched; // Win7 loader patch flag
206 };
207 
208 };
BLACKBONE_API const ModuleData * AddManualModule(const std::wstring &FilePath, module_t base, size_t size, eModType mt)
Store manually mapped module in module list
Definition: ProcessModules.cpp:529
BLACKBONE_API bool Unload(const ModuleData *hMod)
Unload specific module from target process. Can't be used to unload manually mapped modules ...
Definition: ProcessModules.cpp:456
BLACKBONE_API void reset()
Reset local data
Definition: ProcessModules.cpp:875
BLACKBONE_API bool Unlink(const ModuleData *mod)
Unlink module from most loader structures
Definition: ProcessModules.cpp:496
Definition: ProcessModules.h:13
BLACKBONE_API void RemoveManualModule(const std::wstring &filename, eModType mt)
Remove module from module list
Definition: ProcessModules.cpp:551
Definition: ProcessMemory.h:13
Definition: Process.h:80
BLACKBONE_API const ModuleData * Inject(const std::wstring &path, NTSTATUS *pStatus=nullptr)
Inject image into target process
Definition: ProcessModules.cpp:360
Definition: ProcessModules.h:30
Definition: ProcessModules.h:42
BLACKBONE_API const ModuleData * GetMainModule()
Get process main module
Definition: ProcessModules.cpp:145
BLACKBONE_API bool ValidateModule(module_t base)
Ensure module is a valid PE image
Definition: ProcessModules.cpp:506
BLACKBONE_API const ModuleData * GetModule(const std::wstring &name, eModSeachType search=LdrList, eModType type=mt_default)
Get module by name
Definition: ProcessModules.cpp:44
std::mutex alternative
Definition: Utils.h:103
Definition: ProcessCore.h:13
BLACKBONE_API const ProcessModules::mapModules & GetAllModules(eModSeachType search=LdrList)
Enumerate all process modules
Definition: ProcessModules.cpp:172
BLACKBONE_API void GetManualModules(ProcessModules::mapModules &mods)
Get list of manually mapped modules
Definition: ProcessModules.cpp:212
Definition: AsmHelper32.cpp:6
BLACKBONE_API exportData GetExport(const ModuleData *hMod, const char *name_ord, const wchar_t *baseModule=L"")
Get export address. Forwarded exports will be automatically resolved if forward module is present ...
Definition: ProcessModules.cpp:228
Definition: Types.h:57