Hook技术初探:理解hook在软件中的基本原理

发布时间: 2023-12-20 20:07:28 阅读量: 33 订阅数: 17
# 1. 引言 ### 1.1 什么是Hook技术 Hook技术是指在软件或系统运行时修改或者拦截原有的逻辑流程,并在其中插入自定义的代码或功能的一种技术手段。通过Hook技术,可以在不修改源代码或者系统核心代码的情况下,对软件或系统进行定制、扩展或逆向工程等操作。 ### 1.2 Hook技术的应用领域 Hook技术在各个领域有广泛的应用,主要包括以下方面: - 软件定制化:通过Hook技术,可以在软件运行时修改或重载原有的功能,实现定制化需求。 - 软件插件化:通过Hook技术,可以在软件运行时动态加载、卸载插件,实现功能的灵活扩展。 - 逆向工程:通过Hook技术,可以拦截和修改软件的逻辑流程,进行逆向工程、调试和破解等操作。 - 安全防护:通过Hook技术,可以拦截和监控系统或软件的行为,实现安全防护和漏洞挖掘。 - 性能优化:通过Hook技术,可以监控和优化软件或系统的性能,实现性能调优和资源管理。 ### 1.3 本文结构概述 本文将深入讨论Hook技术的基本概念和原理,并介绍Hook技术的实现方式。同时,对Hook技术带来的潜在风险和挑战进行分析,并探讨相应的防护措施。最后,通过一个实例来详细展示使用Hook技术实现功能扩展的过程。最后,文章总结并展望了Hook技术的发展前景。 # 2. Hook的基本概念和原理 Hook技术主要基于操作系统提供的钩子机制实现,通过拦截、修改或替换目标函数或事件的行为,从而达到对系统或应用的控制和扩展的目的。在Hook技术中,常见的钩子类型包括函数钩子(Function Hook)、消息钩子(Message Hook)和系统钩子(System Hook)。这些钩子可以通过构建钩子链(Hook Chain)来形成复杂的钩子逻辑。 ### 2.1 函数钩子(Function Hook) 函数钩子是指通过拦截和修改目标函数的执行流程,来达到修改目标函数行为或监控目标函数调用的目的。函数钩子一般分为静态Hook和动态Hook两种实现方式。 #### 2.1.1 静态Hook 静态Hook是指直接修改目标函数的指令,从而改变其原有行为。静态Hook的实现方式有两种常见的方法: ##### 2.1.1.1 修改目标函数指令 通过定位目标函数的地址并修改函数体中的指令,将目标函数的行为替换为自定义的行为。以下是一个静态Hook的示例代码(使用C语言): ```c #include <stdio.h> int target_function(int arg) { printf("Original behavior of target function.\n"); return arg + 1; } int main() { // Hook target function int (*original_function)(int) = target_function; int hooked_function(int arg) { printf("Custom behavior of target function.\n"); return original_function(arg) - 1; } target_function = hooked_function; // Call target function int result = target_function(5); printf("Result: %d\n", result); return 0; } ``` 在上述代码中,通过修改`target_function`的指令,将其原有行为替换为自定义的行为`hooked_function`。当调用`target_function`时,实际执行的是`hooked_function`,从而改变了目标函数的行为。 ##### 2.1.1.2 重定向函数指针 通过修改目标函数的函数指针,将其指向自定义的函数,从而改变目标函数的行为。以下是一个静态Hook的示例代码(使用C语言): ```c #include <stdio.h> int target_function(int arg) { printf("Original behavior of target function.\n"); return arg + 1; } int hooked_function(int arg) { printf("Custom behavior of target function.\n"); return target_function(arg) - 1; } int main() { // Replace function pointer int (*original_function)(int) = target_function; target_function = hooked_function; // Call target function int result = target_function(5); printf("Result: %d\n", result); return 0; } ``` 在上述代码中,通过将`target_function`的函数指针指向`hooked_function`,实现了对目标函数行为的改变。当调用`target_function`时,实际执行的是`hooked_function`,从而改变了目标函数的行为。 ### 2.2 消息钩子(Message Hook) 消息钩子是指通过拦截系统消息队列中的消息,来监控和修改消息的传递和处理过程,从而实现对系统事件的拦截和修改的目的。消息钩子常用于窗口消息的处理和拦截,以实现自定义的界面交互。不同的操作系统和编程语言提供了不同的消息钩子机制。 ### 2.3 系统钩子(System Hook) 系统钩子是指通过操作系统提供的钩子机制,来拦截和修改系统级别的事件和行为,如键盘输入、鼠标操作、系统启动等。系统钩子常用于监控和控制系统的行为,实现特定的系统管理和安全策略。 ### 2.4 Hook链(Hook Chain) Hook链是指由多个钩子按照优先级顺序组成的链表结构。当事件或函数被触发时,系统会按照 Hook链的顺序调用钩子,并将事件传递给下一个钩子。通过Hook链的方式,我们可以实现复杂的钩子逻辑和多阶段的事件处理。在设计Hook链时,需要考虑钩子的优先级和执行顺序,以确保钩子能够正确地拦截和处理事件。 以上是Hook的基本概念和原理,下面我们将介绍Hook技术的实现方式。 # 3. Hook技术的实现方式 Hook技术的实现方式可以分为静态Hook和动态Hook两种,它们在实现原理和应用场景上有所不同。 #### 3.1 静态Hook 静态Hook是指在编译时或加载时修改目标函数的指令或重定向函数指针,以实现Hook的效果。静态Hook的主要应用场景是对程序或库进行修改,并且需要重新编译和部署目标程序。 ##### 3.1.1 修改目标函数指令 静态Hook的一种常见实现方式是直接修改目标函数的指令,使其在被调用时执行额外的逻辑。这种方式需要直接修改目标函数的机器码,通常需要对目标程序进行破解和修改。 ```java // 伪代码示例:静态Hook-修改目标函数指令 void originalFunction() { // 原始函数逻辑 } void hookedFunction() { // 钩子函数逻辑 // ... originalFunction(); // 调用原始函数 // ... } // 在静态Hook中将 originalFunction 的机器码修改为 hookedFunction 的机器码 ``` ##### 3.1.2 重定向函数指针 另一种静态Hook的实现方式是通过修改函数指针的地址,将原始函数指针指向钩子函数。这种方式不直接修改目标函数的机器码,而是修改函数指针的引用,实现了Hook的效果。 ```python # 伪代码示例:静态Hook-重定向函数指针 def original_function(): # 原始函数逻辑 def hooked_function(): # 钩子函数逻辑 # ... original_function() # 调用原始函数 # ... # 在静态Hook中修改 original_function 的函数指针,使其指向 hooked_function ``` #### 3.2 动态Hook 动态Hook是指在程序运行时修改函数调用关系,实现对目标函数的Hook效果。动态Hook的主要应用场景是对已经运行的程序进行修改,通常用于实现插件、调试、热修复等功能。 ##### 3.2.1 API Hook API Hook是指拦截和修改系统API函数的调用,常用于修改API函数的参数或返回值,实现功能增强或调试等目的。 ```go // 伪代码示例:动态Hook-API Hook func originalAPIFunc(param string) string { // 原始API函数逻辑 return "result" } func hookedAPIFunc(param string) string { // 钩子函数逻辑 // ... result := originalAPIFunc(param) // 调用原始API函数 // ... return result } // 在动态Hook中将 originalAPIFunc 的调用重定向到 hookedAPIFunc ``` ##### 3.2.2 Inline Hook Inline Hook是指直接修改目标函数的机器码,将其跳转到钩子函数的执行逻辑。这种方式需要动态修改内存中的目标函数机器码,实现Hook的效果。 ```javascript // 伪代码示例:动态Hook-Inline Hook function originalFunction() { // 原始函数逻辑 } function hookedFunction() { // 钩子函数逻辑 // ... originalFunction(); // 调用原始函数 // ... } // 在动态Hook中将 originalFunction 的机器码修改为跳转到 hookedFunction 的逻辑 ``` ##### 3.2.3 Detour Hook Detour Hook是指通过修改目标函数的入口地址,实现跳转到钩子函数逻辑的目的。这种方式不直接修改目标函数的机器码,而是通过修改函数入口地址的方式实现Hook。 ```java // 伪代码示例:动态Hook-Detour Hook void originalFunction() { // 原始函数逻辑 } void hookedFunction() { // 钩子函数逻辑 // ... originalFunction(); // 调用原始函数 // ... } // 在动态Hook中通过修改 originalFunction 的入口地址,使其跳转到 hookedFunction 的逻辑 ``` 动态Hook相比于静态Hook更具灵活性和适用性,在实际应用中被广泛采用。然而,动态Hook也带来了更多对系统和程序的影响,需要谨慎使用。 以上是针对Hook技术的实现方式的简要介绍,下一章节将对Hook技术带来的潜在风险和挑战进行深入探讨。 # 4. Hook技术带来的潜在风险和挑战 Hook技术虽然在许多领域中得到了广泛应用,但同时也带来了一些潜在的风险和挑战。在使用Hook技术时,需要认识到以下几个方面: #### 4.1 安全风险 由于Hook技术可以修改原始代码的执行路径或拦截系统消息,它也被广泛应用于恶意软件和黑客攻击中。攻击者可以使用Hook技术来实施各种安全攻击,如密码窃取、篡改数据、劫持网络流量等。 为了减少安全风险,开发人员在使用Hook技术时应该谨慎,并确保在合适的场景和目的下使用。同时,应该采取防护措施,如对Hook点进行权限控制、加密Hook代码、监控Hook操作等,以保障系统的安全性。 #### 4.2 兼容性问题 Hook技术可能会对目标系统的兼容性造成一定的影响。由于Hook技术依赖于特定的系统或框架实现,不同的操作系统、编程语言或版本之间可能存在差异,可能会导致Hook技术在某些环境下无法正常工作或引发异常。 为了解决兼容性问题,开发人员在使用Hook技术时应该了解目标系统的特点和限制,并进行充分的测试和验证。同时,及时跟进系统和框架的升级,以保证Hook技术的稳定性和可靠性。 #### 4.3 反Hook与Hook检测 在一些敏感场景中,可能存在对Hook技术的反制措施。目标系统可能采取一些手段来检测并阻止对其进行Hook操作,如Hook点的完整性校验、Hook黑名单、Hook检测工具等。 为了应对反Hook和Hook检测的问题,开发人员可以采取一些防范措施,如使用高级的Hook技术、隐蔽Hook点、修改Hook代码的执行路径等。同时,也可以进行一些Hook检测工具的研究和使用,以便及时发现和解决Hook相关的安全问题。 #### 4.4 防护措施 为了降低Hook技术带来的风险和挑战,我们可以采取以下几个方面的防护措施: - 对Hook点进行权限控制,限制只有特定的受信任的程序能够进行Hook操作。 - 使用加密算法对Hook代码进行保护,以防止Hook代码被非法篡改。 - 监控Hook操作,及时发现异常行为并采取相应的防御措施。 - 定期更新和升级Hook技术,修复已知的漏洞和安全隐患。 - 加强对系统和应用程序的安全防护,以减少被攻击的风险。 通过合理选择和使用Hook技术,并采取相应的安全措施,我们可以更好地应对潜在的风险和挑战,确保系统的安全性和稳定性。 # 5. 使用Hook技术实现功能扩展 ### 5.1 实例背景介绍 在本章中,我们将通过一个示例来演示如何使用Hook技术实现功能扩展。假设我们有一个编辑器应用程序,但是我们希望能够添加一个自定义的功能:在用户每次保存文件时,自动将文件备份到指定位置。 ### 5.2 实例功能需求分析 在这个实例中,我们需要对编辑器的保存函数进行Hook,以便在用户保存文件时执行我们自定义的备份操作。具体需求如下: 1. 在用户点击保存按钮时,触发Hook函数。 2. 在Hook函数中,将当前编辑器的文件内容备份到指定的备份路径下。 ### 5.3 通过Hook技术实现功能扩展 为了实现这个功能,我们将采用动态Hook的方式来实现。具体步骤如下: #### 5.3.1 API Hook 首先,我们需要找到编辑器的保存函数。在Java语言中,可以使用Java的反射机制实现。具体代码如下: ```java Class<?> editorClass = Class.forName("com.example.Editor"); Method saveMethod = editorClass.getDeclaredMethod("save"); ``` 这里假设编辑器的类名是"com.example.Editor",保存函数名为"save"。 然后,我们使用API Hook的方式,将编辑器的保存函数进行Hook,将其替换为我们自定义的函数。具体代码如下: ```java Method backupMethod = BackupUtil.class.getDeclaredMethod("backup"); backupMethod.setAccessible(true); MethodHookHandler.hook(saveMethod, new MethodCallback() { @Override public void before(Object[] args) { // 在保存函数之前执行自定义备份操作 backupMethod.invoke(null); } }); ``` 这里假设我们的备份函数在BackupUtil类中,并且保存函数为静态函数。 #### 5.3.2 Inline Hook 另一种实现动态Hook的方式是使用Inline Hook。这种方式需要通过修改函数的机器码实现。具体步骤如下: 1. 获取目标函数的地址。 ```java long address = getFunctionAddress("Editor!save"); ``` 这里假设编辑器的保存函数的地址为"Editor!save"。 2. 构造我们自定义的备份函数。 ```java void backup() { // 实现自定义备份操作 // ... } ``` 3. 使用Inline Hook将目标函数的机器码修改为我们自定义备份函数的机器码。 ```java void hookFunction(long address, long backupAddress) { // 修改目标函数的机器码为备份函数的机器码 // ... } ``` #### 5.3.3 Detour Hook Detour Hook是一种跳转式Hook方式,它通过修改函数中的跳转指令来实现Hook。具体步骤如下: 1. 获取目标函数的地址。 ```java long address = getFunctionAddress("Editor!save"); ``` 这里假设编辑器的保存函数的地址为"Editor!save"。 2. 构造我们自定义的备份函数。 ```java void backup() { // 实现自定义备份操作 // ... } ``` 3. 使用Detour Hook将目标函数的跳转指令修改为我们自定义备份函数的地址。 ```java void hookFunction(long address, long backupAddress) { // 修改目标函数中的跳转指令为备份函数的地址 // ... } ``` ### 5.4 运行效果演示 完成上述步骤后,我们可以运行编辑器应用程序,并进行保存操作。在每次保存时,会自动执行我们之前定义的备份操作。 ## 总结与展望 本章我们通过一个实例演示了如何使用Hook技术实现功能扩展。通过Hook技术,我们可以拦截和修改原有的函数行为,从而实现自定义的功能扩展。但同时,我们也需要注意Hook技术可能带来的潜在风险和挑战,并采取相应的防护措施。随着技术的不断发展,Hook技术在更多领域中的应用也将不断拓展。未来,我们可以期待Hook技术在软件开发和安全领域发挥出更大的作用。 ## 结语 通过本文的介绍,我们了解了Hook技术的基本概念、原理和实现方式。同时,通过一个实例演示了如何使用Hook技术实现功能扩展。希望本文能够帮助读者更好地理解和应用Hook技术。感谢您的阅读! # 6. 总结与展望 Hook技术作为一种重要的系统级编程技术,在软件开发和安全领域都有着广泛的应用。通过对系统函数或消息的拦截和篡改,可以实现诸如增强功能、性能监控、安全防护等目的。然而,随之而来的是一系列的潜在风险和挑战。对于开发者而言,需要在使用Hook技术时充分考虑各种可能带来的问题,并做好兼容性测试和安全防护。同时,随着操作系统和编程语言的发展,Hook技术也在不断演变和完善,未来将面临更多新的挑战和机遇。 #### 6.1 Hook技术的实际应用情况 在实际的软件开发中,Hook技术被广泛应用于以下领域: - **游戏作弊引擎**:通过Hook技术在游戏进程中进行数据篡改,实现作弊功能。 - **安全防护**:Hook技术用于检测和阻止恶意代码的执行,加固软件的安全性。 - **性能监控**:通过Hook技术获取系统或应用程序的关键信息,进行性能监控和优化。 - **功能扩展**:利用Hook技术可以在不改变原始代码的情况下实现功能的动态扩展。 #### 6.2 对Hook技术的未来发展的思考 随着操作系统和编程语言的不断发展,Hook技术也在不断完善和进化。未来,随着对软件安全需求的不断加强,Hook技术将在安全防护领域发挥更为重要的作用。同时,随着虚拟化、容器化等新技术的兴起,Hook技术也需要适应新的开发和部署环境,提供更加灵活和可靠的解决方案。 #### 6.3 结语 总体来说,Hook技术作为一种强大的编程技术,在软件开发和安全领域有着广泛的应用前景。开发者需要充分理解其原理和实现方式,同时谨慎使用,以免引发意外问题。随着技术的发展,Hook技术也将不断演变和完善,为软件开发和安全领域带来更多的可能性和机遇。

