我如何在运行时(否LD_PRELOAD)拦截/挂钩C函数,就像fopen()在Linux上一样,对于Windows来说是一个很好的选择?我想从Python中做到这一点(因此,我假设该程序已经在运行CPython VM)并且还要重新路由到Python代码.我只是挂钩共享库函数.我也想这样做而不必改变程序的运行方式.
一个想法是基于ptrace()或重写dlsym()PLT中或在PLT中找到的代码以及目标ctypes生成的C可调用函数来推送我自己的工具,但我想我先问这里.谢谢.
我试图拦截我的Android应用程序在非root设备上进行的所有系统调用.
因此,每次我的应用程序写入/读取文件时,我都会拦截系统调用并加密/解密流以用于安全目的.加密部分没问题,但我如何拦截系统调用?
由于应用程序的某些部分是由第三方提供商开发的模块,我无法更改源代码,因此没有其他方法可以确保数据安全存储.
由于我没有root访问权限,因此无法访问此处所述的系统调用表的地址,我也无法通过LKM模块执行此操作.
我要感谢任何建议,谢谢.
编辑:
好的,我现在可以使用Simone Margaritelli的代码链接了!我的代码一直崩溃的原因是因为我必须设置正确的内存访问权限:
uint32_t page_size = getpagesize();
uint32_t entry_page_start = reloc& (~(page_size - 1));
mprotect((uint32_t *)entry_page_start, page_size, PROT_READ | PROT_WRITE);
Run Code Online (Sandbox Code Playgroud) hook android system-calls library-interposition function-interposition
我需要在C++程序中插入一个方法调用(该类驻留在一个单独的共享库中).我以为我可以使用LD_PRELOAD,但我不确定这是如何工作的(我只找到C函数的例子):有没有办法为单个方法设置插入而不从插入的类实现复制任何代码?
我需要插入(调用我的函数而不是原始函数)一些OS X系统调用来克服一个闭源软件中的缺陷.
最好,得到的解决方案可以在10.5(Leopard)和更新的情况下工作,但如果论证足够强大,我可能需要10.6(Snow Leopard).
最好,得到的解决方案是可执行的,但我可能会选择一个脚本.
优选地,即使在目标应用程序运行之后,所得到的解决方案也能够插入("窃取向量"),但是我可以解决在应用程序加载时必须注入其自身的技术.
优选地,所得到的解决方案将用C或C++开发,但我可以解决Objective-C或其他问题.
到目前为止,我已经尝试过:
1)DTrace脚本,它教会了我很多,但D语言的局限性(有限的流量控制等)使它成为我正在做的事情的主要痛苦,更不用说结果将是一个脚本,这不像我正在拍摄的那样整洁和自足.
2)DYLD_INSERT_LIBRARIES插入,在很多方面很流行,但可能是由于命名空间扁平化(我不会假装深刻理解这意味着什么),它可以很好地对付更简单的可执行文件,但是使我的目标应用程序阻塞,即使我构建一个没有实际插入任何调用的无用库.
我的最新想法是尝试使用mach_star(https://github.com/rentzsch/mach_star),但我先停在这里,要求Stack Overflow社区,它总是比我更了解...
......我接下来除了马赫星之外还应该看一些东西吗?
macos dtrace library-interposition function-interposition interposing
我正在使用C中的内存映射文件,并想知道是否有办法透明地用fopen替换FOLD*和内存映射文件.
例:
FILE * fp = g_fopen(...);
//Program does things to this fp.
fclose();
Run Code Online (Sandbox Code Playgroud)
但相反,是否有可能有FILE*fp = my_fopen(...)
我自己的函数会在磁盘mmap上打开一个文件,也许更改内容然后传回FILE*,而程序看不到除了新的my_fopen()和my_fclose()之外的任何不同.
这是否可以不必重写程序中的操作方式?
android ×1
c ×1
c++ ×1
dtrace ×1
file-io ×1
hook ×1
interposing ×1
linux ×1
macos ×1
memory ×1
methods ×1
python ×1
system-calls ×1
transparency ×1