SMC之抛砖引玉(VC++6.0)

 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();  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值