[工具使用] tor浏览器的简介与其源码阅读

1786 3
M---M17 2022-4-6 14:43:09 | 显示全部楼层 |阅读模式
写在前面:笔者目前尚未成为认证会员,因此并不确定是否是因为笔者尚未做出发帖的原因,因此,笔者在大致浏览一番后,发现网站中没有针对tor的帖子。笔者私以为,在网络安全中,tor,i2p,freenet这些匿名方式,具有一定的可取之处。但是因为笔者目前身边设备与环境的原因,不能借助图片将所叙述的内容展现的更清楚,希望大家谅解。
首先是对tor的简介(摘自百度百科):
Tor(The Onion Router)是第二代洋葱路由(onion routing)的一种实现,用户通过Tor可以在因特网上进行匿名交流。最初该项目由美国海军研究实验室(US Naval Research Laboratory)赞助。2004年的后期,Tor成为电子前哨基金会(Electronic Frontier Foundation,EFF)的一个项目。2005年后期,EFF不再赞助Tor项目,但他们继续维持Tor的官方网站。
Tor专门防范流量过滤、嗅探分析,让用户免受其害。Tor在由“onion routers”(洋葱)组成的表层网(overlay network)上进行通信,可以实现匿名对外连接、匿名隐藏服务。
由于Tor可以匿名进行TCP传输,这就导致了被滥用的可能。路由器存放有一个“出口政策”(exit policy),内有各种地址、端口的组合规定,通过这个来区别哪些传输可以通过这个节点而离开Tor网络,这样就可能防范许多滥用的可能。潜在的滥用包括:
•        P2P:抛开合法性不谈,如果通过Tor网络来进行大量数据的传输,这就有些不礼貌了,毕竟洋葱路由器是由志愿者,花费自己的带宽创建起来的。
•        E-mail:匿名的SMTP很容易导致垃圾邮件的产生,一般Tor节点的“出口政策”,都拒绝对外连接到端口25(smtp的端口)。
•        蓄意破坏:由于不会被识破,用户有时会利用Tor来对协作网站进行破坏,这导致许多的网站,决定部分限制对Tor的通讯。
T
Tor不仅可以提供客户端的匿名访问,Tor还可以提供服务器的匿名。通过使用Tor网络,用户可以维护位置不可知的服务器。当然如果要访问这个隐蔽的服务,客户端也得安装Tor。
通过Tor指定的顶级域名(Top Level Domain,TLD).onion,可以访问其隐藏的服务。Tor网络可以识别自己的TLD,并自动路由到隐藏的服务。然后,隐藏的服务将请求交由标准的服务器软件进行处理,这个服务器软件应该预先进行配置,从而只侦听非公开的接口。如果这个服务还可以通过公共的因特网来访问,那也会受到相关连的攻击,这样就没有真正的隐藏起来。
Tor隐藏服务有个另外的好处,由于不需要公开的IP地址,服务就可以躲在防火墙和NAT背后。
Tor在中国大陆被许多人用于突破防火长城,这主要是因为中国大陆屏蔽了大量的海外网站和服务器。Tor会自动检测节点是否可达目标地址。如果返回错误无法到达,它会自动更换节点。相应地,这种技术也可以用在中国境外模拟中国境内的节点,以访问一些境外无法访问的内容。
而防火长城对于Tor一直没有很好的解决方法。现行比较有效的方法是对未使用SSL(HTTPS)加密的连接进行特征检测并重置连接,或对已知节点和网桥进行IP地址屏蔽,也有在中国境内创建Tor的虚假节点以对通过其传输的数据进行最大限度的审查。
作为反制,有部分大陆网民自发在中国境内建起网桥,帮助中国境内未能连接上Tor网络的用户连接。
•        2009年9月以后的一段时间内,使用的Tor的0.2.1.19版本,并不使用网桥的情况之下无法创建Tor的连接。然而使用的Tor的稳定版0.2.1.20,仍能够创建Tor的连接,突破网络封锁且不需要勾选“我的 ISP 阻挡了对 Tor 网络的连接”的选项,即使用网桥。从理论上来说,在使用网桥的情况下,Tor的总能创建连接,而不被封锁,因为网桥是可以动态更新的。
•        2010年6月3日前后的一段时间内,使用Tor的0.2.1.26版本,在使用Bridges的情况之下,创建Tor的连接也相当的困难,显示的信息是“创建Tor回路failed”,这说明防火长城成功侦测并截断了Tor的连接。但Tor的连接一旦创建后切断并不容易,所以Tor一旦成功创建连接后就无法被防火长城干扰。同年8月前后至今,Tor又可以连接上。
•        但在2011年1月之后,据大陆的网民反映Tor即使更换了网桥也无法正常连接上,但事实上这是网桥已经被屏蔽的结果。对于长期频繁使用和连接Tor的用户来说,由于Tor会缓存节点路由信息,所以只要这些节点或网桥没被封锁,他们照样能正常使用Tor。
•        自2011年10月后,当中国的一个Tor客户端与美国的网桥中继创建连接,一个中国的数据探针会在15分钟周期内尝试与Tor进行SSL协商和重协商,但目的不是创建TCP连接。12月后这种行为停止 。

