• 为OpenWrt/LEDE编译rpcapd 用于Wireshark远程抓包

    rpcapd是winpcap带的专门用来远程抓包的小工具,但是winpcap是给Windows用的,Linux下需要自己编译,如果要放到路由器上用,就要交叉编译了。

    以前编译都是直接在OpenWrt/LEDE的menuconfig里面选,现在不能选了,需要直接用toolchain手动编译。

    步骤如下:

    # 首先要把OpenWrt/LEDE的SDK下载或者编译出来
    # 以下的路径自行修改
    
    export PATH=$PATH:/root/lede/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16/bin
    export STAGING_DIR=/root/lede/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16
    
    export CC=mipsel-openwrt-linux-musl-gcc
    export CXX=mipsel-openwrt-linux-musl-g++
    export AR=mipsel-openwrt-linux-musl-ar
    export RANLIB=mipsel-openwrt-linux-musl-ranlib
    export ac_cv_linux_vers=4.4.61
    
    # 在https://www.winpcap.org/devel.htm 下载winpcap源码
    unzip source.zip
    cd winpcap/wpcap/libpcap
    chmod +x configure
    ./configure --build=x86_64-unknown-linux-gnu --host=mipsel-openwrt-linux --with-pcap=linux
    make
    
    # 在winpcap/wpcap/libpcap/pcap-int.h 里加上一行 #include <string.h> 否则在 strlcpy 处会报错
    cd rpcapd
    # 修改 Makefile
    # 修改编译器,改成CC=mipsel-openwrt-linux-gcc
    make
    
    file rpcapd
    # rpcapd: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-musl-mipsel-sf.so.1, not stripped

    相关参考:https://talpachen.github.io/2016/07/20/Net/rpcapd/

     

    附我编译的
      适用于LEDE(musl)的ar71xx版rpcapd:rpcapd_ar71xx.7z
      适用于LEDE(musl)的ramips版rpcapd:rpcapd_ramips.7z

  • 我的Appium学习记录—— iOS 10.3.2 + Appium Desktop 1.0.2 真机实战

    ===========分割线===========

    20180121更新,升级到了Appium Desktop 1.3.1,详细更新内容见本文末,建议阅读本文前先看最近更新的内容。

    ===========分割线===========

    上一篇文章中,进了Android的坑,这次,要跳进更大更深的坑——iOS。

    百度google了一轮,最大的感触是:好多教程都不适用啊!要么是Appium版本旧,要么是iOS版本旧。想找一篇详细的“从入门到放弃”的教程都没有,之前搭Android环境的时候,能搜到很多十分详实的教程,而iOS的就有点蛋疼了。
    然而,坑还是要入的,所以,就从搭环境开始吧。

    阅读更多…

  • 使用fiddler抓手机https数据包

    原理

    我们手机在连Wi-Fi的时候,都有一个”代理服务器“的选项,而fiddler就是作为代理服务器,所以就能抓包了。而https呢,fiddler能作为中间人两边骗,所以还能抓https的包。

    步骤

    1. 开启抓包

    File => 勾选capture traffic

    2. 设置抓https和解密https

    Tools => fiddler options => https => capture https traffic => decrypt https traffic => Ignore server certificate errors
    由于对本机的数据包不感兴趣,所以把”from all processes” 改为 “from remote clients only”

    切换到Connections选项卡,勾选allow remote computers to connect,注意端口号是8888

    3. 安装certmaker插件

    默认的证书在Android和iOS下可能无效,所以,需要下载certmaker插件,双击安装后,重启fiddler。我用默认的证书,HTTPS确实解密不出来。

    4. 在手机上设置Wi-Fi代理

    主机为电脑IP,端口号为8888

    5. 给手机安装假的根证书

    在手机的浏览器进入http://电脑IP:8888,下载页面最下面的FiddlerRoot certificate,完成证书安装。

     

    相关参考:
    1. fiddler 手机 https 抓包, http://blog.csdn.net/wangjun5159/article/details/52202059

  • 使用Wireshark+SSH进行实时tcpdump远程抓包分析

    背景:有一台可以tcpdump的OpenWrt路由器,用它来抓下面的客户端的数据包。以前我一直都是把tcpdump的结果保存成.cap文件再传到PC上用Wireshark打开,直到今天,才学会了更方便快捷的办法。网上给出的命令是这样的:

    plink -ssh USER@HOST -pw PASS "tcpdump -s 0 -U -n -i br-lan -w - not port 22" | wireshark -k -i -

    其中plink是一个Windows下的命令行SSH客户端程序(Linux系统下改成ssh的相应命令)。试了一下,确实可以!

    为什么可以?

    由“|”可见它是通过管道来传输的,难道数据还能直接从输入输出传输?因此去看看文档,并找到了答案:

    在tcpdump的manpage中得知,最重要的参数是”-w -“,当文件名是”-“时,输出原数据包到stdout;-U参数是让数据包打印时直接输出到stdout而不是在输出缓存满后再输出;”-s 0″表示设置最大数据包长度为默认值(262144 Bytes)。

    而从Wireshark的帮助中可知,当抓包接口为”-“时,就从stdin读取数据,所以就ok了。

  • 我的Appium学习记录——从搭建环境到一个简单Android App测试实例

    本文简单记录了我的Appium入门学习历程。系统环境为Win7 x64,Appium client选择Python,Python版本为2.7。那就开始吧。

    环境的搭建

    1. JDK

    到Oracle官网下载,我安装的是8u121 x64版本。

    安装完,添加环境变量:JAVA_HOME,值:JDK安装的路径,如C:\Program Files\Java\jdk1.8.0_121

    修改环境变量Path,发现好像不用改了,因为安装JDK的时候已经加上了C:\ProgramData\Oracle\Java\javapath,所以没有按网上的教程做(在原来的末尾加上分号”;”,再加上%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

    再添加环境变量:CLASSPATH,变量值:%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

    2. Appium + node.js

    由于用的是Windows系统,Appium给Windows用户做了一个“一键安装包”——AppiumForWindows,到官网http://appium.io/下载即可。里面带了Appium和node.js。安装之后在环境变量Path中再加上Appium(也是node)所在的路径。
    阅读更多…

  • 使用selenium提取HTML中的内容

    例如我们需要提取

    <div id="a"><span id="b">content</span></div>

    中的content,以Python为例:

    第1个办法:使用text属性:先 elem=find_element_by_id(‘b’),再用 elem.text 属性;

    第2个办法:使用get_attribute / get_property方法,先 elem=find_element_by_id(‘b’),然后用 elem.get_attribute(‘innerHTML’);

    另外,如果 elem=find_element_by_id(‘a’),elem.get_attribute(‘innerHTML’) 获取到的会是<span id=”b”>content</span>

  • Python 文字转码问题的解决:ignore, replace

    用Python处理中文,肯定是每个人都曾经烦过的问题。

    生产环境是Python2,任务是把unicode字符串如 u’\uxxxx\uxxxx\uxxxx’ 转换为gbk保存,用的是str.encode(‘gbk’)方法。

    然而,经常会出现类似这样的异常:

    UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\uxxxx’ in position 0: illegal multibyte sequence

    原因是遇到了某些非法字符,而蛋疼的是,一大串字符串里面只要遇到一个非法字符,就会报错,这可不是我们希望的。

    解决办法:从帮助文档可知,函数原型是 encode([encoding], [errors=‘strict‘]),decode函数也是一样,默认用的是严格的策略,一遇到问题就抛出异常,我们可以把它改为’ignore’或者’replace’等值,就可以避免异常了。

  • OpenWrt USB挂载的一些备忘

    在挂载U盘时失败,dmesg提示找不到某些codepage,才知道这还和Native Language Support有关。

    要记得装上 kmod-nls-cp437、kmod-nls-iso8859-1、kmod-nls-utf8 这3个包。

    另外还有 kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb2 kmod-usb-storage kmod-usb-storage-extras block-mount kmod-fs-vfat kmod-fs-ntfs 等包。

  • 使用iptables模拟Symmetric NAT

    如果想让一个P2P程序不能穿透,比较好的办法就是把NAT类型改为对称型的,即Symmetric.

    之前以为NAT类型对于一个路由器是固定的,后来google到了使用iptables模拟的方法,当然Symmetric NAT也有很多不同的具体实现形式,这里模拟的是其中的一种。

    系统为OpenWrt,执行命令

    WAN_IF = “eth0”  # 你的WAN接口
    iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE --random

    即可。

     

    测试的结果是,对于同一个LAN IP:Port,对不同的Dst IP,映射到的WAN Port会差异比较大;而如果只改Dst Port,端口增量不大,可能为1。

     

    相关参考:
    http://albert-oma.blogspot.bg/2013/12/nat-router.html