分类 其他 下的文章

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/42/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


先来看看海康、大华、宇视三个安防厂家摄像机的H265 国标PS封装格式案例:

首先是海康:

海康

接下来看大华:

大华

再接下来看看宇视的:

宇视
      可以看到,三个厂家稍稍有一点区别,海康是将VSP/SPS/PPS/SEI/IDR分开单独打包成一个PES包,宇视和大华则是将它们放到一个PES包里。其实两种方式都是符合ps打包规范的。
      H265的ps打包与H264的PS打包方式一致,区别仅在于PSM中stream_type的不同:H264是0x1B,H265是0x24。另外就是H265的帧类型相比H264要多出来一倍,H264nalu-type占了5bit,H265则是6bit。

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
GB28181 级联 CDN 回放:http://www.feitianzhi.com/boke/index.php/archives/37/
小雉视频系统负载均衡之GB28181多线负载均衡:http://www.feitianzhi.com/boke/index.php/archives/28/
小雉视频系统GB28181-2016配置:http://www.feitianzhi.com/boke/index.php/archives/28/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/41/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


      小雉视频系统从3.165.3509版本开始支持GB28181-2016版本,SIP指令及视频流均同时支持tcp和udp;

GB28181端口配置

  • 1路具体的gb28181视频配置(储存,rtsp,rtmp,hls,gb28181转发)

1路具体的gb28181视频配置(储存,rtsp,rtmp,hls,gb28181转发)

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/
GB28181 级联 CDN 回放:http://www.feitianzhi.com/boke/index.php/archives/37/
小雉视频系统负载均衡之GB28181多线负载均衡:http://www.feitianzhi.com/boke/index.php/archives/28/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/37/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


GB28181级联

流媒体服务器-CDN级联
      "GB28181一般级联"实质是多个sip服务器的级联,转发sip指令到视频源中的sip服务器执行,各级中的流媒体负责转发视频流;
      "GB28181 CDN 级联"在各级增加了CDN服务器,对回放视频流进行缓存,在视频回放时,优先判断本级的cdn服务器是否有对应时间视频,有视频则直接使用本级cdn缓存数据,不向下级请求流,cdn无对应时间视频,则向下级请求视频转发并进行缓存;

小雉级联回放

      小雉系统采用"GB28181 CDN 级联"技术方案实现,同时增加了多种转码服务器,以满足不同设备的需要;

  1. RTSP转码
          RTSP转码器与sip服务器和cdn服务器对接,实现gb28181直播流转rtsp直播流,支持使用rtsp进行视频回放,可用于安防客户端开发;
  2. RTMP转码
          RTMP转码器与sip服务器和cdn服务器对接,实现gb28181直播流转rtmp直播流,支持使用rtmp进行视频回放,可用于老系统web视频直播与回放;
  3. HLS转码
          HLS转码器与sip服务器和cdn服务器对接,实现gb28181直播流转hls直播流,支持使用hls进行视频回放,可用于android,iphone,ipad,qq,微信等H5的直播回放;

猜您可能喜欢

小雉系统安装:http://www.feitianzhi.com/boke/index.php/archives/11/
小雉系统网络配置:http://www.feitianzhi.com/boke/index.php/archives/15/
小雉系统硬盘配置:http://www.feitianzhi.com/boke/index.php/archives/16/
小雉系统远程升级:http://www.feitianzhi.com/boke/index.php/archives/14/
使用Google Authenticator为小雉系统增加动态密码功能:http://www.feitianzhi.com/boke/index.php/archives/17/

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/35/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


介绍

      一般视频系统由流媒体服务器和信令服务器组成,信令服务器一般负责客户端请求(如客户端要看a视频需要先通知信令服务器分配合适的流媒体去准备a的流,之后客户端才能通过流媒体看a的流)和控制流媒体服务器;本文所述的“去中心管理”就是去掉信令服务器;


中心管理的缺陷

  1. 调试不方便

在对标准流媒体协议进行调试时,如可使用vlc调试rtsp流,但vlc无法同信令服务器通信,使得调试麻烦;

  1. 级联难度高

