今天值班,晚上有了点空闲,听听歌逛下pediy,放松心情。瞅见《x64dbg快速找call插件》,是关于如何快速定位GUI中某个按键触发的代码位置,作者非常有想法,这可以快速帮助我们定位到想要的位置。测试了下,功能还不是很成熟,很多时候会莫名跑飞。作者开源了,没看,先记下,有时间再来研究,期待作者能够改进成成品。
接着,又看到了这篇《纯小白对一个类似于利用SMC技术病毒中Windows API解析》,发现了一个陌生的名词“SMC技术”,这是什么?文章不错,很详细,适合初学者。百度了SMC解释,找到了以前老罗写的东西,2002年的,很老的东西了。对这个我确实很熟悉,只是不知道这叫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 masm32includewindows.inc
include masm32includekernel32.inc
include masm32includeuser32.inc
includelib masm32libkernel32.lib
includelib masm32libuser32.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:
;第一次执行子程序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操作!
;第二次执行子程序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::
;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
end main
第二次执行ShowMessage proc时结果已经是跟第一次执行的不同了,因为在第二次执行之前ShowMessaeg proc内容已经被改变,所以结果当然不同。
就是我们爆破软件那样,通过手工修改一定区域代码实现返回不同结果!
这里就是 Self-Modifying Code,让机器自己修改。
这就是SMC。有时间,还是来看看 《纯小白对一个类似于利用SMC技术病毒中Windows API解析》https://bbs.kanxue.com/thread-277949.htm,里面提到一个“《恶意代码分析实战》这本书”,这本书我真是举双手推荐给大家,非常得好,同类的书可以不看了。强烈推荐!!!
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...