首页
社区
课程
招聘
[原创]代码保护之网
发表于: 2013-10-8 22:00 16005

[原创]代码保护之网

2013-10-8 22:00
16005
仅供小菜娱乐!高手莫要见笑.

测试环境:XP3
编译环境:VS2005

  一般的程序保护中监测代码只检查程序中的代码是否遭到了篡改是不够的, 应监测代码相互之间也要进行防篡改检查, 如果监测代码相互之间不进行防篡改检查, 就会很容易地被攻击者各个击破。
  
  将被检查的代码区域组成一张网, 组成这张网的代码区域可以是程序中的代码, 也可以是监测代码或者响应代码, 监测代码计算一或多个代码区域的HASH值, 一旦监测代码发现某个区域中的代码遭到了篡改, 响应代码就会用存放在其他地方的备份代码替换掉该区域中的代码(或者做其它事), 多个监测代码可以检查同一个区域, 这样可能通过增加监测和响应代码的数量或者使它们之间关系变得更为复杂.

下面是简单的小示例:

1.要计算某个函的的hash值,得获得该函数大小.
//获取函数的大小: 参数 address 指向函数的起始地址
uint32 GetFunSize(addr_t address)
{
	BYTE Fun_end[] = {0x88, 0x88, 0x88, 0x88};	//函数结尾的标志
	uint32 Fun_size = 0;
	while(TRUE)
	{
		if(!memcmp((BYTE*)address + Fun_size, Fun_end, sizeof(Fun_end)))	//找到结束标志
		{

			while(TRUE)
			{
				if ( 0XC3 == *((BYTE*)address+ Fun_size))//找到返回
				{
					return Fun_size;
				}

				Fun_size++;
			}
		}
		Fun_size++;
	}
}


2.计算函数hash值.
//获取Hash值: 参数 address 指向函数的起始地址, Size函数大小
uint32 hash(addr_t addr, int Size)
{
	if (NULL == addr || 0 == Size)
	{
		return 0;
	}
	uint32 h = *addr;

	for (int i=1; i<Size; i++)
	{
		addr++;
		h ^= *addr;;
	}
	return h;
}


3.简单调用,监测是否被修改,如果遭到了篡改,拷贝备份好的修复.
int Decrypt(int User_Key, int Data)
{
	DWORD lpflOldProtect = 0;
	uint32 FunSize = GetFunSize((addr_t)GetKey);
	uint32 hGetKeyVal = hash((addr_t)GetKey, FunSize);
	printf("GetKey 大小为 : %X\n",FunSize);
	printf("GetKey HASH为 : %X\n",hGetKeyVal);

	//判断是否被修改,被修改后恢复
	if( hGetKeyVal != GetKeyHASH )
	{
		//将备份函数拷过去
		VirtualProtect(GetKey,FunSize, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
		memcpy(GetKey, GetKey_Back, FunSize);
		VirtualProtect(GetKey,FunSize, lpflOldProtect, &lpflOldProtect);
	}

	int key = GetKey(User_Key);
	__asm
	{
		JMP END
		_emit 0x88
		_emit 0x88
		_emit 0x88
		_emit 0x88
	}
END:
	return Data ^ key;

}


4.运行成功后如下图所示


5.具体请看源码
src.rar
bin.zip

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (21)
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
SHAFA  ~~~
2013-10-8 23:15
0
雪    币: 788
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
思路还是可以的~
2013-10-9 09:03
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Nice,赞一个。
2013-10-9 09:06
0
雪    币: 802
活跃值: (725)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
收藏下~~
2013-10-9 10:11
0
雪    币: 212
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
方法很好,检测到数据发生改变后还能做些触发事件发挥空间大大的。
2013-10-9 12:33
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有写出的代码,就有破解的方法
2013-10-10 12:06
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
恩,是个可以丰富和延伸的好思想。
2013-10-10 12:38
0
雪    币: 219
活跃值: (1634)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
支持一个!!
2013-10-10 12:43
0
雪    币: 9560
活跃值: (2391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
直接修改了备份是什么后果
2013-10-10 14:24
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
做个记号..支持一下.
2013-10-10 17:29
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
还有客户端 与网络端的 相互校验 ,  以及使用 key 来解压代码 , 这些东西 都很邪恶
2013-10-10 21:00
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
安全编程相关的哈
2013-10-11 07:59
0
雪    币: 3902
活跃值: (5940)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
14
呵呵,怎么说呢, 就说人吧, 不管你怎么保养,最终都难逃一死, 但我们还是会去努力工作 整钱 泡妞 等等.
2013-10-11 11:18
0
雪    币: 1906
活跃值: (712)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习,学习了
2013-10-11 11:38
0
雪    币: 10867
活跃值: (17252)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
先收藏,看得懂的时候好好来学习
2013-10-11 15:19
0
雪    币: 396
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很好的思路,值得学习
2013-10-11 18:11
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
因为ID+头像+举的例子(保养),所以lz是MM?
2013-10-11 19:13
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
好东西。。。才优秀呀。。
2013-10-11 19:59
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
建议发现被修改直接退出……
2013-10-11 20:13
0
雪    币: 1042
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我也是小三,
2013-10-12 18:55
0
雪    币: 882
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
很不错的思路,学习了
2013-10-14 14:57
0
游客
登录 | 注册 方可回帖
返回
//