- UID
 - 66114
 
 注册时间2010-4-1
阅读权限30
最后登录1970-1-1
龙战于野 
  
 
 
 
TA的每日心情  | 慵懒 2019-3-12 17:25 | 
|---|
 
  签到天数: 3 天 [LV.2]偶尔看看I  
 | 
 
 本帖最后由 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的基本原理,用一段代码来覆盖别一段代码(注意代码的长度) 
希望大家给点建议! 
 
SMC.rar
(26.69 KB, 下载次数: 2)
 |   
 
 
 
 |