open()在前几次调用之后,使用函数插入for Python似乎不起作用.我怀疑Python正在进行某种初始化,或者某些东西暂时绕过我的功能.
这里的open电话很明显:
$ cat a
hi
$ LD_PRELOAD=./libinterpose_python.so cat a
sandbox_init()
open()
hi
Run Code Online (Sandbox Code Playgroud)
在Python初始化过程中它会发生一次:
$ LD_PRELOAD=./libinterpose_python.so python
sandbox_init()
Python 2.7.2 (default, Jun 12 2011, 20:20:34)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
open()
>>>
sandbox_fini()
Run Code Online (Sandbox Code Playgroud)
在这里根本没有发生,并且没有错误表明文件句柄已删除写权限:
$ LD_PRELOAD=./libinterpose_python.so python3 -c 'b = open("a", "w"); b.write("hi\n"); b.flush()'
sandbox_init()
sandbox_fini()
Run Code Online (Sandbox Code Playgroud)
我试图拦截我的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
我目前工作的一个项目,我需要跟踪的几个系统调用和低级别的功能,如使用mmap,brk,sbrk.到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我正在替换的函数同名的包装函数(mmap例如),并通过设置LD_PRELOAD环境变量将其加载到程序中.我通过我加载的指针调用实际函数dlsym.
不幸的是,我想要包装的函数之一在sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃.sbrk在Linux中不是系统调用,所以我不能简单地使用syscall它来间接调用它.
所以我的问题是,如何在不使用相同名称的包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)让我参考原始函数?
我编写了一个共享对象,它修改了FreeType FT_Load_Glyph和FT_Render_Glyph函数的参数,目前通过插入它LD_PRELOAD和dlsym.
这很好,但我很想知道是否有办法进行这些更改:
LD_PRELOAD主机上的所有程序;我能够提出的唯一两个"解决方案"是难看的黑客:
LD_PRELOAD所有的节目,似乎既缓慢又脆弱; 要么libfreetype.so.6.12.3到例如libxxxxtype.so.6.12.3; 然后
libxxxxtype.so.6.12.3到libxxxxtype.so.6;libxxxxtype.so.6; 和libfreetype.so.6.999.我本质上喜欢透明地修补共享对象中的几个函数,同时让其余的函数通过,而不必访问共享对象的源或使用它的程序,但是如果我制作一个假的共享对象与soname libfreetype.so.6,我看不到一个干净的方式将它链接到(或dlopen)真实的libfreetype.so.6.
这是我对共享库的第一个真正的实验,所以如果这个问题做出一些不正确的假设,或者只是没有意义,请耐心等待.
通过我的书" 专家C编程",我看到了关于功能插入的章节,以及如果无意中发生了如何导致一些严重的难以发现的错误.
书中给出的例子如下:
mktemp() { ... }
main() {
mktemp();
getwd();
}
Run Code Online (Sandbox Code Playgroud)
mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
Run Code Online (Sandbox Code Playgroud)
根据这本书,发生的事情main()是mktemp()(标准C库函数)被my_source.c中的实现插入.虽然main()调用我的实现mktemp()是预期的行为,但是getwd()(另一个C库函数)也调用我的实现mktemp()不是.
显然,这个例子是SunOS 4.0.3版本中存在的真实生活中的错误lpr.该书接着解释修复是将关键字添加static到定义mktemp()在my_source.c ; 虽然改名完全应该也解决了这个问题.
本章给我留下了一些未解决的问题,希望你们能回答:
static放在我们不希望暴露的所有功能之前的做法?谢谢您的帮助.
我应该注意到,我的问题不仅仅是针对插入标准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
我正在学习介入。下面的代码取自课程(CMU 15-213),但是,当我编译时,出现此警告“mymalloc.c:6:29: warning: all paths through this function will call myself [-Winfinite-recursion]” 。
据我了解,main() 中对 malloc 的调用将转为对 mymalloc() 的调用。在 mymalloc() 内部,再次调用 malloc,因此发生循环。
//int.c
#include <stdio.h>
#include "malloc.h"
int main() {
int *p = malloc(32);
free(p);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
//malloc.h
#include <stdlib.h>
#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)
void *mymalloc(size_t size);
void myfree(void *ptr);
Run Code Online (Sandbox Code Playgroud)
//mymalloc.c
#ifdef COMPILETIME
#include <stdio.h>
#include "malloc.h"
/* malloc wrapper function */
void *mymalloc(size_t size) {
void *ptr = malloc(size);
printf("malloc(%d)=%p\n",
(int)size, ptr);
return ptr;
}
/* …Run Code Online (Sandbox Code Playgroud) 我需要处理发送到笔记本电脑视频显示器的图像,我需要使用C++或shell程序将键盘输入发送到我的Linux系统.
我的目标是处理属于FPS游戏的图像,然后根据这些图像在游戏中进行操作(因此键盘输入).我没有尝试理解(如果它甚至可能)如何使用某些API与游戏X或Y进行交互,我认为这是与任何游戏进行交互的最快捷方式,劫持Linux输入和输出.
没有任何内核或设备驱动程序黑客攻击,有没有办法做到这一点?之前我使用recordmydesktop将我的桌面记录为视频,我想我可以破解其代码并尝试从中进行逆向工程.还有其他想法吗?我在Ubuntu 11上.
linux x11 linux-device-driver linux-kernel function-interposition
我完全按照本网站上的说明进行操作
http://www.newosxbook.com/src.jl?tree=listings&file=4-5-interpose.c
这是该页面的代码
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <malloc/malloc.h> // for malloc_printf()
// Note: Compile with GCC, not cc (important)
//
//
// This is the expected interpose structure
typedef struct interpose_s { void *new_func;
void *orig_func; } interpose_t;
// Our prototypes - requires since we are putting them in
// the interposing_functions, below
void *my_malloc(int size); // matches real malloc()
void my_free (void *); // matches real free()
static const interpose_t interposing_functions[] \
__attribute__ ((section("__DATA, …Run Code Online (Sandbox Code Playgroud) 特别是在Mac OS X上,是否可以通过DYLD_INSERT_LIBRARIES使程序忽略SIGTERM,这种方式适用于任何或大多数程序?
我尝试编译并插入:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void sig_handler(int signo)
{
if (signo == SIGTERM)
printf("received SIGTERM\n");
}
int main(void)
{
signal(SIGTERM, sig_handler);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,
DYLD_INSERT_LIBRARIES=libignore.dylib sleep 60
Run Code Online (Sandbox Code Playgroud)
能够毫无问题地杀死-15'd.
我目前正在 linux 上链接两个第三方共享库(A.so 和 B.so)。问题是这两个 so 都与另一个库静态链接,因此来自 A.so 和 B.so 的大约 400 个函数具有相同的名称。当我用 -lA -lB 或 -lB -lA 编译和链接时,根据顺序,由于函数插入导致问题和代码无法运行,函数分别从 A 或 B 中提取。我想知道是否有办法将函数名称绑定到它们的库,以便可以链接和使用这两个库?因为那些重叠的函数名是在 A 和 B 内部调用的,所以我不能使用像 objcopy 之类的东西。 dlopen 会有帮助吗?
linux ×5
c ×4
gcc ×2
interposing ×2
macos ×2
android ×1
dlsym ×1
dtrace ×1
dyld ×1
g++ ×1
hook ×1
ld-preload ×1
linker ×1
linux-kernel ×1
python ×1
signals ×1
system-calls ×1
x11 ×1