相关推荐

史东来

安全技术专家
复旦大学计算机硕士,资深安全技术专家,曾在知名的大型科技公司担任安全技术工程师,负责公司整体安全架构设计和实施。
专栏简介
本专栏深入探索了hook逆向技术,旨在帮助读者理解和应用hook技术在软件中的基本原理。专栏内部包括了多篇文章,从初步探索到深入理解,涉及了函数拦截与修改、Windows操作系统中的应用、API hook技术、注入目标函数、获取并修改目标函数的输入参数等多个方面。此外,还讨论了hook技术实现反调试与反反调试、在软件逆向工程中的角色、与恶意软件分析等相关话题。专栏同时探讨了hook技术在安全防御中的应用,并介绍了用户态和内核态hook技术的实现原理。此外,本专栏还介绍了hook技术对函数调用的监控与记录、应用程序信息截取、软件破解等实际应用场景,以及在游戏作弊、网络数据包嗅探、内存访问监控与修改以及移动应用开发中的应用。最后,本专栏还深入探讨了在Android系统中使用hook技术的实践。通过本专栏的学习,读者将能够全面了解hook逆向技术并有效应用于实际情境中。
最低0.47元/天 解锁专栏
VIP年卡限时特惠
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

MATLAB常见问题解答:解决MATLAB使用中的常见问题