各级可能使用不同的流协议,如rtsp同rtmp可认为有一定的相似度,但rtsp同gb28181的相似度几乎为0,两种不同协议的信令服务器对接难度非常高;

  1. 不能满足项目定制的需求

信令服务器往往同流媒体相关,在流媒体开发时已对信令服务器提出多项要求,导致信令服务器的一些特性与实际项目相悖;


小雉视频系统之去中心管理

      再合理的设计也是规则,也是束缚,小雉视频系统直接去掉了信令服务器,把信令服务器成为一张白纸,任君在项目中随意书写,以下为小雉视频系统不同协议级联的体验说明
小雉视频系统-级联

  1. 从相机直接拉取rtsp到“小雉视频1_1”

    rtsp地址: rtsp://mym9.com/rtsp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull
    hls地址: http://mym9.com:16880/rtsp_pull

  2. 相机使用gb28181推流到“小雉视频1_2”

    rtsp地址: rtsp://mym9.com/gb28181_push
    rtmp地址: rtmp://mym9.com/gb28181_push
    hls地址: http://mym9.com:16880/gb28181_push

  3. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用GB28181推流到“小雉视频2_1”,
    “小雉视频3_1”使用rtsp从“小雉视频2_1”拉取

    rtsp地址: rtsp://mym9.com/rtsp_pull_gb28181_push_rtsp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull_gb28181_push_rtsp_pull
    hls地址: http://mym9.com:16880/rtsp_pull_gb28181_push_rtsp_pull

  4. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用rtmp推流到“小雉视频2_2”,
    “小雉视频2_2”再使用rtsp推流到“小雉视频3_2”,

    rtsp地址: rtsp://mym9.com/rtsp_pull_rtmp_push_rtsp_push
    rtmp地址: rtmp://mym9.com/rtsp_pull_rtmp_push_rtsp_push
    hls地址: http://mym9.com:16880/rtsp_pull_rtmp_push_rtsp_push

  5. 从相机直接拉取rtsp到“小雉视频1_1”,
    “小雉视频1_1”再使用rtsp推流到“小雉视频2_3”,
    “小雉视频3_3”使用rtmp从“小雉视频2_3”拉取

    rtsp地址: rtsp://mym9.com/rtsp_pull_push_rtmp_pull
    rtmp地址: rtmp://mym9.com/rtsp_pull_push_rtmp_pull
    hls地址: http://mym9.com:16880/rtsp_pull_push_rtmp_pull

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/25/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


editbin

这是 Visual Studio 2017 采用的做法。我们需要使用到两个工具——editbin 和 dumpbin。前者用于编辑我们编译生成好的程序使之头信息中声明支持大于 2GB 内存,后者用于查看程序的头信息验证我们是否改好了。

编辑一个程序使之声明支持大于 2GB 内存的命令是:

editbin /largeaddressaware xxx.exe

其中,xxx.exe 是我们准备修改的程序,可以使用相对路径或绝对路径(如果路径中出现空格记得带引号)。

验证这个程序是否改好了的命令是:

dumpbin /headers xxx.exe | more

同样,xxx.exe 是我们刚刚改好准备检查的程序,可以使用相对路径或绝对路径。

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/24/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


      目前恩山上本人使用较多的固件为Padavan,PandoraBox,Bootloader部分则使用H大的Breed,这些固件使用起来体验极好,接下来浅谈一下个人对这些固件的看法,若有不当之处,还请指出

Breed部分的介绍将在下文刷机过程中展示

      PandoraBox是基于OpenWrt进行了大量国内路由适配的系统,其界面接近原生系统,并针对国情内置了不少实用的组件,通过opkg管理组件,全面汉化,翻译水平比原生系统高出不少,软件源在国内,所以下载速度较快,时区和信道都按照国内的标准预先修改了,所以对于大部分人来说,直接刷PandoraBox即可,不必费力刷原生OpenWrt,而且据说PandoraBox采用的无线驱动优于原生,对此没有太确定的消息,仅作参考

      Padavan俗称老毛子,其界面友好度极高,非常适合新手入门,不过默认主题略丑,好在可以更换,而且看起来不错,同样针对国情加入了大量组件,对332支持极好,不过扩展性较OpenWrt略有不足,但对于新手来说足矣

      我使用Padavan和PandoraBox近一年,但折腾的心是不会停止的,所以现在准备给R3G刷入原生OpenWrt,但根据OpenWrt官网上的资料和H大的某些回复来看,Breed刷OpenWrt略有困难,其原因在于给OpenWrt提交R3G支持的人,提交的flashlayout跟原厂的不兼容,而且使用了UBI,因此breed无法兼容,故breed不支持直接刷入mir3g的openwrt固件,且无法识别tar包
