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的基本原理,用一段代码来覆盖别一段代码(注意代码的长度)
希望大家给点建议!
高手啊~膜拜~ 一回来就膜拜啊~高手~ W兄能在壳上使劲打SMC的 本帖最后由 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]