• 自修改代码(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

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

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

  • 相关阅读:
    提升CPU性能的几个方面
    浅谈CPU性能问题
    计算机组成原理 1— 冯.诺依曼体系结构
    让你的微信公众平台中支持QQ在线客服功能
    common.js
    layui中解决ashx筛选数据时中文乱码问题
    html 使用rem开发
    html有用的占位符
    前端教学网站
    纯js实现回到锚点
  • 原文地址:https://www.cnblogs.com/mavaL/p/2713246.html
Copyright © 2020-2023  润新知