接下来不饶舌了,讲一下tor的源码阅读:
传统互联网不被认为具有匿名性的一个原因是互联网服务提供商具有记录与追踪各网络节点间的连接的能力。即使信息内容可以通过加密传递而无法得知,但连接本身会具有记录,例如数据量,连接时间等信息。TOR虽然能创建并隐藏两电脑间的连接,两者间并无一个直接的可辨连接,但通过对连接记录进行流量分析,搜索连接时间与数据量来试图判别潜在的发送者或者接收者。且若链上节点产生变更则这一特征则会在该可记录网络中更为明显。大蒜网络是洋葱网络的变种,它在I2P的基础上将多个消息打包发送,以对抗流量分析。

伪流量功能的提出也是在可记录网络中对针对 TOR节点的分析进行对抗,流量分析可能通过时间,或者数据量等元数据进行数据挖掘找出节点间的关系链。所以团队设想,在TOR节点进行数据发送时产生一定的随机的或者恒定的虚假数据进行发送,以扰乱他们之间的元数据体现的潜在关系,则可将网络中隐藏的TOR节点进行一定的隐藏。

要么,在产生数据通讯时填入填充数据保持每次数据发送的大小一致,要么,产生多个通讯连接,可是因为TOR是工作于TCP流上的,TCP通过长连接进行通讯没法进行很好的多播或者广播,所以仍有争论。

tor 以 C 编程语言开发,故需要各位具备关于 C 的基本知识和开发经验,才能有较佳的源码分析体验。
此外,tor 为了实现跨 OS 平台兼容性,源码中经常出现 OS 相关的“条件编译”代码块,因此也要求各位对主流操作系统的用户态编程接口有一定程度的了解。


tor 主程序的入口点从 tor_main()(\tor-0.3.1.8\src\or\main.c)开始,实际上它是被 main()(\tor-0.3.1.8\src\or\tor_main.c)所调用的。

把 main() 从 main.c 中分离的原因在于——其它实现单元测试的源文件(test_*.c)中的 main() 函数,就可以链接 main.c ,
因为后者中不存在同名的 main() 函数,不会产生名称冲突。

首先来看 main(),它把调用 tor_main() 返回的整型值保存到局部变量 r 中,然后根据 r 的值来作出相应处理:
如果 0 <= r <= 255 ,则返回 r 的具体值到 main() 的调用者(通常会是负责初始化 Tor 进程运行环境的 CRT 启动例程),否则返回 1。

进一步而言,tor_main() 的开头部分就定义了一个整型变量 result,并初始化为 0, tor_main() 的内部逻辑会根据不同场景把
result 设定为相应的值然后返回给 main()。

main() 把自己收到的两个参数:argc(执行 tor 命令时的参数数量)和 argv(包含具体参数的列表/数组)原封不动的传递给 tor_main(),后者会在特定情况下用到这两个参数,比如调用 tor_init() 时传递过去,而 tor_init() 的主要任务之一,就是通过解析 argv 中携带的命令行
参数信息,来按照用户的意图初始化 tor 系统。

tor_main() 初始化自身的返回值后,我们遇到了第一个代码条件编译块,它是与 Windows 平台相关的。块中的内容仅在满足特定条件时才被构建为可执行代码。
对于 32 位 windows 平台,且没有定义“当堆数据损坏时,终止进程的功能(HeapEnableTerminationOnCorruption)”,则按照MSDN 文档的描述,将其枚举常量的值定义为 1
(HeapEnableTerminationOnCorruption 的作用是,假设 OS 的堆管理器检测到由进程使用的任意堆中有错误,堆管理器会调用 WER 服务[Windows 错误报告],然后终止进程,该功能打开后,无法由进程关闭)

若已定义该功能,则调用 HeapSetInformation() ,为它的第二个参数传入 HeapEnableTerminationOnCorruption,来打开该功能;
HeapSetInformation() 的第一个参数是到要设置的堆句柄,通常由 HeapCreate() 或 GetProcessHeap() 返回;
由于在此之前,tor_main() 并没有创建堆,所以堆句柄为 NULL;从 Windows Vista 开始,默认就启用了“低碎片堆”
(low-fragmenation heap,LFH),所以应用程序会使用或创建 LFH;关于 LFH,请参考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx
注意,即便 HeapSetInformation() 调用失败, OS 也会让应用程序继续运行,所以应该对 HeapSetInformation() 的返回值进行
检测:如果无法打开该功能,则 Tor 进程应该返回失败并退出——这正是源码中所遗漏的逻辑。