详情可见下方链接
https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=267455&page=1

      但此楼里有另一位大神提出了一种新的思路,见第三页aatest123的回复,其思路在于通过Breed先刷入initramfs-kernel.bin,这个文件集内核kernel和文件系统rootfs为一体,在引导期间将文件系统放在内存中,但由于内存断电后无法保存数据,所以该系统的所有设置无法保存,仅适用于不驱动flash的情况下使用,我们先通过Breed刷入该临时OpenWrt系统,重启路由器即可进入该临时系统,通过luci界面,选择系统更新,上传安装openwrt-18.06.4-ramips-mt7621-mir3g-squashfs-sysupgrade.tar(此为写此文时最新版本,可更换)
附件在此:https://pan.baidu.com/s/1SkF7WOt5GkIw6f68JP7viA 提取码: npp5

      随后路由器会自动重启,但登录后会发现进入的仍然是临时OpenWrt,这是因为Breed在刷入临时OpenWrt时刷入的是路由器的kernel0,而我们通过临时OpenWrt安装正式系统刷入的是kernel1,接下来我们将路由器断电,进入Breed(具体进入方法见Breed安装),启用环境变量,添加环境变量xiaomi.r3g.bootfw,其值为2,其目的在于使Breed启动后从kernel1启动,接下来重启,即可进入正式版OpenWrt系统,折腾第一步结束

      接下来是我当时安装时各种参考的资料分析,以及遇到的一些坑,毕竟我只能算是一位爱好者,没有接受过计算机技术教学,对于编译等东西一窍不通

      首先说说OpenWrt官网上对于R3G安装的操作,官网上的操作是针对原厂Bootloader和原厂固件的,故对于安装了Breed的我们来说,照抄是万万不行的,官网上提供两个文件,分别是mir3g-squashfs-kernel1.bin和mir3g-squashfs-rootfs0.bin,官网上的命令为:

mtd write mir3g-squashfs-kernel1.binkernel1
mtd write mir3g-squashfs-rootfs0.binrootfs0
nvram set flag_try_sys1_failed=1
nvram commit
reboot

      上述命令中nvram是uboot专有命令,Breed与uboot相互独立,参数不共用,根据国外论坛对于小米路由器原厂uboot的分析,小米路由器的kernel0包含的usb恢复的功能,就是将官方固件命名为miwifi.bin放入U盘内,断电时插入路由器,用硬物抵住reset键后插电,保持10秒左右,待黄灯快速闪动后可松手,可恢复至官方固件,这个功能可用于原厂固件损坏后的修复,也算是不错的功能,所以OpenWrt官网上的建议是将内核文件刷入kernel1

      接下来说说Breed的参数,根据H大的回复,breed的启动流程如下:
      如果kernel0存在kernel1不存在,那么启动kernel0
      如果kernel1存在kernel0不存在,那么启动kernel1
      如果kernel0和kernel1都存在,那么检查环境变量 xiaomi.r3g.bootfw的值,如果存在且值为2,那么启动kernel1,否则启动kernel0

      关于操作前的备份指令
      cat /proc/mtd:读取路由器内部分区
      插入U盘(FAT/FAT32)
      输入【df -h】查看查看U盘的分区路径
      或者输入"cd /"回车,再输入"ls -a"查看到extdisks文件,再"cd extdisks"进入到extdisks文件里用"ls -a"就能查看到你的U盘路径,我的是sda4,以下以我自己U盘的路径为例:
      备份(请自行修改回你自己的U盘路径):

