以前调试Linux驱动的时候,知道在kernel里使用dump_stack可以打印出内核栈信息,可以很方便查看函数的调用关系。 现在我才知道glibc也支持获取栈信息,并且有相关的函数:
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
以下是Man里的示例代码
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
myfunc3(void)
{
int j, nptrs;
#define SIZE 100
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
static void /* "static" means don't export the symbol... */
myfunc2(void)
{
myfunc3();
}
void
myfunc(int ncalls)
{
if (ncalls > 1)
myfunc(ncalls - 1);
else
myfunc2();
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "%s num-calls\n", argv[0]);
exit(EXIT_FAILURE);
}
myfunc(atoi(argv[1]));
exit(EXIT_SUCCESS);
}
编译时要加 -rdynamic 参数,否则只有函数地址,没有函数名
$ gcc -rdynamic prog.c -o prog
$ ./prog 3
backtrace() returned 8 addresses
./prog(myfunc3+0x5c) [0x80487f0]
./prog [0x8048871]
./prog(myfunc+0x21) [0x8048894]
./prog(myfunc+0x1a) [0x804888d]
./prog(myfunc+0x1a) [0x804888d]
./prog(main+0x65) [0x80488fb]
/lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]
./prog [0x8048711]
2014年7月25日星期五
2014年7月23日星期三
squid 访问google.com出现503错误的解决方法
最近通过https连接到squid,访问google不太正常,查看日志发现大量的 CONNECT www.google.com:443 出现503错误,并且503出现的概率为80%,换了几个版本的squid 都是一样的情况,怀疑是squid的问题,因为同一台服务器上shadowsocks就没有问题。
我尝试修改配置文件, 增加 dns_v4_first, 指定tcp_outgoing_address,指定dns_nameserves, 问题依旧。
查看squid文档, 发现squid连接失败后不会重试
我尝试修改配置文件, 增加 dns_v4_first, 指定tcp_outgoing_address,指定dns_nameserves, 问题依旧。
查看squid文档, 发现squid连接失败后不会重试
Option Name: | connect_retries |
---|---|
Replaces: | |
Requires: | |
Default Value: | Do not retry failed connections. |
于是增加
connect_retries 3
重启squid, 客户端访问google,观察了一上午, 503错误再也没有了。
2014年7月15日星期二
上大学网公布的中国虚假大学名单2014
转载自真相网, 原文链接 http://dafahao.com/chinese-fake-universities-list-2014.html
【真相网2014.7.15】近日,上大学网发布了第三批中国虚假大学名单警示榜,其中包括了60多所,涉及中国19个省市的大学。之前也公布了二批虚假大学名单,请急于求学的学生和家长警惕受骗上当。
这些虚假大学以假仿真,很多听上去像是十分正规的大学,其实都是骗人的,比如说,中国信息科技大学、上海同济医科大学和广东科技管理大学等等。而这份警示榜中的信息都是由热心网友、受骗考生,过往应届高考生家长提供。这让人不禁思考,监管部门到底是干什么的。
上大学网公布的榜单声明说“警示榜中的各种虚假信息均由热心网友、受骗考生或应往届高考生家长提供,经上大学网认真搜集、对比和核实调研后确认,请广大低学历或急需提升文凭的朋友、2014年及今后的广大高考生和家长在高考志愿填报时仔细甄别、不要轻信。”
榜单中包括北京经济管理学院、中国信息科技大学、首都财经管理学院等60所,涉及中国19个省市的大学。这是上大学网对外公布的第三批虚假大学。前两批分别是2013年6月26日发布的《上大学网百所中国虚假大学警示榜》和2013年7月23日发布的《上大学网第二批中国虚假大学警示榜(共50所)》。
在上大学网第一次公布的名单中,有超过七成的虚假大学都号称校区在北京,并往往以“中国”、“首都”、“北京”等词企图混水摸鱼。
“上大学”网负责人表示,分数特别低、又想上大学的孩子,最可能会上假大学的当。“上大学”网发现,很多假大学广告上的学校简介都是抄袭真大学往年的简介。
有媒体评论说,这类假大学仿冒名称、以假乱真,再盗用正牌高校的照片,对高校不甚了解的考生和家长,极有可能信以为真。
附录:
第三批 《上大学网第三批中国虚假大学警示榜(2014年60所)》,为上大学网专家团队在前二批基础上精心研发而成,属于上大学网在2014年全国高考后最新原创首发的大学榜单。
上大学网第三批中国虚假大学警示榜(2014年60所)
第一批 2013年6月26日首发:上大学网百所中国虚假大学警示榜
第二批 2013年7月23日首发:上大学网第二批中国虚假大学警示榜(共50所)
2014年7月9日星期三
通过ssl安全地使用代理服务器
通常我们使用代理服务器时,浏览器与代理服务器之间的传输都是明文的,虽然https是加密的,但是https会话开始时依然是明文的,例如,https会话开始时浏览器发送的
CONNECT www.google.com:443 HTTP/1.1
就是明文的,审查者仍然可以知道你访问了什么网站,如果是他们不喜欢的网站,他们就可以阻止你继续访问。
本文教你如何使用ssl保护你与代理服务器之间的连接。
需要的软件
服务器端squid 2.6以上,编译时开启了--enable-ssl
chrome/chromium浏览器 加SwitchySharp插件
服务器端配置
如果你的系统软件仓库中带的squid编译时没有加 --enable-ssl选项,你需要下载squid的源码,添加--enable-ssl选项重新编译
生成证书
如果你有现成的证书可以直接使用,如果没有,生成一个自签名的证书,命令如下
openssl genrsa -out server.key 2048
openssl req -new -x509 -out server.crt -key server.key -days 365
squid 配置
在配置文件squid.conf中添加
https_port 8004 cert=/path/to/server.crt key=/path/to/server.key
防火墙需要允许8004的连接
iptables -A INPUT -p tcp --dport 8004 -j ACCEPT
浏览器设置
到目前为止(2014-07)只有chrome/chromium支持ssl连接到代理服务器,并且只能通过pac配置
新建一个文本文件命名为proxy.pac,添加如下内容
function FindProxyForURL(url, host){
return "HTTPS your_proxy_server_name:8004";
}
把your_proxy_server_name 替换成你的代理服务器ip或域名
在SwitchySharp中新建一个情景模式,命名为myproxy_ssl,选择自动配置,然后点击导入pac文件,选择你刚才新建的proxy.pac文件,保存
切换到myproxy_ssl,测试代理服务器能否正常连接
证书问题
如果使用的是自签名的证书,浏览器会报证书错误,把服务器上的server.crt作为信任的根证书导入浏览器的信任列表即可
参考来源
http://wiki.squid-cache.org/Features/HTTPS
http://dev.chromium.org/developers/design-documents/secure-web-proxy
CONNECT www.google.com:443 HTTP/1.1
就是明文的,审查者仍然可以知道你访问了什么网站,如果是他们不喜欢的网站,他们就可以阻止你继续访问。
本文教你如何使用ssl保护你与代理服务器之间的连接。
需要的软件
服务器端squid 2.6以上,编译时开启了--enable-ssl
chrome/chromium浏览器 加SwitchySharp插件
服务器端配置
如果你的系统软件仓库中带的squid编译时没有加 --enable-ssl选项,你需要下载squid的源码,添加--enable-ssl选项重新编译
生成证书
如果你有现成的证书可以直接使用,如果没有,生成一个自签名的证书,命令如下
openssl genrsa -out server.key 2048
openssl req -new -x509 -out server.crt -key server.key -days 365
squid 配置
在配置文件squid.conf中添加
https_port 8004 cert=/path/to/server.crt key=/path/to/server.key
防火墙需要允许8004的连接
iptables -A INPUT -p tcp --dport 8004 -j ACCEPT
浏览器设置
到目前为止(2014-07)只有chrome/chromium支持ssl连接到代理服务器,并且只能通过pac配置
新建一个文本文件命名为proxy.pac,添加如下内容
function FindProxyForURL(url, host){
return "HTTPS your_proxy_server_name:8004";
}
把your_proxy_server_name 替换成你的代理服务器ip或域名
在SwitchySharp中新建一个情景模式,命名为myproxy_ssl,选择自动配置,然后点击导入pac文件,选择你刚才新建的proxy.pac文件,保存
切换到myproxy_ssl,测试代理服务器能否正常连接
证书问题
如果使用的是自签名的证书,浏览器会报证书错误,把服务器上的server.crt作为信任的根证书导入浏览器的信任列表即可
参考来源
http://wiki.squid-cache.org/Features/HTTPS
http://dev.chromium.org/developers/design-documents/secure-web-proxy
2014年7月8日星期二
使用混淆之后的ssh连接vps
gfw对ssh的干扰严重到正常的远程管理都受到了影响,把ssh运行在3389,443端口都无济于事。
通过google我发现了两种解决方案:
1.使用obfsproxy
2.使用obfuscated-openssh
obfsproxy是tor项目的,根据google的结果,目前已经阵亡,于是我使用第二种方案。
服务端安装方法
git clone https://github.com/brl/obfuscated-openssh.git
cd obfuscated-openssh
自定义安装位置, 启用md5和pam支持
./configure --prefix=/home/dingjun/openssh-obfs --with-md5-passwords --with-pam --with-pid-dir=/home/dingjun/openssh-obfs/var/run --with-privsep-path=/home/dingjun/openssh-obfs/var/empty
通过google我发现了两种解决方案:
1.使用obfsproxy
2.使用obfuscated-openssh
obfsproxy是tor项目的,根据google的结果,目前已经阵亡,于是我使用第二种方案。
服务端安装方法
git clone https://github.com/brl/obfuscated-openssh.git
cd obfuscated-openssh
自定义安装位置, 启用md5和pam支持
./configure --prefix=/home/dingjun/openssh-obfs --with-md5-passwords --with-pam --with-pid-dir=/home/dingjun/openssh-obfs/var/run --with-privsep-path=/home/dingjun/openssh-obfs/var/empty
make
make install
配置
修改openssh-obfs/etc/sshd_config文件加入如下配置
ObfuscatedPort 8009 # 监听端口
ObfuscateKeyword wfgkcuf # 混淆使用的keyword
启动
sudo /home/dingjun/openssh-obfs/sbin/sshd
客户端
windows 下使用potty, potty是打了混淆补丁的putty,下载地址
http://www.mrhinkydink.com/potty.htm
运行potty.exe, 界面和putty一模一样的
在ssh选项里选中 Enable key exchange obfuscation, 然后输入服务器上配置的ObfuscateKeyword
现在就可以使用了
使用cat /var/log/message 测试一下,连接没有被断开
配置
修改openssh-obfs/etc/sshd_config文件加入如下配置
ObfuscatedPort 8009 # 监听端口
ObfuscateKeyword wfgkcuf # 混淆使用的keyword
启动
sudo /home/dingjun/openssh-obfs/sbin/sshd
客户端
windows 下使用potty, potty是打了混淆补丁的putty,下载地址
http://www.mrhinkydink.com/potty.htm
运行potty.exe, 界面和putty一模一样的
在ssh选项里选中 Enable key exchange obfuscation, 然后输入服务器上配置的ObfuscateKeyword
现在就可以使用了
使用cat /var/log/message 测试一下,连接没有被断开
订阅:
博文 (Atom)