因为 Tor 是一个网络应用程序,需要通过网络频繁收发数据,程序中的任何编码缺陷,都可能导致远程代码执行,所以
添加此一调用可以缓解缓冲区溢出/堆栈溢出攻击造成的危害。
SetProcessDEPPolicy() 是位于 Kernel32.dll 中的 API 函数(参见相关 MSDN 文档中的“系统要求”),
而 Kernel32.dll 采用“加载时动态连接”到 Tor 进程的内存映射中,所以首先要以 GetModuleHandleA() 取得该模块的句柄,
(采用“运行时动态链接”的应用程序会调用 LoadLibrary/Ex())
在成功获取的前提下,以 GetProcAddress() 取得 SetProcessDEPPolicy() 函数的地址,将其赋给以“typedef”类型定义和
声明的函数指针“setdeppolicy”,如能解析到该函数的地址,就可以直接通过调用 setdeppolicy 来“尝试”打开 DEP。

而根据 MSDN 文档的描述,为 SetProcessDEPPolicy() 的 DWORD 型参数 dwFlags 传入 0x3 
表明 PROCESS_DEP_ENABLE(0x00000001)与 PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION(0x00000002)特性被同时打开,这与
源码中的注解相符。

最后,PROCESS_DEP_ENABLE(0x00000001)标志的设定,意味着在整个 Tor 进程的生命周期内,都无法关闭 DEP(如果成功启用)。

第一个条件编译块到此结束,其充分利用了 Windows 平台为应用程序提供的额外安全机制。

经过平台特定的代码块后,为了让 Tor 进程在崩溃时转储栈信息,以便后续的调试分析?调用了configure_backtrace_handler()函数(\tor-0.3.1.8\src\common\backtrace.c),来配置回溯处理程序。

configure_backtrace_handler() 接受一个指向字符常量的指针,这可以通过 get_version() 辅助例程获取到 Tor 应用程序的版本信息。

configure_backtrace_handler() 首先调用宏 tor_free()(\tor-0.3.1.8\src\common\util.h——83),来释放由 backtrace.c 静态分配的全局变量 bt_version,它是一个 NULL 指针,而 tor_free() 可以安全地释放 NULL 指针,而且把它引用的内存位置也设为NULL。

根据是否获取到版本信息,它调用 tor_asprintf() 向控制台/shell 输出相应的程序启动信息,然后调用
install_bt_handler() (在同一份源文件内),并将其返回值传递给 tor_main()。

如果注册崩溃回调函数失败,install_bt_handler() 返回 -1;否则返回 0,最终通知 tor_main() 成功“挂钩”!

阅读 backtrace.c 我们可以了解到:如果没有在编译时指定 USE_BACKTRACE 选项,install_bt_handler() 仅仅只是返回 0 到调用者——不会实际注册回溯处理程序。否则,install_bt_handler() 将针对包含崩溃在内的一些信号(SIGSEGV, SIGILL, SIGFPE, SIGBUS, SIGSYS, SIGIO),安装一致的回溯处理程序 crash_handler(),后者调用 backtrace() ,最终成生栈回溯信息。

这里我们要明确一点,当程序启动并正常运行时,只会调用 configure_backtrace_handler() 与 install_bt_handler();当程序崩溃或收到上述六种信号之一,crash_handler() 与 backtrace() 就会被调用(因此后两者才是 CallBack)。

我们可以从 crash_handler() 内部最后的 abort() 调用逻辑得证——只有在崩溃时才需要中止继续运行。

至此,我们解剖了 tor 程序入口点 tor_main() 中,到 configure_backtrace_handler() 为止的代码意图。

P.S.什么时候才能认证啊...
M---M17 2022-4-6 15:01:27 | 显示全部楼层
笔者帖子里的内容是从过去word笔记里copy过来的,若有错漏等,还请原谅!
顺便询问一下大佬,阅读TCP/IP的源码从哪里找?
位卑未敢忘忧国,技薄未愿负青春。
五云包子 2022-4-7 06:54:16 | 显示全部楼层
哇,写了好多啊,作者厉害
M---M17 2022-4-7 08:09:23 | 显示全部楼层
五云包子 发表于 2022-4-7 06:54
哇,写了好多啊,作者厉害

谢谢...大家可以试试看,tor源码还是很值得一读的...顺便再问一下有哪位大佬知道阅读TCP/IP的源码从哪里找?
位卑未敢忘忧国,技薄未愿负青春。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

M---M17

初级红客

关注
  • 11
    主题
  • 0
    粉丝
  • 0
    关注
精通C语言,Java,能熟练使用Kali Linux 精通DDOS以及渗透测试 熟悉ASP、CGI、PHP、JSP 经常研究蠕虫病毒,木马病毒与系统漏洞 了解OracleMysql,Ms Sql Sever数据库

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行