dd if=/dev/mtd0 of=/extdisks/sda4/ALL.bin
dd if=/dev/mtd1of=/extdisks/sda4/Bootloader.bin
dd if=/dev/mtd2of=/extdisks/sda4/Config.bin
dd if=/dev/mtd3 of=/extdisks/sda4/Bdata.bin
dd if=/dev/mtd4of=/extdisks/sda4/Factory.bin
dd if=/dev/mtd5 of=/extdisks/sda4/crash.bin
dd if=/dev/mtd6 of=/extdisks/sda4/crash_syslog.bin
dd if=/dev/mtd7of=/extdisks/sda4/reserved0.bin
dd if=/dev/mtd8of=/extdisks/sda4/kernel0.bin
dd if=/dev/mtd9of=/extdisks/sda4/kernel1.bin
dd if=/dev/mtd10of=/extdisks/sda4/rootfs0.bin
dd if=/dev/mtd11of=/extdisks/sda4/rootfs1.bin
dd if=/dev/mtd12of=/extdisks/sda4/overlay.bin
dd if=/dev/mtd13of=/extdisks/sda4/ubi_rootfs.bin
dd if=/dev/mtd14 of=/extdisks/sda4/data.bin

      备份到最后一个mtd14可以会出现如下出错提示:
dd: can't open '/dev/mtd14': Device or resourcebusy
      该分区备份不成功无所谓,关键的mtd0-mtd4备份下来就行了。
      如果还在官版的固件下想恢复的,可使用如下命令:
      恢复(这里我们不需要该步骤,只是给有需要的人看的官版固件下的恢复步骤)

mtd write /extdisks/sda4/Bootloader.binBootloader
mtd write /extdisks/sda4/Config.bin Config
mtd write /extdisks/sda4/Bdata.bin Bdata
mtd write /extdisks/sda4/Factory.binFactory
mtd write /extdisks/sda4/crash.bin crash
mtd write /extdisks/sda4/crash_syslog.bincrash_syslog
mtd write /extdisks/sda4/reserved0.binreserved0
mtd write /extdisks/sda4/kernel0.binkernel0
mtd write /extdisks/sda4/kernel1.bin kernel1
mtd write /extdisks/sda4/rootfs0.binrootfs0
mtd write /extdisks/sda4/rootfs1.binrootfs1
mtd write /extdisks/sda4/overlay.binoverlay
mtd write /extdisks/sda4/ubi_rootfs.binubi_rootfs
mtd write /extdisks/sda4/data.bin data

Breed

      https://www.right.com.cn/forum/thread-161906-1-1.html
      这是一个非常易用的Bootloader,针对刷机主流型号进行了适配,内置DHCP服务,拥有Web图形化界面,小白也能轻松刷机,并且支持Telnet,wget等功能,可以通过TTL进行操作,具体介绍可见上述网址,选择仅看楼主,里面包含绝大多数关于Breed的资料,就不在此赘述

      如何在R3G内刷入Breed

      首先小米路由器需要开启ssh,此类教程在网上极多,是基本功,在此不多说了
      首先需要下载支持小米路由器3G的Breed,可从H大搭建的服务器https://breed.hackpascal.net/ 内下载,其型号是breed-mt7621-xiaomi-r3g.bin
      接下来通过WinSCP将文件上传至路由器内部,注意将文件协议选择为SCP,我通常将文件上传至/tmp目录下,建议将文件改名为Breed.bin,便于后续操作
      输入mtd write /tmp/breed.bin Bootloader,将Breed刷入Bootloader
若输入mtd -r write /tmp/breed.bin Bootloader,-r意味着刷入后直接重启,一旦刷错难以补救,所以建议不要加入-r,待完      全确认后再手动断开电源
      在接入电源线之前用硬物顶住路由的reset键再接电,等到路由器的指示灯狂闪的时候,松开reset键,电脑上在浏览器中输入192.168.1.1,即可进入Breed控制台

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/23/
转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


