@@ -146,6 +146,8 @@ pub fn inject(
146146 var page = shim .buildScratchPage (so_path , payload_path , type_name , method_name , dlopen_addr , dlsym_addr , pthread_create_addr , pthread_detach_addr , scratch , self_pid );
147147 try ptrace_mod .writeMemory (victim , scratch , & page );
148148
149+ try bootstrapMprotect (victim , saved , scratch + shim .CodePageOff , shim .ScratchSize - shim .CodePageOff , PROT_READ | PROT_EXEC );
150+
149151 try runVictimShim (victim , saved , scratch + shim .VictimShimOff );
150152
151153 try ptrace_mod .setRegs (victim , saved );
@@ -161,7 +163,7 @@ pub fn inject(
161163
162164fn bootstrapMmap (pid : i32 , saved : UserRegsStruct ) ! usize {
163165 var regs = saved ;
164- arch .setupMmapRegs (& regs , shim .ScratchSize , PROT_READ | PROT_WRITE | PROT_EXEC , MAP_PRIVATE | MAP_ANONYMOUS );
166+ arch .setupMmapRegs (& regs , shim .ScratchSize , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS );
165167
166168 try ptrace_mod .setRegs (pid , regs );
167169 try continueAndWait (pid , ptrace_mod .PTRACE_SYSCALL , "mmap-enter" );
@@ -175,6 +177,20 @@ fn bootstrapMmap(pid: i32, saved: UserRegsStruct) !usize {
175177 return @intCast (ret );
176178}
177179
180+ fn bootstrapMprotect (pid : i32 , saved : UserRegsStruct , addr : usize , len : usize , prot : u64 ) ! void {
181+ var regs = saved ;
182+ arch .setupMprotectRegs (& regs , @intCast (addr ), @intCast (len ), prot );
183+
184+ try ptrace_mod .setRegs (pid , regs );
185+ try continueAndWait (pid , ptrace_mod .PTRACE_SYSCALL , "mprotect-enter" );
186+ try continueAndWait (pid , ptrace_mod .PTRACE_SYSCALL , "mprotect-exit" );
187+
188+ const after = try ptrace_mod .getRegs (pid );
189+ const ret : i64 = @bitCast (arch .getSyscallResult (after ));
190+ if (ret < 0 and ret > -4096 )
191+ return error .MprotectInTargetFailed ;
192+ }
193+
178194fn runVictimShim (pid : i32 , saved : UserRegsStruct , shim_addr : usize ) ! void {
179195 var regs = saved ;
180196 arch .setupShimRegs (& regs , shim_addr );
0 commit comments