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