| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		paul44 Expert Cheater
  Reputation: 2
  Joined: 20 Jul 2017 Posts: 206
 
  | 
		
			
				 Posted: Sat Aug 24, 2024 2:52 am    Post subject: Collect/Identify memory Protectionflags [Solved] | 
				       | 
			 
			
				
  | 
			 
			
				Table @FRF: "fearless rev Collecting Memory Regions" (Tools section)
 
 
 
images here: [ https://ibb.co/album/bRVwYY ] (pic_order not quite in par)
 
 
I'm currently working on an asm scanner, which allows me to find asm opcode while filtering on 'static addrs, structaddr & structname'.
 
Apart from the obvious ptr_checks,i'm getting far more issues now when trying to inmplement the structaddr part.
 
 
Practically, i'm "only" interested in opcode_hits here. Iow "Read Exec".
 
(there are games where opcode_flag can be writatble actually ~ usually game dlls) 
 
 
=> Q: is it possible to find out what the protectionflags are of a particular memory_address (page ?); lua-wise t.i. ?
 
 
ps: initially i was using 'getInstructionSize(addrOpcode)' to get the number of bytes, but that gave me them errors? "Calculating" ( string.gsub(string.match(sASM,"- (.-)- "), "%s+", "") )them does not seem to cause this issue, but i'm not holding my breath on that one...
 
ps2: I also thought about doing an aobscan w/protectionflags set as such to identify protect_status, but i feel this is overkill (not to mention the performance hit)
  Last edited by paul44 on Wed Sep 04, 2024 12:19 pm; edited 2 times in total | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		ParkourPenguin I post too much
  Reputation: 152
  Joined: 06 Jul 2014 Posts: 4706
 
  | 
		
			
				 Posted: Sat Aug 24, 2024 9:35 am    Post subject:  | 
				       | 
			 
			
				
  | 
			 
			
				 	  | paul44 wrote: | 	 		  | => Q: is it possible to find out what the protectionflags are of a particular memory_address (page ?); lua-wise t.i. ? | 	  There's `enumMemoryRegions`
 
 	  | Code: | 	 		  function do_work()
 
  local memregions = enumMemoryRegions()
 
 
  -- https://learn.microsoft.com/en-us/windows/win32/memory/memory-protection-constants
 
  local function get_protect(addr)
 
    addr = getAddressSafe(addr)
 
    if not addr then return nil, 'Invalid address' end
 
 
    for _,t in ipairs(memregions) do
 
      if t.BaseAddress <= addr and addr < t.BaseAddress + t.RegionSize then
 
        return t.Protect
 
      end
 
    end
 
 
    return nil, 'Invalid address'
 
  end
 
 
  assert(get_protect(0) == 1) -- PAGE_NOACCESS
 
end
 
 
do_work() | 	  
 _________________
 I don't know where I'm going, but I'll figure it out when I get there.  | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		paul44 Expert Cheater
  Reputation: 2
  Joined: 20 Jul 2017 Posts: 206
 
  | 
		
			
				 Posted: Wed Aug 28, 2024 4:48 am    Post subject: i will need some time to detail... | 
				       | 
			 
			
				
  | 
			 
			
				thx, tried out your script and provides proper info: [ https://ibb.co/sRpT7C6 ]
 
 
I'll need to look into how to interpret them bits here; surely based on that referenced page...
 
 that said: do you happen to know if one can collect the modulename, based on  - in this case - 'BaseAddress' ?
 
 
Reason: 2 things i miss in this overview:
 
a. quick jump to selected address
 
b. copy/paste of part/all regions
 
 
=> did a quick celua scan, and got: enumRegisteredSymbolLists() & getModuleList() ?
 
Need to try this, plus getting the feeling it only produces the game's modulelist...
 
 
-EDIT-
 
I will take some time to work this out the way i entend, so putting 'in progress'...
  Last edited by paul44 on Sat Aug 31, 2024 4:10 am; edited 2 times in total | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		ParkourPenguin I post too much
  Reputation: 152
  Joined: 06 Jul 2014 Posts: 4706
 
  | 
		
			
				 Posted: Wed Aug 28, 2024 9:47 am    Post subject:  | 
				       | 
			 
			
				
  | 
			 
			
				I'd do `enumModules` to get the name and base address, then `getModuleSize` to get the max size of each module.
 
The algorithm is very similar to my previous code in the `get_protect` function.
 _________________
 I don't know where I'm going, but I'll figure it out when I get there.  | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		paul44 Expert Cheater
  Reputation: 2
  Joined: 20 Jul 2017 Posts: 206
 
  | 
		
			
				 Posted: Sun Sep 01, 2024 9:06 am    Post subject: Finished... | 
				       | 
			 
			
				
  | 
			 
			
				see image: [ https://ibb.co/3M6RSq7 ]
 
 
I will be uploading this table some time later this week @FRF, and update this post with appropriate link. If you'd like to discuss things, do via that site...
 
 
@ParkourPenguin: as always, feedback is/was much appreciated.
 
 
-EDIT-
 
A minor hickup: in order to "place" oneself a bit below the top, i do:
 
      oMemDis.TopAddress = process
 
      oMemDis.SelectedAddress = addrItem + 0x15
 
 
However: most of the time, this does not work (meaning, you still wind up at the top of disassembler view). And if i move 'topaddress' after 'selectedaddr' then it jumps to start of memory ?!
 | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		 |