-
-
[原创]编译,反编译,程序分析的推荐资料与备忘
-
发表于:
2019-3-21 19:31
11088
-
如题,不说废话,不求全,不求最好,只推荐我学习过程中感觉对我有帮助的资料。
程序分析大概是两个方法:静态分析,动态分析。然后动态分析还需要结合一些虚拟化相关的东西。
学习过程无非也就是把这两个方法学会,再加以练习。
学完了可以用来挖洞,逆向算法,分析样本,等等等等。
静态分析
静态分析的基础用的主要是编译器理论那套东西,个人感觉比较好的是
《编译器设计之路》(我不是托)
778K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8$3!0C8i4K6u0W2k6r3!0#2j5X3q4F1i4K6u0W2j5$3!0E0i4K6u0r3M7%4g2T1K9X3g2U0N6q4)9J5c8U0f1&6x3o6M7%4z5e0c8Q4x3V1j5`.
重点是类型分析,控制流分析,数据流分析,ast到IL的过程。
另外一定要看一看 SSA (Static single assignment)这种分析方法,哪怕你看不懂完整的算法,了解一下思路,也是非常有用的。
参考 7a4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4K6j5h3u0G2L8$3E0Q4x3X3g2Y4k6X3!0J5k6$3g2Q4x3X3g2A6L8Y4u0A6j5g2)9J5k6h3k6J5i4K6u0r3L8r3q4@1k6i4y4@1i4K6u0r3j5X3!0G2K9#2)9J5k6i4m8V1k6R3`.`. 。虽然我也没看明白全部。
有个之前常用的C#反编译器的算法,就是某种形式的SSA。
推荐看看 yinwang 的 pysonar 的思路。
严重建议不要把龙虎鲸书作为入门书籍,一方面是内容过时,一方面是写的太难懂了。
动态分析
动态数据流分析——污点分析。污点分析这玩意的思路太简单了,简单到甚至都不需要专门写一篇文章来说明,就是一个解释器。
坑其实都是在实现上。
一些动态逆向相关思路的博客
8cbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2K6j5$3W2W2L8X3y4W2L8X3g2@1i4K6u0W2j5$3&6Q4x3V1k6T1L8r3!0Y4i4K6u0V1y4e0b7@1x3U0R3H3i4K6u0V1y4o6x3K6x3o6R3#2i4K6u0W2K9s2c8E0L8l9`.`.
看个思路。
反编译
fbcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6&6N6i4u0A6j5$3S2W2N6W2)9J5k6h3y4G2L8g2)9J5c8X3#2A6M7Y4u0G2M7Y4y4Q4x3V1k6p5b7@1y4Q4y4h3k6V1k6h3y4G2L8i4m8A6L8r3q4@1K9h3!0F1i4K6g2X3N6r3S2W2M7$3W2K6i4K6u0W2M7r3c8X3
作者似乎还有其他论文,也推荐看一看。
我就是根据里面的方法,写了一个最简单的C#反编译器。
练习
推荐自己设计一个类似C语言的语法(直接参考C就好了),然后编译成C#的IL,再反编译回去。
虚拟化
虚拟化某种程度上是动态分析的基础。
这里只说windows上的。
R3程序用dynamorio。
dynamorio的好处是:
1. 编译简单。例子多,改改总有能满足你需求的
2. 可以输出指令的src和dst操作数,这在写污点分析或其他分析工具的时候,是非常有用的特性
(pintool我甚至都无法编译跑起来,就不推荐了)。
R0程序用bochs。
bochs自带 instrument 接口,可以方便记录指令,还能截获网卡的所有数据包,等等等等。
唯一缺点是慢。
bochs离线调试永恒之蓝还挺方便的,相当于开了上帝视角,比winddbg爽多了。
当然如果你只是想马上体验一下记录指令,可以试试CE(cheat engine)的指令记录功能。
最后
这条路其实并不好走,随便找个开发的工作比这轻松多了,工资又高。好饿,早知道不做安全了.jpg
不过如果以网络战的角度来看,又非常值得(太赛博朋克了)。
静态分析的基础用的主要是编译器理论那套东西,个人感觉比较好的是
《编译器设计之路》(我不是托)
778K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8$3!0C8i4K6u0W2k6r3!0#2j5X3q4F1i4K6u0W2j5$3!0E0i4K6u0r3M7%4g2T1K9X3g2U0N6q4)9J5c8U0f1&6x3o6M7%4z5e0c8Q4x3V1j5`.
重点是类型分析,控制流分析,数据流分析,ast到IL的过程。
另外一定要看一看 SSA (Static single assignment)这种分析方法,哪怕你看不懂完整的算法,了解一下思路,也是非常有用的。
参考 7a4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4K6j5h3u0G2L8$3E0Q4x3X3g2Y4k6X3!0J5k6$3g2Q4x3X3g2A6L8Y4u0A6j5g2)9J5k6h3k6J5i4K6u0r3L8r3q4@1k6i4y4@1i4K6u0r3j5X3!0G2K9#2)9J5k6i4m8V1k6R3`.`. 。虽然我也没看明白全部。
有个之前常用的C#反编译器的算法,就是某种形式的SSA。
推荐看看 yinwang 的 pysonar 的思路。
严重建议不要把龙虎鲸书作为入门书籍,一方面是内容过时,一方面是写的太难懂了。
动态分析
动态数据流分析——污点分析。污点分析这玩意的思路太简单了,简单到甚至都不需要专门写一篇文章来说明,就是一个解释器。
坑其实都是在实现上。
一些动态逆向相关思路的博客
8cbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2K6j5$3W2W2L8X3y4W2L8X3g2@1i4K6u0W2j5$3&6Q4x3V1k6T1L8r3!0Y4i4K6u0V1y4e0b7@1x3U0R3H3i4K6u0V1y4o6x3K6x3o6R3#2i4K6u0W2K9s2c8E0L8l9`.`.
看个思路。
反编译
fbcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6&6N6i4u0A6j5$3S2W2N6W2)9J5k6h3y4G2L8g2)9J5c8X3#2A6M7Y4u0G2M7Y4y4Q4x3V1k6p5b7@1y4Q4y4h3k6V1k6h3y4G2L8i4m8A6L8r3q4@1K9h3!0F1i4K6g2X3N6r3S2W2M7$3W2K6i4K6u0W2M7r3c8X3
作者似乎还有其他论文,也推荐看一看。
我就是根据里面的方法,写了一个最简单的C#反编译器。
练习
推荐自己设计一个类似C语言的语法(直接参考C就好了),然后编译成C#的IL,再反编译回去。
虚拟化
虚拟化某种程度上是动态分析的基础。
这里只说windows上的。
R3程序用dynamorio。
dynamorio的好处是:
1. 编译简单。例子多,改改总有能满足你需求的
2. 可以输出指令的src和dst操作数,这在写污点分析或其他分析工具的时候,是非常有用的特性
(pintool我甚至都无法编译跑起来,就不推荐了)。
R0程序用bochs。
bochs自带 instrument 接口,可以方便记录指令,还能截获网卡的所有数据包,等等等等。
唯一缺点是慢。
bochs离线调试永恒之蓝还挺方便的,相当于开了上帝视角,比winddbg爽多了。
当然如果你只是想马上体验一下记录指令,可以试试CE(cheat engine)的指令记录功能。
最后
这条路其实并不好走,随便找个开发的工作比这轻松多了,工资又高。好饿,早知道不做安全了.jpg
不过如果以网络战的角度来看,又非常值得(太赛博朋克了)。
动态数据流分析——污点分析。污点分析这玩意的思路太简单了,简单到甚至都不需要专门写一篇文章来说明,就是一个解释器。
坑其实都是在实现上。
一些动态逆向相关思路的博客
8cbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2K6j5$3W2W2L8X3y4W2L8X3g2@1i4K6u0W2j5$3&6Q4x3V1k6T1L8r3!0Y4i4K6u0V1y4e0b7@1x3U0R3H3i4K6u0V1y4o6x3K6x3o6R3#2i4K6u0W2K9s2c8E0L8l9`.`.
看个思路。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课