whypro 发表于 2010-6-2 17:42:38

SMC的学习!

本帖最后由 whypro 于 2010-6-2 18:32 编辑

SMC是什么意思?它的英文名叫“Self Modifying Code”,顾名思义,就是“代码自修改”
先来个简单的,来改数据
代码:
CString cs1,cs2;
cs1="123456789";
cs2="abcdefghi";
__asm
{
mov esi,cs1//A函数地址
mov edi,cs2//B函数地址
mov ecx,9h
rep movsb
}
MessageBox(cs2);
通过MOVSB命令来改变数据
下面来看怎样代码:
代码:
void CSMCDlg::OnOK()
{
msgboxB();
BOOL (CSMCDlg::*pa)(void)=&CSMCDlg::msgboxA;
BOOL (CSMCDlg::*pb)(void)=&CSMCDlg::msgboxB;
   __asm
   {
       mov esi,pa
       mov edi,pb
      mov ecx,pb
      sub ecx,esi//长度要注意,这里因为A.B写得很近所以可以这样得出
      rep movsb
    }
msgboxB();
}
BOOL CSMCDlg::msgboxA()
{
::MessageBox(m_hWnd,"123456789","LILI",0);
return true;
}
BOOL CSMCDlg::msgboxB()
{
::MessageBox(m_hWnd,"987654321","LILI",0);
return true;
}
#pragma comment(linker, "/SECTION:.text,ERW")//.text段一定要改成可读写
这就是SMC的基本原理,用一段代码来覆盖别一段代码(注意代码的长度)
希望大家给点建议!

杀很大 发表于 2010-6-2 18:51:47

高手啊~膜拜~

lgjxj 发表于 2010-6-2 19:27:49

一回来就膜拜啊~高手~

杀很大 发表于 2010-6-2 19:43:58

W兄能在壳上使劲打SMC的

whypro 发表于 2010-6-2 19:43:58

本帖最后由 whypro 于 2010-6-2 19:46 编辑

;FASM汇编 自修改 SMC 代码测试

format pe console
entry start
include 'F:\fasmw\INCLUDE\WIN32AXP.INC'
;include 'Win32AXP.inc'
;include 'List.inc'

section '.text' code readable writeable executable ;确保代码段有写入权限,必须的

start:
callf1
callf2

;memcpy(f1.Start,f2.Start,f2.CodeLen)
movesi,f2.Start
movedi,f1.Start
movecx,f2.End-f2.Start
repmovsb

;再次调用f1和f2
callf1
callf2

ret

f1:
.Start=$
cinvokeprintf,buf1
ret
.End=$
;确保有足够的空间来存放f2的代码
repeat(f2.End-f2.Start)-(f1.End-f1.Start)
    nop
endrepeat

f2:
.Start=$
cinvokeprintf,buf2
ret
.End=$

data import
librarymsvcrt,'msvcrt.dll'
importmsvcrt,\
    printf,'printf'
end data


buf1db"SMC 前",0dh,0ah,0
buf2db"SMC 后",0dh,0ah,0
页: [1]
查看完整版本: SMC的学习!