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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章