自修改代码(SMC)技术学习

<<加密与解密>>第14章的SMC(Self-Modifying Code)技术实现很有意思,这节的练习例子将SMC技术与其它一些反跟踪技术结合起来,有一种海陆空联合作战的赶脚:单步跟踪,软断点,硬件断点都要中作者的陷阱,从而不是跑飞就是掉进系统DLL领空迷失,无法正确跟踪到后面的源代码,更别说分析了.

作者太高估咱们(异或是唯独自己太蠢?)的水平,书上和例子代码注释都讲解得不够详细,我冥思苦想了好大半天,翻出书来复习标志寄存器TF位,SEH执行流程等,才明白了那几句代码所谓的SEH暗桩是怎么回事:

0040112D  |.  66:9C         pushfw
0040112F  |.  804C24 01 01  or      byte ptr [esp+1], 1
00401134  |.  66:9D         popfw
00401136  |.  90            nop


后来我查到这篇帖子,里面有作者的详细讲解了:

http://bbs.pediy.com/showthread.php?t=70444

 

不过我对作者的这句话的正确性表示怀疑:"如果试图单步跟踪这段代码,误入陷阱的话,在这里就是单步跟踪到 popf 时,则不会再产生单步调试异常,直接运行到其后的 nop 指令处,由于没有运行异常处理函数因而 EAX 和 EDX 寄存器值也就没有交换,最后计算的密钥也就是错误的。"

我参考王爽的<<汇编语言第二版>>第12章11节"单步中断"以及<<C++反汇编与逆向分析技术揭秘>>第16章"OllyDbg的工作原理"后认识到,几种类型的断点实际上都是通过系统的SEH异常处理机制来达到下断的.单步跟踪时产生异常后,系统检测到调试程序有附加调试器,故优先将处理权给了调试器,而不是程序自己设置的SEH handler,不是调试状态的话,一切正常.总结SEH的处理流程就是这样的:

(1)系统检测到程序若有附加调试器,就把异常丢给调试器进行处理.
(2)否则执行线程中距离栈顶最近的SEH的异常处理函数(TEB的第一个数据成员指针指向其).
(3)若失败,则依次尝试执行SEH链表中后续的异常处理函数.(线程SEH处理实际上是分两轮的,第二轮是unwind操作)
(4)若线程SEH链中所有handler都失败,则执行进程级别SEH处理.(SetUnhandledExceptionFilter,谓之top level)
(5)若还是失败,系统默认的SEH处理被执行:程序崩溃的对话框弹出.

 关于这个SMC实现例子,我这个小菜鸟思考了一会儿,应该怎么破.它目的即是反追踪,阻止你边调试边阅读代码?我想的是:我们先运行之,发现其功能是弹出消息框,查看导入函数有MessageBoxA,于是尝试对该API下断,F9运行后再Ctrl+A让OD重新分析,就能读到所有解密后的代码了.但是我觉得不够好,如果怎么能够直接调试跟踪整个程序流程,而又灵活的不踏入作者设下的陷阱里,像凌波微步一样在里面穿行,才是最合我心意的.不过以我的水平,没找到方法.   

 

最近学了一些关于SEH机制及其ASM级实现原理的知识,认为这个东东确实是了不得,不但可以挪用来制造陷阱反追踪,还可以利用它来溢出攻击(见<<0day安全:软件漏洞分析技术>>第6章1节),下面链接中的文章讲到还能通过它进入Ring0!

http://bbs.pediy.com/showthread.php?t=154271

 

我现在有一种赶脚,学到越来越多的底层知识后,我似乎有一种主动的想把各个知识点联系起来,像拼图一样逐渐完整自己对整个系统的理解的意图,但是又不得其法,力不能及,一会儿脑子就像灌铅了一样钻不开了.总结来说:想要融会贯通是很难的,得靠长时间的积累和沉淀~

 

最后,怎么感觉自己这篇随笔跟题目对不上啊...没事,咱是玩单机版博客的,自娱自乐挺有意思....

转载于:https://www.cnblogs.com/mavaL/archive/2012/10/06/2713246.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值