使用 GRUB2 安装 Ubuntu 18.04

      使用 GRUB2 安装 Ubuntu 18.04 的原因是机器上已经有 Ubuntu 16.04 在了,GRUB 引导自然也是有的。我以往常使用传统硬盘安装的方式, GRUB2 本身是硬盘安装的一种方式,只是引导器选择了GRUB2。好处是只要有 ISO 的安装镜像就可以了,不需要像传统的方法从源里新下载适用于硬盘的引导 vmlinux & initrd, 它们俩一般在 hd-media 目录,如下是阿里云 Ubuntu 18.04 的路径。

      https://mirrors.aliyun.com/ubuntu/dists/bionic/main/installer-amd64/current/images/hd-media/

流程

  • 下载 Ubuntu 18.04 镜像,更名为 Ubuntu-18.04.iso, 放在某盘根目录。
  • 进入 GRUB2, 在界面按提示 C 进入 Command Mode
  • ls (hdxx, msdosxx)/, 寻找 Ubuntu-18.04.iso 的存放路径。本次为 (hd2, msdos1)
  • 执行指令

    loopback loop (hd2, msdos1)/Ubuntu-18.04.iso
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/Ubuntu-18.04.iso
    initrd (loop)/casper/initrd.lz
    boot

说明:

(loop)后的路径,依据 vmlinuz & initrd.lz 实际的来。可以 tab 自动补全,或 ls 查看。
linux 指令后,没有增加其它指令(quiet splash)。好处是在运行过程中,有 LOG 。解决了我因为打印机连接而 Pending 的问题。

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/21/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


参考文章:https://www.oschina.net/question/234345_52687

用例子说话

二进制

对应源码

有一个程序

a.out

main.c

需要加载插件A

libA.so

liba.c

A需要另一个动态库

libB.so

libB1.c 或 libB2.c

本文的关注点就是:到底是哪一个libB.so被加载

目录结构:

/home/debao/ttt/a.out
/home/debao/ttt/libA.so
/home/debao/ttt/libB.so
/usr/lib/libB.so
具体源码
main.c ==> ./a.out

include <stdio.h>

include <dlfcn.h>

typedef int (*funcA)(int, int);
int main()
{

void * plugin = dlopen("./libA.so", RTLD_LAZY);
funcA f = (funcA)dlsym(plugin, "funcA");
printf("main: %d\n", f(3,4));
return 0;

}
liba.c ==> ./libA.so

include <stdio.h>

int funcB(int, int);
int funcA(int a, int b)
{

printf("hello from funcA\n");
return funcB(a, b);

}
libb1.c ==> ./libB.so

include <stdio.h>

int funcB(int a, int b)
{

printf("Hello from funcB 1\n");
return a*b;

}
libb2.c ==> /usr/lib/libB.so

include <stdio.h>

int funcB(int a, int b)
{

printf("Hello from funcB 2\n");
return a*b;

}
编译库文件
编译动态库libB.so

$ gcc -shared -fPIC libb2.c -o libB2.so
$ sudo mv libB2.so /usr/lib/libB.so
$ gcc -shared -fPIC libb.c -o libB.so
编译动态库libA.so

$ gcc -shared -fPIC liba.c -o libA.so -L. -lB
顺便看看该elf文件的头部信息:

$ readelf libA.so -d

Dynamic section at offset 0xf20 contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libB.so]
0x00000001 (NEEDED) Shared library: [libc.so.6]
...
恩,只有库的文件名信息,而没有路径信息。

编译程序
第一次编译运行(什么路径都不加)

$ gcc main.c -ldl
$ ./a.out
hello from funcA
Hello from funcB 2
main: 12
程序:dlopen从当前目录找到libA.so,然后却在/usr/lib/中找到libB.so(没有使用当前目录的libB.so,这是我们需要的么?)

第二次编译运行(使用DT_RPATH)

$ gcc main.c -ldl -Wl,--rpath=.
$ ./a.out
hello from funcA
Hello from funcB 1
main: 12
恩,使用当前目录的libB.so,很理想的东西

可是,由于DT_RPATH无法被环境变量LD_LIBRARY_PATH覆盖,不是不建议被使用,而是建议使用DT_RUNPATH么?

第三次编译运行(使用DT_RUNPATH)