![MATLAB常见问题解答:解决MATLAB使用中的常见问题](https://img-blog.csdnimg.cn/20191226234823555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdzaGFvcWlhbjM3Nw==,size_16,color_FFFFFF,t_70) # 1. MATLAB常见问题概述** MATLAB是一款功能强大的技术计算软件,广泛应用于工程、科学和金融等领域。然而,在使用MA

MATLAB四舍五入在物联网中的应用:保证物联网数据传输准确性,提升数据可靠性

![MATLAB四舍五入在物联网中的应用:保证物联网数据传输准确性,提升数据可靠性](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4da94691853f45ed9e17d52272f76e40~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp) # 1. MATLAB四舍五入概述 MATLAB四舍五入是一种数学运算,它将数字舍入到最接近的整数或小数。四舍五入在各种应用中非常有用,包括数据分析、财务计算和物联网。 MATLAB提供了多种四舍五入函数,每个函数都有自己的特点和用途。最常

MATLAB求导在航空航天中的作用:助力航空航天设计,征服浩瀚星空

![MATLAB求导在航空航天中的作用:助力航空航天设计,征服浩瀚星空](https://pic1.zhimg.com/80/v2-cc2b00ba055a9f69bcfe4a88042cea28_1440w.webp) # 1. MATLAB求导基础** MATLAB求导是计算函数或表达式导数的强大工具,广泛应用于科学、工程和数学领域。 在MATLAB中,求导可以使用`diff()`函数。`diff()`函数接受一个向量或矩阵作为输入,并返回其导数。对于向量,`diff()`计算相邻元素之间的差值;对于矩阵,`diff()`计算沿指定维度的差值。 例如,计算函数 `f(x) = x^2

【实战演练】LTE通信介绍及MATLAB仿真

# 1. **2.1 MATLAB软件安装和配置** MATLAB是一款强大的数值计算软件,广泛应用于科学、工程和金融等领域。LTE通信仿真需要在MATLAB环境中进行,因此需要先安装和配置MATLAB软件。 **安装步骤:** 1. 从MathWorks官网下载MATLAB安装程序。 2. 按照提示安装MATLAB。 3. 安装完成后,运行MATLAB并激活软件。 **配置步骤:** 1. 打开MATLAB并选择"偏好设置"。 2. 在"路径"选项卡中,添加LTE通信仿真工具箱的路径。 3. 在"文件"选项卡中,设置默认工作目录。 4. 在"显示"选项卡中,调整字体大小和窗口布局。

【进阶篇】将C++与MATLAB结合使用(互相调用)方法

![【进阶篇】将C++与MATLAB结合使用(互相调用)方法](https://ww2.mathworks.cn/products/sl-design-optimization/_jcr_content/mainParsys/band_1749659463_copy/mainParsys/columns_copy/ae985c2f-8db9-4574-92ba-f011bccc2b9f/image_copy_copy_copy.adapt.full.medium.jpg/1709635557665.jpg) # 2.1 MATLAB引擎的创建和初始化 ### 2.1.1 MATLAB引擎的创

MATLAB神经网络与物联网:赋能智能设备,实现万物互联

![MATLAB神经网络与物联网:赋能智能设备,实现万物互联](https://img-blog.csdnimg.cn/img_convert/13d8d2a53882b60ac9e17826c128a438.png) # 1. MATLAB神经网络简介** MATLAB神经网络是一个强大的工具箱,用于开发和部署神经网络模型。它提供了一系列函数和工具,使研究人员和工程师能够轻松创建、训练和评估神经网络。 MATLAB神经网络工具箱包括各种神经网络类型,包括前馈网络、递归网络和卷积网络。它还提供了一系列学习算法,例如反向传播和共轭梯度法。 MATLAB神经网络工具箱在许多领域都有应用,包括

【实战演练】MATLAB夜间车牌识别程序

# 2.1 直方图均衡化 ### 2.1.1 原理和实现 直方图均衡化是一种图像增强技术,通过调整图像中像素值的分布,使图像的对比度和亮度得到改善。其原理是将图像的直方图变换为均匀分布,使图像中各个灰度级的像素数量更加均衡。 在MATLAB中,可以使用`histeq`函数实现直方图均衡化。该函数接收一个灰度图像作为输入,并返回一个均衡化后的图像。 ```matlab % 读取图像 image = imread('image.jpg'); % 直方图均衡化 equalized_image = histeq(image); % 显示原图和均衡化后的图像 subplot(1,2,1);

加入MATLAB社区,获取支持:与用户互动,解决问题

![加入MATLAB社区,获取支持:与用户互动,解决问题](https://picx.zhimg.com/80/v2-da814f671eb1c07f57ff1465a27804be_1440w.webp?source=1def8aca) # 1. MATLAB社区概述 MATLAB社区是一个由用户、开发者和MATLAB专家组成的活跃社区,为MATLAB用户提供了一个交流、学习和解决问题的平台。该社区通过各种渠道提供支持,包括论坛、讨论组、社交媒体和技术支持团队。通过参与社区,用户可以获得帮助、分享知识,并与其他MATLAB爱好者建立联系。 # 2. 与用户互动 MATLAB 社区为用户

【实战演练】时间序列预测用于个体家庭功率预测_ARIMA, xgboost, RNN

![【实战演练】时间序列预测用于个体家庭功率预测_ARIMA, xgboost, RNN](https://img-blog.csdnimg.cn/img_convert/5587b4ec6abfc40c76db14fbef6280db.jpeg) # 1. 时间序列预测简介** 时间序列预测是一种预测未来值的技术,其基于历史数据中的时间依赖关系。它广泛应用于各种领域,例如经济、金融、能源和医疗保健。时间序列预测模型旨在捕捉数据中的模式和趋势,并使用这些信息来预测未来的值。 # 2. 时间序列预测方法 时间序列预测方法是利用历史数据来预测未来趋势或值的统计技术。在时间序列预测中,有许多不

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.