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的基本原理,用一段代码来覆盖别一段代码(注意代码的长度)
先占个位,以后有什么新的关于SMC的心得就写在这里
当然也希望大家谈谈自己对SMC的心得!
-----------------------------------------------------------------------------
今天想了个笨办法,来得到函数的(机器码的)长度:
代码:
BOOL CSMCDlg::msgboxA()
{
::MessageBox(m_hWnd,"123456789","LILI",0);
return true;
}
int CSMCDlg::Aend()
{
return 0;
}
.......................
其它代码
.........................
BOOL CSMCDlg::msgboxB()
{
::MessageBox(m_hWnd,"987654321","LILI",0);
return true;
}
int CSMCDlg::Bend()
{
return 1;
}
在一个函数(A)的结尾写一个无用的函数(Aend),并取得它的地址,两个地址相减,就得到了函数(A)的长度
代码:
void CSMCDlg::OnOK()
{
int Alen,Blen;
msgboxB();
BOOL (CSMCDlg::*pa)(void)=&CSMCDlg::msgboxA;
BOOL (CSMCDlg::*pb)(void)=&CSMCDlg::msgboxB;
int (CSMCDlg::*paend)(void)=&CSMCDlg::Aend;
int (CSMCDlg::*pbend)(void)=&CSMCDlg::Bend;//这两个函数的代码不能一样,否则会被VC++优化,变成两个指针指向同一地址
__asm
{
mov eax,pa
mov ebx,paend
sub ebx,eax
mov Alen,ebx
mov eax,pb
mov ebx,pbend
sub ebx,eax
mov Blen,ebx
mov esi,pa
mov edi,pb
mov ecx,Alen//这里长度应该不会有错误了的
rep movsb
}
msgboxB();
}
本文介绍了自我修改代码(SMC)的基本原理和技术实现,包括如何通过汇编指令修改内存中的字符串及函数代码,展示了如何精确计算函数长度以确保代码覆盖的准确性。
6680

被折叠的 条评论
为什么被折叠?



