




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用ptrace向已运行进程中注入.so并执行相关函数1. 简介2. 如何让目标进程执行dlopen加载so3. 加载so的实现代码4. 如何把加载so的实现代码写入目标进程并启动执行1. 在目标进程中找到存放加载so的实现代码的空间2. 为加载so的实现代码中的全局变量赋值5. 把汇编代码写入目标进程并执行的实现代码1. 主函数 writecode_to_targetproc2. attach目标进程ptrace_attach3. 获取目标进程寄存器值ptrace_getregs4. 获取目标进程中指定模块中指定函数的地址get_remote_addr5. 在目标进程中执行指定函数ptrace_call6. 把代码写入目标进程指定地址ptrace_writedata7. 设置目标进程寄存器ptrace_setregs8. detach目标进程ptrace_detach6. 需要被加载的so1. 替换函数replaceFunc2. 新函数及其它函数1. 简介 使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link到已运行进程(以下简称为:目标进程)空间中,从而.so中的函数在目标进程空间中有对应的地址,然后通过此地址便可在目标进程中进行调用。 到底是如何注入的呢? 本文实现方案为:在目标进程中,通过dlopen把需要注入的.so加载到目标进程的空间中。2. 如何让目标进程执行dlopen加载.so? 显然,目标进程本来是没有实现通过dlopen来加载我们想注入的.so,为了实现此功能,我们需要目标进程执行一段我们实现的代码,此段代码的功能为通过dlopen来加载一个.so。3. 【加载.so的实现代码】 加载需要注入的.so的实现代码如下所示: cppview plaincopy1. .global_dlopen_addr_sdlopen函数在目标进程中的地址注:以下全局变化在C中可读写2. .global_dlopen_param1_sdlopen参数1在目标进程中的地址3. .global_dlopen_param2_sdlopen参数2在目标进程中的地址4. 5. .global_dlsym_addr_sdlsym函数在目标进程中的地址6. .global_dlsym_param2_sdlsym参数2在目标进程中的地址,其实为函数名7. 8. .global_dlclose_addr_sdlcose在目标进程中的地址9. 10. .global_inject_start_s汇编代码段的起始地址11. .global_inject_end_s汇编代码段的结束地址12. 13. .global_inject_function_param_shook_init参数在目标进程中的地址14. 15. .global_saved_cpsr_s保存CPSR,以便执行完hook_init之后恢复环境16. .global_saved_r0_pc_s保存r0-r15,以便执行完hook_init之后恢复环境17. 18. 19. .data20. 21. _inject_start_s:22. debugloop23. 3:24. subr1,r1,#025. B3b26. 27. dlopen28. ldrr1,_dlopen_param2_s设置dlopen第二个参数,flag29. ldrr0,_dlopen_param1_s设置dlopen第一个参数.so30. ldrr3,_dlopen_addr_s设置dlopen函数31. blxr3执行dlopen函数,返回值位于r0中32. subsr4,r0,#0把dlopen的返回值soinfo保存在r4中,以方便后面dlclose使用33. beq2f34. 35. dlsym36. ldrr1,_dlsym_param2_s设置dlsym第二个参数,第一个参数已经在r0中了37. ldrr3,_dlsym_addr_s设置dlsym函数38. blxr3执行dlsym函数,返回值位于r0中39. subsr3,r0,#0把返回值保存在r3中40. beq1f41. 42. callourfunction43. ldrr0,_inject_function_param_s设置hook_init第一个参数44. blxr3执行hook_init45. subsr0,r0,#046. beq2f47. 48. 1:49. dlclose50. movr0,r4把dlopen的返回值设为dlcose的第一个参数51. ldrr3,_dlclose_addr_s设置dlclose函数52. blxr3执行dlclose函数53. 54. 2:55. restorecontext56. ldrr1,_saved_cpsr_s恢复CPSR57. msrcpsr_cf,r158. ldrsp,_saved_r0_pc_s恢复寄存器r0-r1559. ldmfdsp,r0-pc60. 61. 62. 63. 64. _dlopen_addr_s:初始化_dlopen_addr_s65. .word0x1111111166. 67. _dlopen_param1_s:68. .word0x1111111169. 70. _dlopen_param2_s:71. .word0x2RTLD_GLOBAL72. 73. _dlsym_addr_s:74. .word0x1111111175. 76. _dlsym_param2_s:77. .word0x1111111178. 79. _dlclose_addr_s:80. .word0x1111111181. 82. _inject_function_param_s:83. .word0x1111111184. 85. _saved_cpsr_s:86. .word0x1111111187. 88. _saved_r0_pc_s:89. .word0x1111111190. 91. 92. _inject_end_s:代码结束地址93. 94. .space0x400,0代码段空间大小95. 96. .end4. 如何把【加载.so的实现代码】写入目标进程并启动执行? 为了把【加载.so的实现代码】写入目标进程,主要有以下两步操作: 1) 在目标进程中找到存放【加载.so的实现代码】的空间(通过mmap实现) 2) 把【加载.so的实现代码】写入目标进程指定的空间 3) 启动执行4.1 在目标进程中找到存放【加载.so的实现代码】的空间 通过mmap来实现,其实现步骤如下: 1) 获取目标进程中mmap地址 2) 把mmap参数据放入r0-r3,另外两个写入目标进程sp 3) pc设置为mmap地址,lr设置为0 4) 把准备好的寄存器写入目标进程(PTRACE_SETREGS),并启动目标进程运行(PTRACE_CONT) 5) 分配的内存首地址位于r0(PTRACE_GETREGS)4.2 为【加载.so的实现代码】中的全局变量赋值 1) 获取目标进程中dlopen地址并赋值给_dlopen_addr_s 2) 获取目标进程中dlsym地址并赋值给_dlsym_addr_s 3) 获取目标进程中dlclose地址并赋值给_dlclose_addr_s 4) 把需要加载的.so的路径放入 汇编代码中,并获取此路径在目标进程中的地址然后赋值给_dlopen_param1_s 5)把需要加载的.so中的hook_init放入 汇编代码中,并获取此路径在目标进程中的地址然后赋值给_dlsym_param2_s 6) 把目标进程中的cpsr保存在_saved_cpsr_s中 7) 把目标进程中的r0-r15存入汇编代码中,并获取此变量在目标进程中的地址然后赋值给_saved_r0_pc_s 8) 通过ptrace( PTRACE_POKETEXT,.)把汇编代码写入目标进程中,起始地址由前面的mmap所分配 9) 把目标进程的pc设置为汇编代码的起始地址,然后调用ptrace(PTRACE_DETACH,.)以启动目标进程执行5. 把汇编代码写入目标进程并执行的实现代码5.1 主函数 writecode_to_targetproccppview plaincopy1. #include2. #include3. #include4. #include5. #include6. #include7. #include8. #include9. #include10. #include11. #include12. #include13. #include14. #include15. #include16. #include17. 18. #defineMAX_PATH0x10019. #defineREMOTE_ADDR(addr,local_base,remote_base)(uint32_t)(addr)+(uint32_t)(remote_base)-(uint32_t)(local_base)20. 21. /*writetheassemblercodeintotargetproc,22. *andinvokeittoexecute23. */24. intwritecode_to_targetproc(25. pid_ttarget_pid,/targetprocesspid26. constchar*library_path,/thepathof.sothatwillbe27. /uploadtotargetprocess28. constchar*function_name,/.soinitfucntione.g.hook_init29. void*param,/theparametersofinitfunction30. size_tparam_size)/numberofparameters31. 32. intret=-1;33. void*mmap_addr,*dlopen_addr,*dlsym_addr,*dlclose_addr;34. void*local_handle,*remote_handle,*dlhandle;35. uint8_t*map_base;36. uint8_t*dlopen_param1_ptr,*dlsym_param2_ptr,*saved_r0_pc_ptr,*inject_param_ptr,*remote_code_ptr,*local_code_ptr;37. 38. structpt_regsregs,original_regs;39. 40. /externglobalvariableintheassemblercode41. externuint32_t_dlopen_addr_s,_dlopen_param1_s,_dlopen_param2_s,42. _dlsym_addr_s,_dlsym_param2_s,_dlclose_addr_s,43. _inject_start_s,_inject_end_s,_inject_function_param_s,44. _saved_cpsr_s,_saved_r0_pc_s;45. 46. uint32_tcode_length;47. 48. longparameters10;49. 50. /maketarget_pidasitschildprocessandstop51. if(ptrace_attach(target_pid)=-1)52. return-1;53. 54. /getthevaluesof18registersfromtarget_pid55. if(ptrace_getregs(target_pid,s)=-1)56. gotoexit;57. 58. /saveoriginalregisters59. memcpy(&original_regs,s,sizeof(regs);60. 61. /getmmapaddressfromtarget_pid62. /themmapistheaddressofmmapinthecurprocess63. mmap_addr=get_remote_addr(target_pid,/system/lib/libc.so,(void*)mmap);64. 65. /setmmapparameters66. parameters0=0;/addr67. parameters1=0x4000;/size68. parameters2=PROT_READ|PROT_WRITE|PROT_EXEC;/prot69. parameters3=MAP_ANONYMOUS|MAP_PRIVATE;/flags70. parameters4=0;/fd71. parameters5=0;/offset72. 73. /executethemmapintarget_pid74. if(ptrace_call(target_pid,(uint32_t)mmap_addr,parameters,6,s)=-1)75. gotoexit;76. 77. /getthereturnvaluesofmmap78. if(ptrace_getregs(target_pid,s)=-1)79. gotoexit;80. 81. /getthestartaddressforassemblercode82. map_base=(uint8_t*)regs.ARM_r0;83. 84. /gettheaddressofdlopen,dlsymanddlcloseintargetprocess85. dlopen_addr=get_remote_addr(target_pid,/system/bin/linker,(void*)dlopen);86. dlsym_addr=get_remote_addr(target_pid,/system/bin/linker,(void*)dlsym);87. dlclose_addr=get_remote_addr(target_pid,/system/bin/linker,(void*)dlclose);88. 89. /setthestartaddressforassemblercodeintargetprocess90. remote_code_ptr=map_base+0x3C00;91. 92. /setthestartaddressforassemblercodeincurprocess93. local_code_ptr=(uint8_t*)&_inject_start_s;94. 95. /setglobalvariableofassemblercode96. /andtheseaddressisinthetargetprocess97. _dlopen_addr_s=(uint32_t)dlopen_addr;98. _dlsym_addr_s=(uint32_t)dlsym_addr;99. _dlclose_addr_s=(uint32_t)dlclose_addr;100. 101. code_length=(uint32_t)&_inject_end_s-(uint32_t)&_inject_start_s;102. 103. dlopen_param1_ptr=local_code_ptr+code_length+0x20;104. dlsym_param2_ptr=dlopen_param1_ptr+MAX_PATH;105. saved_r0_pc_ptr=dlsym_param2_ptr+MAX_PATH;106. inject_param_ptr=saved_r0_pc_ptr+MAX_PATH;107. 108. 109. /savelibrarypathtoassemblercodeglobalvariable110. strcpy(dlopen_param1_ptr,library_path);111. _dlopen_param1_s=REMOTE_ADDR(dlopen_param1_ptr,local_code_ptr,remote_code_ptr);112. 113. 114. /savefunctionnametoassemblercodeglobalvariable115. strcpy(dlsym_param2_ptr,function_name);116. _dlsym_param2_s=REMOTE_ADDR(dlsym_param2_ptr,local_code_ptr,remote_code_ptr);117. 118. /savecpsrtoassemblercodeglobalvariable119. _saved_cpsr_s=original_regs.ARM_cpsr;120. 121. /saver0-r15toassemblercodeglobalvariable122. memcpy(saved_r0_pc_ptr,&(original_regs.ARM_r0),16*4);/r0r15123. _saved_r0_pc_s=REMOTE_ADDR(saved_r0_pc_ptr,local_code_ptr,remote_code_ptr);124. 125. /savefunctionparameterstoassemblercodeglobalvariable126. memcpy(inject_param_ptr,param,param_size);127. _inject_function_param_s=REMOTE_ADDR(inject_param_ptr,local_code_ptr,remote_code_ptr);128. 129. /writetheassemblercodeintotargetprocess130. /nowthevaluesofglobalvariableisinthetargetprocessspace131. ptrace_writedata(target_pid,remote_code_ptr,local_code_ptr,0x400);132. 133. memcpy(s,&original_regs,sizeof(regs);134. 135. /setspandpctothestartaddressofassemblercode136. regs.ARM_sp=(long)remote_code_ptr;137. regs.ARM_pc=(long)remote_code_ptr;138. 139. /setregistersfortargetprocess140. ptrace_setregs(target_pid,s);141. 142. /makethetarget_pidisnotachildprocessofcurprocess143. /andmaketarget_pidcontinuetorunning144. ptrace_detach(target_pid);145. 146. /nowfinishitsuccessfully147. ret=0;148. 149. exit:150. returnret;151. 5.2 attach目标进程ptrace_attachcppview plaincopy1. intptrace_attach(pid_tpid)2. 3. /afterPTRACE_ATTACH,theprocwillstop4. if(ptrace(PTRACE_ATTACH,pid,NULL,0)0)5. 6. perror(ptrace_attach);7. return-1;8. 9. 10. /waitprocstop11. waitpid(pid,NULL,WUNTRACED);12. 13. /afterPTRACE_SYSCALL,theprocwillcontinue,14. /butwhenexectuesyscallfunction,procwillstop15. if(ptrace(PTRACE_SYSCALL,pid,NULL,0)0)16. 17. perror(ptrace_syscall);18. return-1;19. 20. 21. /waitprocstop22. waitpid(pid,NULL,WUNTRACED);23. 24. return0;25. 5.3 获取目标进程寄存器值ptrace_getregscppview plaincopy1. intptrace_getregs(pid_tpid,structpt_regs*regs)2. 3. if(ptrace(PTRACE_GETREGS,pid,NULL,regs)0)4. 5. perror(ptrace_getregs:Cannotgetregistervalues);6. return-1;7. 8. 9. return0;10. 5.4 获取目标进程中指定模块中指定函数的地址get_remote_addrcppview plaincopy1. 2. /*findthestartaddressofmodulewhosenameismodule_name3. *inthedesignatedprocess4. */5. void*get_module_base(pid_tpid,constchar*module_name)6. 7. FILE*fp;8. longaddr=0;9. char*pch;10. charfilename32;11. charline1024;12. 13. if(pid0)14. 15. /*selfprocess*/16. snprintf(filename,sizeof(filename),/proc/self/maps,pid);17. 18. else19. 20. snprintf(filename,sizeof(filename),/proc/%d/maps,pid);21. 22. 23. fp=fopen(filename,r);24. 25. if(fp!=NULL)26. 27. while(fgets(line,sizeof(line),fp)28. 29. if(strstr(line,module_name)30. 31. pch=strtok(line,-);32. addr=strtoul(pch,NULL,16);33. 34. if(addr=0x8000)35. addr=0;36. 37. break;38. 39. 40. fclose(fp);41. 42. 43. return(void*)addr;44. 45. 46. void*get_remote_addr(pid_ttarget_pid,constchar*module_name,void*local_addr)47. 48. void*local_handle,*remote_handle;49. 50. local_handle=get_module_base(-1,module_name);51. remote_handle=get_module_base(target_pid,module_name);52. 53. return(void*)(uint32_t)local_addr+(uint32_t)remote_handle-(uint32_t)local_handle);54. 5.5 在目标进程中执行指定函数ptrace_callcppview plaincopy1. intptrace_call(pid_tpid,uint32_taddr,long*params,uint32_tnum_params,structpt_regs*regs)2. 3. uint32_ti;4. 5. /putthefirst4parametersintor0-r36. for(i=0;inum_params&iuregsi=paramsi;9. 10. 11. /pushremainedparamsintostack12. if(iARM_sp-=(num_params-i)*sizeof(long);15. ptrace_writedata(pid,(void*)regs-ARM_sp,(uint8_t*)msi,(num_params-i)*sizeof(long);16. 17. /setthepctofuncthatwillbeexecuted18. regs-ARM_pc=addr;19. if(regs-ARM_pc&1)20. 21. /*thumb*/22. regs-ARM_pc&=(1u);23. regs-ARM_cpsr|=CPSR_T_MASK;24. 25. else26. 27. /*arm*/28. regs-ARM_cpsr&=CPSR_T_MASK;29. 30. 31. /whenfinishthisfunc,pidwillstop32. regs-ARM_lr=0;33. 34. /settheregsisterandstarttoexecute35. if(ptrace_setregs(pid,regs)=-136. |ptrace_continue(pid)=-1)37. 38. return-1;39. 40. 41. /waitpidfinishworkandstop42. waitpid(pid,NULL,WUNTRACED);43. 44. return0;45. 5.6 把代码写入目标进程指定地址ptrace_writedatacppview plaincopy1. intptrace_writedata(pid_tpid,uint8_t*dest,uint8_t*data,size_tsize)2. 3. uint32_ti,j,remain;4. uint8_t*laddr;5. 6. unionu7. longval;8. charcharssizeof(long);9. d;10. 11. j=size/4;12. remain=size%4;13. 14. laddr=data;15. 16. for(i=0;i0)26. 27. d.val=ptrace(PTRACE_PEEKTEXT,pid,dest,0);28. for(i=0;i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度中医助理医师模拟试题及答案详解【全优】
- 应急安全培训及演练总结课件
- 2025水利设施管养人员模拟试题及答案详解(历年真题)
- 2024平凉市公务员行测及参考答案详解(满分必刷)
- 新生儿呼吸道合胞病毒-RSV-感染诊疗与预防
- 迁移路灯合同(标准版)
- 2024年冶金工业技能鉴定过关检测试卷带答案详解(A卷)
- 2024-2025学年测绘职业技能鉴定考试综合练习带答案详解(夺分金卷)
- 2025年工业互联网平台入侵检测系统在智慧城市中的应用与优化报告
- 住院医师儿内科Ⅰ阶段考试答案
- 2024-2030年街舞培训行业市场深度分析及发展前景与投资机会研究报告
- DB1331-T 025.4-2022 雄安新区工程建设关键质量指标体系:合交通
- 2024至2030年中国喷水推进器行业发展形势分析及市场前景趋势报告
- 陶渊明专题课件
- 人参培训课件
- 四川省价建筑地下结构抗浮锚杆技术标准
- 2023年航空公司招聘:机场安检员基础知识试题(附答案)
- 糖尿病临床病例分析经典案例
- 老年人体检分析报告总结
- 第4课《用联系的观点看问题》第2框《在和谐共处中实现人生发展》-【中职专用】《哲学与人生》同步课堂课件
- 计量安全防护
评论
0/150
提交评论