快捷搜索:  汽车  科技

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)可以看到通过这个技术,可以让你的app虽然没这个符号的依赖,但是也能通过字符串找到这个符号,同时你又跟对应的提供的符号的库产生了强绑定,他又比dlopen()的基础上多了一次弱依赖关系,即他从安全角度也保证了你这个符号一定会存在,因为通过dlopen()的方式,会出现找不到符号的问题,但是有了这层弱依赖,如果当前路径下没有这个库,你的app根本就起不来,如果你的app能起来,这个库肯定在当前目录,你也一定能找到对应的符号通过-Wl,--no-as-needed可以让你的app跟某个库产生一定的“关系”,但是此时你通过readelf -s xxx / nm xxx查看这个进来的符号的话你是看不到的,这个时候其实你可以通过dlopen(NULL)来打开自己,这种情况下,你的二次依赖的符号通过--no-as-needed就进来了,这从一定程度上增加了破解的难度这个情况下,就要祭出我们的linke

首先你app如果跟库需要有“link” 你本身得需要有对应的符号依赖,比如在你的main.cpp中需要一个hello()的符号(光声明不行,你得实际真正的使用这个符号),此时你的libhello.so中恰巧也有这个hello()的符号,那么当你

g main.cpp libhello.so -o app

的时候,其实你可以在ldd或者readelf -d中看到此时的app会依赖这个libhello.so,同时当你nm这个app的时候,你会发现你的这个app缺失需要这个_Z5hellov的符号

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)(1)

好玩的情况就是当你的这个app如果跟libhello.so没有任何的符号依赖,但是通过dlopen的方式来打开,这是很自然的想法,但是如果此时我让你不能显示打开这个libhello.so,因为你可能不知道这个库的名字,他可能随时会改,那有什么办法可以让你始终能找到这个符号呢?

这个情况下,就要祭出我们的linker option大杀器 - -Wl --no-as-needed了,他的作用其实就是让你的app和library即使没有任何关系,也会产生NEEDED关系,这样的话,即使我们的main.cpp中没有任何hello()的符号,我们通过这个选项也能做到

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)(2)

的依赖,这种情况下,我们就可以盲猜式的通过dlopen(NULL)来打开自己,就能得到对应的符号。

归根接地就是一句话

通过-Wl,--no-as-needed可以让你的app跟某个库产生一定的“关系”,但是此时你通过readelf -s xxx / nm xxx查看这个进来的符号的话你是看不到的,这个时候其实你可以通过dlopen(NULL)来打开自己,这种情况下,你的二次依赖的符号通过--no-as-needed就进来了,这从一定程度上增加了破解的难度

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)(3)

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)(4)

openwrt wan口无数据(-Wl--no-as-needed配合dlopen)(5)

可以看到通过这个技术,可以让你的app虽然没这个符号的依赖,但是也能通过字符串找到这个符号,同时你又跟对应的提供的符号的库产生了强绑定,他又比dlopen()的基础上多了一次弱依赖关系,即他从安全角度也保证了你这个符号一定会存在,因为通过dlopen()的方式,会出现找不到符号的问题,但是有了这层弱依赖,如果当前路径下没有这个库,你的app根本就起不来,如果你的app能起来,这个库肯定在当前目录,你也一定能找到对应的符号

猜您喜欢: