@@ -86,25 +86,27 @@ dlv debug main.go
8686
8787### 4.3.2 移除调试信息
8888
89- 使调试更加困难的一种简单方法是从程序中删除调试信息。可以通过剥离调试信息(使用GNU的strip实用工具等)或通过设置开发工具来生成发行版(release版本)来完成。
89+ 使调试更加困难的一种简单方法是从程序中删除调试信息:
90+ - 通过设置集成开发环境、编译构建工具链来生成release版本而非debug版本,比如C/C++ 通过gcc/g++构建时需要显示 ` -g ` 选项来生成调试信息,生成release版本时可以去掉 ` -g ` 选项,必要时还可以开 ` -O ` 优化。
91+ - 对于有些编程语言的编译器默认生成调试信息,比如Go,对于已经包含了调试信息的二进制,也可以通过后期剥离调试信息来达成,比如使用GNU的 ` strip ` 工具从ELF文件中删除.debug_ sections。
9092
91- 一些商业软件公司更喜欢剥离调试信息,并能接受后续诊断过程中额外加载调试信息的性能影响,因为它允许销售工程师执行现场诊断。 当售后工程师进行内部咨询时,他们要做的就是插入调试信息并启动调试器。
93+ 一些商业软件公司更喜欢这种做法,并能接受后续诊断过程中额外加载调试信息以及加载调试信息带来的性能影响,它允许销售工程师执行现场诊断。 当售后工程师进行内部咨询时,他们要做的就是插入调试信息并启动调试器。
9294
93- gcc编译器使用选项”** -g** “在其生成的目标代码中插入调试符号信息。不指定该选项,则不输出任何调试信息。
94-
95- 如果尝试使用gdb调试它,gdb将提示找不到调试符号“no debugging symbols found”,将使调试人员很难看明白程序的状态、工作方式。
95+ 对于移除了调试信息的程序,如果尝试使用调试器调试它,因为没有源码相关的信息展示,调试人员将很难明白程序的状态、工作方式。往往看到gdb提示找不到调试符号“no debugging symbols found”,此时就会让很多调试人员望而却步、放弃调试。
9696
9797![ img] ( assets/clip_image005-3995693.png )
9898
99- 缺少调试符号并不能阻止所有人,一些反编译器可以获取机器代码并将其重铸为高级源代码。好消息是这些工具倾向于生成可读性较差的代码。
99+ 但是,缺少调试符号并不能阻止所有人,一些反编译器可以将机器指令重铸为高级源代码,好消息是这些工具倾向于生成可读性较差的代码。
100+
101+ > ps: 但是现如今借助于AI的力量,情况可能有所变化。现在AI有能力抽取这些源代码来推断更合适的函数名,让代码更容易被理解。这个方向也值得关注和研究。
100102
101103### 4.3.3 代码加盐
102104
103105如果内存占用不是大问题,并且您不介意对性能造成轻微影响,则阻止调试器的一种方法是定期在代码中添加不必要的语句。可以这么说,这使得尝试进行逆向工程的人更容易迷失。
104106
105- 这样,即使您在程序中附带了调试符号,也很难弄清正在发生的事情(尤其是如果您认为每个语句都有合法目的)。
107+ 这样,即使您在程序中附带了调试符号,也很难弄清正在发生的事情(尤其是如果您认为每个语句都有合法目的)。扰乱视听,让调试人员摸不着头脑,这样,我们就相对更安全。
106108
107- 这样,我们就达到了相对安全的目的 。
109+ > ps: 俗话说“道高一尺魔高一丈”,在真正的高手面前,“茅、盾、机、巧” 你知道、我也知道,经验和高敏感性能让高手察觉这部分代码的意图,排除掉它或者通过其他逐个击破的策略收敛到更少的关键代码 。
108110
109111### 4.3.4 混合内存模型
110112
@@ -118,5 +120,4 @@ gcc编译器使用选项”**-g**“在其生成的目标代码中插入调试
118120
119121### 4.3.5 本节小结
120122
121- 调试器确实是一个定位分析问题的好帮手,但是用在“坏人”手里也可能成为他们攻击正常程序的工具。因此,本节也重点对反调试技术进行了介绍。反调试技术也是一种重要的阻止逆向分析、提高安全性的手段。
122-
123+ 调试器确实是一个定位分析问题的好帮手,但是用在“坏人”手里也可能成为他们攻击正常程序的工具。因此,本节对反调试技术进行了介绍。反调试技术也是一种重要的阻止逆向分析、提高安全性的手段。反调试技术大大增加了逆向分析的难度,降低了逆向分析的成功率。尽管不能100%杜绝攻击者的调试行为,但是增加其难度,也是降低攻击成功率的一种手段。
0 commit comments