$ gcc main.c -ldl -Wl,--rpath=.,--enable-new-dtags
$ ./a.out
hello from funcA
Hello from funcB 2
main: 12
问题重新出现,使用的系统路径中的libB.so 而不是当前目录下的。

程序头部信息
通过下列命令可以查看:

$ readelf -d a.out
为了完整起见,列出前面3次编译的程序的信息:

没有rpath和runpath

Dynamic section at offset 0xf20 contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8048360
...
包含rpath

Dynamic section at offset 0xf18 contains 22 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [.]
0x0000000c (INIT) 0x8048360
....
包含rpath和runpath

Dynamic section at offset 0xf10 contains 23 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [.]
0x0000001d (RUNPATH) Library runpath: [.]
原因
RPATH and RUNPATH给出这个问题的答案:

Unless loading object has RUNPATH:

RPATH of the loading object,
    then the RPATH of its loader (unless it has a RUNPATH), ...,
    until the end of the chain, which is either the executable
    or an object loaded by dlopen
Unless executable has RUNPATH:
    RPATH of the executable

LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs
用它解释第一个程序:

libA.so 没有RUNPATH,故而
使用其RPATH (没有)
递归查找其loader直到链条的顶端(可执行程序或被dlopen打开的对象)的RPATH或者遇RUNPATH退出 (没有命中)
可执行程序没有RUNPATH,故而
使用其RPATH (没有)
环境变量LD_LIBRARY_PATH,(没有)
libA.so 的RUNPATH (没有)
ld.so.cache (没有命中)
默认路径/usr/lib (命中)
用它解释第二个程序:

libA.so 没有RUNPATH,故而
使用其RPATH (没有)
递归查找其loader直到链条的顶端(可执行程序或被dlopen打开的对象)的RPATH或者遇RUNPATH退出 (没有命中)
可执行程序没有RUNPATH,故而
使用其RPATH (命中)
用它解释第三个程序:

libA.so 没有RUNPATH,故而
使用其RPATH (没有)
递归查找其loader直到链条的顶端(可执行程序或被dlopen打开的对象)的RPATH或者遇RUNPATH退出 (没有命中)
可执行程序有RUNPATH,(继续前行)
环境变量LD_LIBRARY_PATH,(没有)
libA.so 的RUNPATH (没有)
ld.so.cache (没有命中)
默认路径/usr/lib (命中)
有意思的就是这个程序了,可执行程序的RUNPATH是一个重要的判断条件,却并不被做为这儿搜索路径!!

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/20/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


本文纯探讨技术实现,请大家抱着学习交流之目的进行阅览。

-rpath和-rpath-link的区别

(1)-rpath和-rpath-link都可以在链接时指定库的路径;
(2)运行可执行文件时,-rpath-link指定的路径不再有效(链接器没有将库的路径包含进可执行文件中),
           而-rpath指定的路径还有效(因为链接器已经将库的路径包含在可执行文件中);
(3)-L指定的是链接时的库路径,生成的可执行文件在运行时库的路径仍由LD_LIBRARY_PATH环境变量指定;

(4)不管采用何种选项链接,当提示找不到动态库时均可通过设置LD_LIBRARY_PATH解决。
其中 $$ORIGIN表示文件的当前路径,./表示应用程序的路径,一般-rpath,'$$ORIGIN'才能获得想要的效果;
-rpath,'$$ORIGIN',--enable-new-dtags 会在程序中加再加(RUNPATH)标签,参考http://www.feitianzhi.com/boke/index.php/archives/21/

gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 减小程序体积

GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。
我们常常使用下面的配置启用这个功能:

CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections

让make更透明些

在编译信息里面看到详细的gcc/g++的编译参数

make VERBOSE=1

在CMakeLists.txt里面加上这句指令也可以

set(CMAKE_VERBOSE_MAKEFILE ON)

本文原地址: http://www.feitianzhi.com/boke/index.php/archives/19/

转载请注明出处,有疑问或错误请发邮件到[email protected] 或加QQ群:869598376


本文纯探讨技术实现,请大家抱着学习交流之目的进行阅览。

测试环境:
服务器端:CentOS 7.0、openvpn-2.3.10
客户端 :Fedora 23

