当前位置: 首页 > news >正文

建站论坛系统长沙网站 建设推广世云网络

建站论坛系统,长沙网站 建设推广世云网络,wordpress修改网页,网站推广应该注意什么以下内容通过1、实现目标注入程序#xff0c;2、实现主程序#xff0c;3、实现注入函数#xff0c;4、thumb指令集实现等4个方面详细分析了android中inline hook的用法#xff0c;以下是全部内容#xff1a;最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍#xf…以下内容通过1、实现目标注入程序2、实现主程序3、实现注入函数4、thumb指令集实现等4个方面详细分析了android中inline hook的用法以下是全部内容最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍打算写几个博客把它们记录下来。第一次介绍一下我感觉难度最大的inline hook实现代码参考了腾讯GAD的游戏安全入门。inline hook的大致流程如下首先将目标指令替换为跳转指令跳转地址为一段我们自己编写的汇编代码这段汇编代码先是执行用户指定的代码如修改寄存器的值然后执行被替换掉的原指令2最后再跳转回原指令3处恢复程序的正常运行。为了避开注入过程我们通过hook自己进程加载的动态连接库进行演示。1、实现目标注入程序我们将这个程序编译为动态连接库然后在主程序中加载作为hook的目标。target.h#ifndef TARGET_H_INCLUDED#define TARGET_H_INCLUDEDvoid target_foo();#endif // TARGET_H_INCLUDEDtarget.c#include target.h#include #include #include void target_foo(){int a 3;int b 2;while(a--) {sleep(2);b a * b;printf([INFO] b is %d\n, b);}b b 2;b b - 1;printf([INFO] finally, b is %d\n, b);}Android.mkinclude $(CLEAR_VARS)LOCAL_ARM_MODE : armLOCAL_MODULE : targetLOCAL_CFLAGS -pie -fPIE -stdc11LOCAL_LDFLAGS -pie -fPIE -shared -llogAPP_ABI : armeabi-v7aLOCAL_SRC_FILES : target.cinclude $(BUILD_SHARED_LIBRARY)注意Android.mk中LOCAL_ARM_MODE : arm代表编译时使用4字节的arm指令集而不是2字节的thumb指令集。2、实现主程序在主程序中我们首先加载之前编写的动态链接库进行hook之后再对其中的函数target_foo进行调用。main.c#include #include #include #include #include #include hook_inline.htypedef void (*target_foo)(void);void my_func(struct hook_reg *reg){puts(here we go!);}void main(){void *handler dlopen(/data/local/tmp/libtarget.so, RTLD_NOW);target_foo foo (target_foo)dlsym(handler, target_foo);hook_inline_make(/data/local/tmp/libtarget.so, 0xde2, my_func, true);foo();}hook_inline.h#ifndef HOOK_INLINE_H_INCLUDED#define HOOK_INLINE_H_INCLUDED#include struct hook_reg {long ARM_r0; long ARM_r1; long ARM_r2; long ARM_r3;long ARM_r4; long ARM_r5; long ARM_r6; long ARM_r7;long ARM_r8; long ARM_r9; long ARM_r10;long ARM_r11;long ARM_r12;long ARM_sp; long ARM_lr; long ARM_cpsr;};typedef void (*hook_func)(struct hook_reg *reg);bool hook_inline_make(const char *library, long address, hook_func func, bool isArm);#endif // HOOK_INLINE_H_INCLUDED这里我们hook功能的实现函数为hook_inline_make4个参数分别为动态库路径目标地址用户函数目标地址处指令集。当程序执行到目标地址处时会回调我们传入的用户函数可通过参数hook_reg来更改寄存器的值(不包括寄存器pc)。因为之前在动态链接库的Android.mk文件指定了使用arm指令集进行编译所以此处指定最后一个参数为true。3、实现注入函数现在到了最为关键的地方为了实现这个功能还需要了解几个知识。(1)、获取内存中动态链接库的基址Linux系统中各个进程的内存加载信息可以在/proc/pid/maps文件中到通过它我们可以获取到动态链接库在内存中的加载基址。long get_module_addr(pid_t pid, const char *module_name){char file_path[256];char file_line[512];if (pid 0) {snprintf(file_path, sizeof(file_path), /proc/self/maps);} else {snprintf(file_path, sizeof(file_path), /proc/%d/maps, pid);}FILE *fp fopen(file_path, r);if (fp NULL) {return -1;}long addr_start -1, addr_end 0;while (fgets(file_line, sizeof(file_line), fp)) {if (strstr(file_line, module_name)) {if (2 sscanf(file_line, %8lx-%8lx, addr_start, addr_end)) {break;}}}fclose(fp);printf(library :%s %lx-%lx, pid : %d\n, module_name, addr_start, addr_end, pid);return addr_start;}(2)、更改内存中的二进制代码现在的计算机系统中一般对内存进行分段式管理不同的段有不同的读、写、执行的属性。一般来讲代码段只有读和执行的属性不允许对代码段进行写操作。Linux系统中通过函数mprotect对内存的属性进行更改需要注意的一点是需要以内存页的大小进行对齐。bool change_addr_writable(long address, bool writable) {long page_size sysconf(_SC_PAGESIZE);//align address by page sizelong page_start (address) (~(page_size - 1));//change memory attributeif (writable true) {return mprotect((void*)page_start, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) ! -1;} else {return mprotect((void*)page_start, page_size, PROT_READ | PROT_EXEC) ! -1;}}接下来就可以着手实现功能了inline hook跟指令集密切相关此处我们先演示arm指令集的情况之后对thumb指令集进行讨论。这里实现的功能是用户可在自己注册的回调函数中对hook点寄存器的值进行修改。为了实现32位地址空间的长跳转我们需要两条指令的长度(8个字节)来实现。一般手机上的arm处理器为3级流水所以pc寄存器的值总是指向当前执行指令后的第二条指令因而使用ldr pc, [pc, #-4]来加载该指令之后的跳转地址。当程序跳转到shellcode后首先对寄存器组进行备份然后调用用户注册的回调函数用户可在回调函数中修改备份中各个寄存器(pc寄存器除外)的值然后从备份中恢复寄存器组再跳转到stubcodestubcode的功能是执行被hook点的跳转指令替换掉的两条指令最后跳回原程序。ellcode.S 1 .global _shellcode_start_s.global _shellcode_end_s.global _hook_func_addr_s.global _stub_func_addr_s.data_shellcode_start_s: 备份各个寄存器push  {r0, r1, r2, r3}mrs   r0, cpsrstr   r0, [sp, #0xc]str   r14, [sp, #0x8]add   r14, sp, #0x10str   r14, [sp, #0x4]pop   {r0}push  {r0-r12} 此时寄存器被备份在栈中将栈顶地址作为回调函数的参数(struct hook_reg)mov   r0, spldr   r3, _hook_func_addr_sblx   r3 恢复寄存器值ldr   r0, [sp, #0x3c]msr   cpsr, r0ldmfd sp!, {r0-r12}ldr   r14, [sp, #0x4]ldr   sp, [r13]ldr   pc, _stub_func_addr_s_hook_func_addr_s:.word 0x0_stub_func_addr_s:.word 0x0_shellcode_end_s:.endshellcode使用汇编实现在使用时需要对里边的两个地址进行修复用户回调函数地址(_hook_func_addr_s)跟stubcode地址(_stub_func_addr_s)。接下来我们可以看一下函数hook_inline_make的具体实现了void hook_inline_make(const char *library, long address, hook_func func){//获取hook点在内存中的地址long base_addr get_module_addr(-1, library);long hook_addr base_addr address;//获取shellcode中的符号地址extern long _shellcode_start_s;extern long _shellcode_end_s;extern long _hook_func_addr_s;extern long _stub_func_addr_s;void *p_shellcode_start _shellcode_start_s;void *p_shellcdoe_end _shellcode_end_s;void *p_hook_func _hook_func_addr_s;void *p_stub_func _stub_func_addr_s;//计算shellcode大小int shellcode_size (int)(p_shellcdoe_end - p_shellcode_start);//新建shellcodevoid *shellcode malloc(shellcode_size);memcpy(shellcode, p_shellcode_start, shellcode_size);//添加执行属性change_addr_writable((long)shellcode, true);//在32bit的arm指令集中stubcode中的4条指令占用16个字节的空间//前两条指令为hook点被替换的两条指令//后两条指令跳转回原程序void *stubcode malloc(16);memcpy(stubcode, (void*)hook_addr, 8);//ldr pc, [pc, #-4]//[address]//手动填充stubcodechar jump_ins[8] {0x04, 0xF0, 0x1F, 0xE5};uint32_t jmp_address hook_addr 8;memcpy(jump_ins 4, jmp_address, 4);memcpy(stubcode 8, jump_ins, 8);//添加执行属性change_addr_writable((long)stubcode, true);//修复shellcode中的两个地址值uint32_t *shell_hook shellcode (p_hook_func - p_shellcode_start);*shell_hook (uint32_t)func;uint32_t *shell_stub shellcode (p_stub_func - p_shellcode_start);*shell_stub (uint32_t)stubcode;//为hook点添加写属性change_addr_writable(hook_addr, true);//替换hook点指令为跳转指令跳转至shellcodejmp_address (uint32_t)shellcode;memcpy(jump_ins 4, jmp_address, 4);memcpy((void*)hook_addr, jump_ins, 8);change_addr_writable(hook_addr, false);//刷新cachecacheflush(hook_addr, 8, 0);}注意这里的change_addr_writable函数无论传入false还是true对应地址都会添加上执行属性。由于处理器采用流水线跟多级缓存在更改代码后我们需要手动刷新cache即函数cacheflush(第三个参数无意义)。4、thumb指令集实现由于thumb指令集的功能受到限制虽然思路上跟arm指令集一致但在实现上需要用更多条指令下面是我自己想的一种实现方式欢迎交流。需要注意的是由于每条thumb指令为16bit所以32位的跳转地址需要占用两条指令的空间而且跳转时会污染r0寄存器所以要对其进行保护。我在实现程序时将shellcode编译为了arm指令集所以在原程序、shellcode、stubcode之间相互跳转时需要使用bx指令进行处理器状态切换(需要跳转的地址代码为thumb指令集时需要将地址的第1个bit位置位)。
http://www.yutouwan.com/news/299600/

