parent
f06bf5f6b7
commit
fb59f8f58f
@ -0,0 +1,27 @@
|
||||
#include <nt/image.hpp>
|
||||
|
||||
/// <summary>
|
||||
/// small namespace that contains function wrappers to determine the validity of linear virtual addresses...
|
||||
/// </summary>
|
||||
namespace scn
|
||||
{
|
||||
/// <summary>
|
||||
/// determines if a pointer lands inside of a section that is readonly...
|
||||
///
|
||||
/// this also checks to make sure the section is not discardable...
|
||||
/// </summary>
|
||||
/// <param name="module_base">linear virtual address of the module....</param>
|
||||
/// <param name="ptr">linear virtual address</param>
|
||||
/// <returns>returns true if ptr lands inside of a readonly section of the module</returns>
|
||||
bool read_only( std::uint64_t module_base, std::uint64_t ptr );
|
||||
|
||||
/// <summary>
|
||||
/// determines if a pointer lands inside of a section that is executable...
|
||||
///
|
||||
/// this also checks to make sure the section is not discardable...
|
||||
/// </summary>
|
||||
/// <param name="module_base"></param>
|
||||
/// <param name="ptr"></param>
|
||||
/// <returns></returns>
|
||||
bool executable( std::uint64_t module_base, std::uint64_t ptr );
|
||||
} // namespace scn
|
@ -0,0 +1,34 @@
|
||||
#include <scn.hpp>
|
||||
|
||||
namespace scn
|
||||
{
|
||||
bool read_only( std::uint64_t module_base, std::uint64_t ptr )
|
||||
{
|
||||
auto win_image = reinterpret_cast< win::image_t<> * >( module_base );
|
||||
auto section_count = win_image->get_file_header()->num_sections;
|
||||
auto sections = win_image->get_nt_headers()->get_sections();
|
||||
|
||||
for ( auto idx = 0u; idx < section_count; ++idx )
|
||||
if ( ptr >= sections[ idx ].virtual_address + module_base &&
|
||||
ptr < sections[ idx ].virtual_address + sections[ idx ].virtual_size + module_base )
|
||||
return !( sections[ idx ].characteristics.mem_discardable ) &&
|
||||
!( sections[ idx ].characteristics.mem_write );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool executable( std::uint64_t module_base, std::uint64_t ptr )
|
||||
{
|
||||
auto win_image = reinterpret_cast< win::image_t<> * >( module_base );
|
||||
auto section_count = win_image->get_file_header()->num_sections;
|
||||
auto sections = win_image->get_nt_headers()->get_sections();
|
||||
|
||||
for ( auto idx = 0u; idx < section_count; ++idx )
|
||||
if ( ptr >= sections[ idx ].virtual_address + module_base &&
|
||||
ptr < sections[ idx ].virtual_address + sections[ idx ].virtual_size + module_base )
|
||||
return !( sections[ idx ].characteristics.mem_discardable ) &&
|
||||
sections[ idx ].characteristics.mem_execute;
|
||||
|
||||
return false;
|
||||
}
|
||||
} // namespace scn
|
Loading…
Reference in new issue