服务器端安装与配置:
安装obfsproxy
1、[root@1st ~]# yum install gcc python-pip python-devel
2、[root@1st ~]# pip install obfsproxy
3、[root@1st ~]# obfsproxy
usage: obfsproxy [-h] [-v] [–log-file LOG_FILE]
[–log-min-severity {error,warning,info,debug}] [–no-log]
[–no-safe-logging] [–data-dir DATA_DIR] [–proxy PROXY]
{managed,obfs2,dummy,obfs3,scramblesuit,b64} …
以上三步,我们就完成了obfsproxy的安装工作,接下来我们开始配置。obfsproxy一般使用obfs3或者scramblesuit模式,scramblesuit是obfs3的加强版,使用密码加密。这样就无法模拟obfs客户端来探测被混淆的是什么。下面以scramblesuit作为示范。
注意:scramblesuit的密码必须为BASE32字符。
BASE32字符是由:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567组成,且必须为32位。

[root@1st ~]# obfsproxy –data-dir ~/.obfs/ scramblesuit –dest 127.0.0.1:1194 –password ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 server 0.0.0.0:1234 &

由于我们是通过obfsproxy来实现服务器端与客户端之间的加密通信,所以openvpn不用监听在服务器端的IP地址上,可以监听在127.0.0.1这样的本地地址。上面的命令中:127.0.0.1:1194就是需要被混淆的端口(协议),0.0.0.0:1234是混淆后对外监听的端口。如果不需要后台运行则去掉最后的 & 。

运行成功后应该会提示:

2015-08-21 22:54:12,282 [WARNING] Obfsproxy (version: 0.2.13) starting up.
2015-08-21 22:54:12,282 [ERROR]

Do NOT rely on ScrambleSuit for strong security!

至此服务端已经配置完成。

客户端安装与配置
关于在Windows和Fedora 23下的openvpn客户端配置,不再本文的讨论范围之内。
Windows客户端
首先:需要在python官方网站上下载你windows对应python版本,本文中下载的是python-2.7.11.amd64,因为测试系统是windows 7 64位。
其次:需要在http://www.voidspace.org.uk/python/modules.shtml这个网站下载pycrypto-2.6.win-amd64-py2.7,如果没有这个文件,将会在安装obfsproxy是报错。
第三:在正确安装上述两个软件后,需要从新启动一下你的操作系统。
第四:在命令行状态下执行:C:\>pip install obfsproxy,如果一切顺利,就可以执行下面的命令了:
c:>obfsproxy scramblesuit –dest xxx.xxx.xxx.xxx(此处是openvpn所在服务器的IP地址):1234 –password ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 client 127.0.0.1:56789 &

fedora 23客户端
首先,用dnf命令检查python-crypto.x86_64、gcc.x86_64、redhat-rpm-config软件包是否安装,如果没有安装,请参照下面的命令进行安装。
[root@f23 ~]# dnf install python-crypto.x86_64
[root@f23 ~]# dnf install gcc.x86_64
[root@f23 ~]# dnf install redhat-rpm-config
[root@f23 ~]# sudo dnf install redhat-rpm-config
此命令解决:gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory的报错

[root@f23 ~]# pip install obfsproxy
[root@f23 ~]# obfsproxy scramblesuit –dest xxx.xxx.xxx.xxx(此处是openvpn所在服务器的IP地址):1234 –password ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 client 127.0.0.1:56789(此处的端口号何以随意指定,不超出范围就好)

在本地客户端,我们通过obfsproxy将所有流量发给服务器端obfsproxy监听的端口,再由obfsproxy重定向到 OpenVPN,这样OpenVPN客户端就不知道服务器IP是多少,没办法对到 OpenVPN 服务器的流量进行特殊处理,所以我们需要手动将到服务器的路由固定下来,假设你的服务器端IP为xxx.xxx.xxx.xxx,本地客户端的网关地址是192.168.1.1,我们以fedora 23为例,添加路由的命令:
[root@f23 ~]# route add -host xxx.xxx.xxx.xxx gw 192.168.1.1(这一点非常重要)

OK,万事具备,祝大家有一个愉快的开始!