相关文章:

  • 可以做家教的网站有哪些网站建设计划书
  • 网站开发说明文档深圳平湖网站建设公司
  • 四川学校网站建设公wordpress视频列表
  • 建筑网站大全免费河北建设厅网站登陆怎么找附件
  • 中天建设集团有限公司招聘网站seo需要用到哪些工具
  • 泉州洛江住房和城乡建设局网站怎么做贷款网站
  • 建设部网站下载佛山制作网站公司推荐
  • 公司网站建设分录网络技术推广服务
  • 建立企业网站的形式有政务网站建设存在的问题
  • 南京网站优化平台物业管理系统功能
  • 网站建设管理相关规定商城网站建设案例
  • 确定网站开发团队专业的集团网站设计网络
  • 我想花钱做网站平和县建设局网站
  • 做剧情游戏的网站网站突然不被百度收录
  • 利津网站建设哪家好直接做的黄页视频网站
  • 网站建设除了中企动力vps 需刷新几次才能打开网站
  • 教学网站开发应指导方案长春网站建设报价
  • 苏州小程序开发哪家好seo的中文意思是什么
  • 如何查看一个网站的所有二级域名融资融券配资网站建设
  • 无锡自助建网站免费建博客网站
  • 学网站开发如何给网站做备份
  • 东莞网站设计建设公司适合做网站的图片
  • 网站维护运营黄冈论坛东部社区
  • 外贸网站设计网站建设流程分为三个步骤
  • 泰安网站建设制作杭州十大设计公司排名
  • 设计网站用什么语言jsp网站
  • 长沙市做网站的网站杭州建设工程协会
  • ssh框架做音乐网站网站开发需要多少钱推荐
  • 烟台做网站公司哪家好微网站建设最新报价
  • 江苏做网站wordpress 怎么改中文