首页
社区
课程
招聘
[原创]SMC之抛砖引玉(VC++6.0)
发表于: 2009-6-25 17:50 9482

[原创]SMC之抛砖引玉(VC++6.0)

2009-6-25 17:50
9482
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的基本原理,用一段代码来覆盖别一段代码(注意代码的长度)
希望大家给点建议!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
先占个位,以后有什么新的关于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();	
}
上传的附件:
2009-6-25 17:54
0
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
一下就沉下去了,顶起来!
是不是大家对SMC这东西不太感冒
2009-6-26 22:42
0
雪    币: 148
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,思想值得学习呀
2009-6-26 23:54
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
写的很好,正好学习

SMC是不是有限制,只能是CODE段可写
2009-6-27 10:19
0
雪    币: 319
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
看了你写的这些,稍有点感觉,但是还中不是很懂它的意思。。。功底太差。。
2009-6-27 10:41
0
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
#pragma comment(linker, "/SECTION:.text,ERW")//.text段一定要改成可读写
.text就是代码段,一般是不可写的,用了以上就可写了.
2009-6-27 14:47
0
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
我也是略知一二,哪里不懂,说出来,大家讨论讨论!
2009-6-27 14:48
0
雪    币: 60
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
这种方法实际意义在那?
2009-7-8 14:24
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rsa
10
ShellCode的自解码 还算SMC啊?
2009-7-8 20:20
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习中   正需要
2009-7-8 22:17
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好东西,顶一个.
2009-7-11 09:47
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
留名
2009-7-11 14:42
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
14
smc 在碰到多线程的时候咋办
2009-7-11 17:23
0
雪    币: 421
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
最近刚刚接触到SMC,跟LZ学习下。
2009-11-4 23:17
0
游客
登录 | 注册 方可回帖
返回
//