浅谈SMC技术,值得路过

来源:互联网 发布:淘宝网运动女装夏装 编辑:程序博客网 时间:2024/05/16 19:26
SMC是英文Self-Modifying Code的缩写形式,也就是说可以在一段代码执行之前先对它进行修改。
   SMC技术在DOS时代非常流行,因为DOS时代更接近系统底层。所以即便是现在实现SMC技术,都以汇编码最为方便。
  
      ‘利用SMC技术的这个特点,在设计加密方案时,可以把代码以加密形式保存在可执行文件中,然后在程序执行时再动态解密,这样可以有效地对付静态分析。因此要想了解被加密的代码的功能,只有动态跟踪或者分析出解密函数的位置编写程序来解密这些代码。’
      实际运用中,SMC技术用途是相当广泛的,并不仅仅是用来反跟踪。这是靠运用者的思维来决定。
      然而,可能会有人说SMC今天已过时。但这并不影响要求像我这样的初学者了解SMC技术,至少要知道SMC这个概念。



下面用老罗的一个例程来说明SMC技术的运用:

是用汇编,虽然SMC并不是汇编的专利!
可能路过的朋友对长篇的汇编码感到烦乱,不过没关系
我在这里作一点指引:
我们可以把这个例程结构理解为

1,invoke ShowMessage
2,修改ShowMessage proc
3,invoke ShowMessage


好了
我们看老罗的源码吧:
声明:
对于Ring3程序来说,.code段默认是不可写!所以MASM里通过链接改变其属性:

ml /c /coff %1.asm
link /subsystem:windows /section:.text,RWE %1.obj

/section:.text,RWE 这句指定了代码段(.text)的属性是RWE,含义是:R(ReadAble),W(WriteAble),E(ExecuteAble)!


;***********************************************
;程序名称:演示SMC原理
;作者:罗聪
;日期:2002-10-2
;出处:http://laoluoc.yeah.net(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://laoluoc.yeah.net)
;***********************************************
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

ShowMessage proto
ReplaceMent proto

.data
szMsg1 db "这是未执行SMC之前的代码!", 0
szMsg2 db "SMC已经执行!", 0
szCaption db "SMC demo by LC, 2002", 0
Replace_Len dd 0

.code
main:
                        ;第1次执行子程序ShowMessage,此时还没执行SMC操作
invoke ShowMessage



lea eax, ReplaceMentEnd                                        ;标号ReplaceMent的结束
lea edx, ReplaceMentStart                                         ;标号ReplaceMent的开始
sub eax, edx                                                          ;标号ReplaceMent的长度
mov Replace_Len, eax                                           ;把长度储存起来

                           ;关键代码!!!!!!!!!
lea esi, ReplaceMentStart                                        ;标号ReplaceMent的开始
lea edi, ShowMessageStart                                         ;原程序ShowMessage的标号的开始
mov ecx, Replace_Len                                               ;标号ReplaceMent的长度
rep movsb                                                             ;这里是最关键的语句!!!执行SMC操作!
                                                                           ;rep 表示循环执行后面的语句,同时ECX-1,直到为0。



                                                                           ;第2次执行子程序ShowMessage,此时已经执行了SMC操作。
                                                                           ;换句话说,ShowMessage的内容已经不是第一次运行时的内容了:
invoke ShowMessage

invoke ExitProcess, 0


                                          下面的都是定义
ShowMessage proc
                                                                               ;这里用“::”的话,就能够使标号成为全局性的
ShowMessageStart::
invoke MessageBox, NULL, addr szMsg1, addr szCaption, MB_OK
ShowMessageEnd::

                                                                              ;用nop来预留空间,以便后面的SMC能够成功执行;
                                                                              ;否则如果空间不够,将有可能产生不可预测的错误:
nop
nop
nop
nop
nop
nop
nop
nop

ret
ShowMessage endp

ReplaceMent proc
                                           ;将要用来SMC的代码:
ReplaceMentStart::
                                          其实现面的一段纯汇编码实现的意义等同于
                                                WIN32ASM中 invoke MessageBox, NULL, addr szMsg2, addr szCaption,
                                                MB_OK or MB_ICONINFORMATION
push MB_OK or MB_ICONINFORMATION
lea eax, szCaption
push eax
lea eax, szMsg2
push eax
push NULL
lea eax, MessageBox
call eax
ReplaceMentEnd::

ret
ReplaceMent endp



第二次执行ShowMessage proc时结果已经是跟第一次执行的不同了
因为在第二次执行之前ShowMessaeg proc内容已经被改变
所以结果当然不同

就是我们爆破软件那样,通过手工修改一定区域代码实现返回不同结果!
这里就是 Self-Modifying Code,让机器自己修改。

所以,SMC是非常实用,至少有必要了解的东西!




++++++++++++++++++++++++++++++++++++++++++++++++

后记:
这只是我的学习历程,没有什么别的意思,我在学的,大家一起分享。
我学了多少,吐多少出来,因为,这些都来自于老一辈的。
++++++++++++++++++++++++++++++++++++++++++++++++
原创粉丝点击