BitShares插件开发入门

BitShares(比特股)是一种支持包括虚拟货币、法币、贵金属等有价值实物的开源分布式交易系统。关于BitShares,网上的资料有很多,这里不作具体赘述,本文主要对BitShares的插件的开发进行入门介绍。

在进行BitShares的插件开发前,需要具备以下技能:

  • 本地编译并搭建过BitShares节点/重钱包(必须)
  • 能看懂简单的C++代码(必须)
  • 使用过命令行版的钱包,或自已构造过json消息和节点进行简单的交互(可选)

推荐一下这个链接:BitShares (BTS) 中文技术文档,对于BitShares技术学习非常有帮助。

1. 目的

通过插件,可以直接获取到BitShares区块链上的各种数据,对BitShares进行扩展开发,实现定制化的功能。本文通过插件的方式来监控区块链上的转账操作,对插件的开发进行简单的介绍。

2. 目录结构

BitShares的插件源代码存放在libraries/plugins目录中,以我们要创建的monitor插件为例,新建的插件目录结构如下:

libraries/plugins/
├── monitor
│   ├── CMakeLists.txt (+)
│   ├── include
│   │   └── graphene ...

如何将多个.o合并为一个.o文件

一般情况下,多个.o都是打包成一个.a做为库文件使用,最近碰到个情况,需要将多个.o合并为一个.o文件,其实方法并不复杂,把几个.o重新链接一下就行了,一条命令就能搞定。

ld -r -s -o output.o origin1.o origin2.o

参数-r表示输出可重定位的文件(新生成的.o可以再次做为ld的输入),-s表示忽略输出文件中的符号信息;另外output.o是新生成的.o文件,origin1.oorigin2.o为原始的.o文件,还可以加上更多,或者直接*.o也可以。


配置OpenWRT的Samba共享服务

本想把wr703n挂个硬盘开共享服务,无奈它的USB输出电流太小,挂移动硬盘过于吃力,于是又入手了一个wr720n,2A的USB输出对移动硬盘是绰绰有余了,但是刷入OpenWRT后重新配置Samba服务折腾了不少时间,这次赶紧记下来以防下次又忘了。

由于OpenWRT添加用户需要额外安装shadow软件包,而OpenWRT本身又不太建议这样做,所以本文直接以root用户共享为例说明一下配置过程。

1. 安装Samba服务

执行如下命令安装Samba服务:

opkg update
opkg install samba36-server

注:上面的samba36-server是本文发布时的Samba服务软件包名称,其中数字36表示3.6.X版本,以后Samba版本更新的话可能找不到这个软件包,这个时候执行opkg list | grep samba搜一下就好。

2. 配置全局共享参数

配置文件路径为/etc/samba/smb.conf,将[global]中的invalid users = root注掉,像下面的样子:

[global ...

用 Python 实现端口映射功能

1 端口映射

举个例子来说明一下端口映射的作用。

有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,这个时候在C上开了一个Web服务,如何让A访问C的Web服务?

最简单有效的办法就是在B上开一个端口映射服务,然后让A访问B的某个端口,B将这个端口上的所有流量全部转发到C的Web服务端口上,同时将C上Web服务返回的流量也全部转发给A。这样对A来说,以B为跳板,实现了间接访问C上Web服务的目的。

2 实现流程

端口映射的原理并不复杂,本文以TCP为例介绍一下实现过程,简单画了个时序图(如下),这里就不再用文字赘述了。

TCP Mapping Runtime

需要注意的是,由于端口映射只是单纯的流量转发,对应用层数据不进行处理,所以对于多通道协议是无法支持的(如FTP协议)。

3 代码示例

按照上面的流程,Python实现如下(建议从后向前看):

# -*- coding: utf-8 -*-
# tcp mapping created by hutaow(hutaow.com) at 2014-08-31

import ...

Linux中查看进程占用内存的情况

Linux中查看某个进程占用内存的情况,执行如下命令即可,将其中的[pid]替换成相应进程的PID号:

cat /proc/[pid]/status

说明

/proc/[pid]/status中所保存的信息除了内存信息,还包括进程IDs、信号等信息,此处暂时只介绍内存相关的信息。

字段 说明
VmPeak 进程所使用的虚拟内存的峰值
VmSize 进程当前使用的虚拟内存的大小
VmLck 已经锁住的物理内存的大小(锁住的物理内存不能交换到硬盘)
VmHWM 进程所使用的物理内存的峰值
VmRSS 进程当前使用的物理内存的大小
VmData 进程占用的数据段大小
VmStk 进程占用的栈大小
VmExe 进程占用的代码段大小(不包括库)
VmLib 进程所加载的动态库所占用的内存大小(可能与其它进程共享)
VmPTE 进程占用的页表大小(交换表项数量)
VmSwap 进程所使用的交换区的大小

举例

显示进程cron的内存信息,通过 ...


德赛西威音乐e栈的破解程序

技术细节请参考上一篇文章《一种伪造服务器骗过某导航的音乐服务,从而延长有效期的方法》。根据原理用python+qt写了个现成的破解程序,界面简陋了些,下载链接及使用说明如下。

下载链接

使用说明

  1. TF卡或U盘先在车机上初始化,然后插入电脑,打开音乐e栈PC端。

  2. 用管理员身份运行程序。

    管理员身份运行程序

  3. 点击“Start Crack!”按钮。

    Start Crack

  4. 在音乐e栈客户端上,打开充值界面,卡号密码随便填。

    充值界面

  5. 点击确定,不出意外的话,即会提示充值成功,并且服务有效期也延长了99天。

    充值成功

  6. 可以随意下载电台或专辑了,并且可以同步到车上随时听了。

    破解结果

  7. 因为音乐e栈每次启动都会联网认证一次,所以这个破解程序每次打开客户端都需要执行一下上面的动作。

更新记录

  • 2014-08-01: v0.1 初始化。
  • 2014-08-24: v0.2 有效期从99天延长到999天,另外补充设置响应消息长度值,防止客户端由于处理字符串不当导致出错。
  • 2014-12-27: v0.3 解决部分车机序列号无法解析的问题。

一种伪造服务器骗过某导航的音乐服务,从而延长有效期的方法

某导航提供的音乐服务(音乐e栈),和虾米合作的,需要付费使用,前段时间本来想上网搜个破解版,结果没搜到,索性自已分析了一下它的交互方式,找出了个通过充值认证来延长服务有效期的方法。方法本身不复杂,主要是因为它的认证机制略显简陋,本文主要从技术角度来说明过程,仅供参考学习。

1 原始界面

音乐e栈服务过期

如上图,插入经过车机初始化过的TF卡后,启动音乐e栈客户端,显示当前服务有效期为0天,并提示需要充值续费。如果点击下载专辑的按钮,提示不允许下载。

2 寻找入手点

既然提示让续费,那就看看续费过程是什么样子。

先随便输个卡号密码试试:

充值卡无效

竟然用CS架构来做充值认证,实在是土的掉渣,就从这里入手了。

3 交互过程

把刚才进行充值时的报文用Wireshark抓下来,看看它是如何交互的。

1) 报文

充值失败的报文

可以看到,充值认证的流量走的是TCP协议8080端口,对端连接的服务器地址是42.156.140.44,这个暂时放一边,先来看看请求和响应报文分别填了什么内容。

2) 请求消息

请求消息内容

上图中可以看到,充值请求消息虽然走的是8080端口,但实际内容并非HTTP协议。

TCP负载的开头44个字节是一段二进制数据 ...


限制用户登陆Linux的时间

只允许某用户8:00-12:00登陆,用简单粗暴的方式实现。

设置个定时任务(执行crontab -e编辑任务列表):

0 8 * * * passwd -u username
0 12 * * * passwd -l username

其中username替换成想限制的用户名;命令passwd -u是锁定用户,passwd -l解锁。

附:设置cron定时任务列表的格式:分 时 日 月 星期 命令,如果时间字段是*则表示所有,还可以加上/n表示每隔n个单位时间执行一次;最后跟需要执行的命令。


删除Git的提交记录

不小心提交了错误的代码到库上,想要删除最近一次提交的所有信息(包括代码和日志)。

删除最后一次的提交记录:

git reset --hard HEAD^

删除最后3次的提交记录:

git reset --hard HEAD~3

已经提交到远端库上了?那就还需要将本地库强行同步到远端库上(注意执行这个命令前先检查一下有没有别人的提交记录,不然会覆盖他人的修改):

git push --force

基于libpcap的开发实例

libpcap是Unix/Linux平台中用于网络数据包捕获的函数库(Windows版本为winpcap)。本文通过实例来说明其使用方法。

1 安装libpcap库

TCPDUMP官网下载最新的libpcap源代码,解压到本地后,编译并安装即可,注意安装时需要使用root权限。

./configure
make
make install

2 实例代码

代码完成的功能是抓取指定网卡的数据包,并将数据交给回调函数处理(这里回调函数只是打了个桩,没有做实质性的处理)。

首先定义一个基本类型的头文件(basetype.h),将数据类型封装一下:

#ifndef _BASETYPE_H_
#define _BASETYPE_H_

#define OK (0)
#define ERROR (1)

#define YES (1)
#define NO (0)

typedef void VOID;

typedef char CHAR;
typedef char ...