用模式地址原理,隐藏数据

转载 2015年11月21日 16:14:10


/// @file exam_1_2.c
/// @brief exam_1_2 * 用模式地址原理,隐藏数据的实验

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#ifndef IN
#define IN
#endif

#ifndef OUT
#define OUT
#endif

#ifndef INOUT
#define INOUT
#endif

void fnUseModeAddressHideInfo();
BOOL encryptBytesDataToModeAddr(
							 IN unsigned char cByteContent,
							 INOUT void** ppAddrBits76,
							 INOUT void** ppAddrBits54,
							 INOUT void** ppAddrBits32,
							 INOUT void** ppAddrBits10);

BOOL decryptBytesDataToModeAddr(
							 OUT unsigned char* pcByteContent,
							 INOUT void** ppAddrBits76,
							 INOUT void** ppAddrBits54,
							 INOUT void** ppAddrBits32,
							 INOUT void** ppAddrBits10);

void* GetModeAddrPointer(IN void* pAddrBits76);

int main(int argc, char** argv)
{
    fnUseModeAddressHideInfo();

    printf("END, press any key to quit\n");
    getchar();
    
    return 0;
}

/// 在每个变量模式地址上隐藏2bits数据
void fnUseModeAddressHideInfo()
{
	char cTmp = 0;
	int iTmp = 0;
	float fTmp = 0;
	double dblTmp = 0;
	unsigned char ucData = 0;

	void* pBit76 = NULL;
	void* pBit54 = NULL;
	void* pBit32 = NULL;
	void* pBit10 = NULL;

	srand(time(NULL));

	/// 不关心数据的值, 只要这些值在隐藏数据后,不被改变即可
	cTmp = rand() % 127; ///< char数据范围 0 ~ 128
	iTmp = rand();
	fTmp = 1.0f * rand() / 100;
	dblTmp = 1.0 * rand() / 100;
	// ucData = rand() % 0xff;
	ucData = 0x5A;
	// ucData = 0xA5;

	pBit76 = &cTmp;
	pBit54 = &iTmp;
	pBit32 = &fTmp;
	pBit10 = &dblTmp;

	/// 打印变量原值
	printf("original : cTmp is %p\n", cTmp);
	printf("original : iTmp is %p\n", iTmp);
	printf("original : fTmp is %p\n", fTmp);
	printf("original : dblTmp is %p\n", dblTmp);

	/// 打印要隐藏的数据
	printf("ucData = %p, encrypt...\n", ucData);

	/// 加密
	encryptBytesDataToModeAddr(
		ucData, 
		&pBit76, 
		&pBit54, 
		&pBit32, 
		&pBit10);

	/// 保证变量值不变
	printf("after enc : cTmp is %p\n", cTmp);
	printf("after enc : iTmp is %p\n", iTmp);
	printf("after enc : fTmp is %p\n", fTmp);
	printf("after enc : dblTmp is %p\n", dblTmp);

	/// 解密
	ucData = ucData + 13; ///< 先打乱ucData, 可以验证解密后的值是否为ucData原值
	decryptBytesDataToModeAddr(
		&ucData, 
		&pBit76, 
		&pBit54, 
		&pBit32, 
		&pBit10);

	printf("ucData = %p, decrypt over\n", ucData);

	/// 保证变量值不变
	printf("cTmp is %p\n", cTmp);
	printf("iTmp is %p\n", iTmp);
	printf("fTmp is %p\n", fTmp);
	printf("dblTmp is %p\n", dblTmp);

	/// 用指针取变量值
	printf("use pt get cTmp is %p\n", *((char*)GetModeAddrPointer(pBit76)));
	printf("use pt get iTmp is %p\n", *((int*)GetModeAddrPointer(pBit54)));
	printf("use pt get fTmp is %p\n", *((float*)GetModeAddrPointer(pBit32)));
	printf("use pt get dblTmp is %p\n", *((double*)GetModeAddrPointer(pBit10)));

	/** run result
	original : cTmp is 00000057
	original : iTmp is 00002CDD
	original : fTmp is C0000000
	original : dblTmp is 147AE148
	ucData = 000000A5, encrypt...
	after enc : cTmp is 00000057
	after enc : iTmp is 00002CDD
	after enc : fTmp is C0000000
	after enc : dblTmp is 147AE148
	ucData = 000000A5, decrypt over
	cTmp is 00000057
	iTmp is 00002CDD
	fTmp is C0000000
	dblTmp is 147AE148
	use pt get cTmp is 00000057
	use pt get iTmp is 00002CDD
	use pt get fTmp is C0000000
	use pt get dblTmp is 147AE148
	*/
}

BOOL encryptBytesDataToModeAddr(
								IN unsigned char cByteContent,
								INOUT void** ppAddrBits76,
								INOUT void** ppAddrBits54,
								INOUT void** ppAddrBits32,
								INOUT void** ppAddrBits10)
{
	BOOL bRc = FALSE;
	unsigned int iAddr = 0;
	unsigned int iDataTmp = 0;

	do 
	{
		if (((NULL == ppAddrBits76) || (NULL == *ppAddrBits76))
			|| ((NULL == ppAddrBits54) || (NULL == *ppAddrBits54))
			|| ((NULL == ppAddrBits32) || (NULL == *ppAddrBits32))
			|| ((NULL == ppAddrBits10) || (NULL == *ppAddrBits10)))
		{
			break;
		}

		/// save bit76 to addr
		iDataTmp = ((cByteContent >> 6) & 0x3);
		iAddr = (unsigned int)(*(unsigned int**)ppAddrBits76);
		iAddr = iAddr & 0xFFFFFFFC;
		iAddr |= iDataTmp;
		*(unsigned int**)ppAddrBits76 = (unsigned int *)iAddr;

		/// save bit54 to addr
		iDataTmp = ((cByteContent >> 4) & 0x3);
		iAddr = (unsigned int)(*(unsigned int**)ppAddrBits54);
		iAddr = iAddr & 0xFFFFFFFC;
		iAddr |= iDataTmp;
		*(unsigned int**)ppAddrBits54 = (unsigned int *)iAddr;

		/// save bit32 to addr
		iDataTmp = ((cByteContent >> 2) & 0x3);
		iAddr = (unsigned int)(*(unsigned int**)ppAddrBits32);
		iAddr = iAddr & 0xFFFFFFFC;
		iAddr |= iDataTmp;
		*(unsigned int**)ppAddrBits32 = (unsigned int *)iAddr;

		/// save bit10 to addr
		iDataTmp = (cByteContent & 0x3);
		iAddr = (unsigned int)(*(unsigned int**)ppAddrBits10);
		iAddr = iAddr & 0xFFFFFFFC;
		iAddr |= iDataTmp;
		*(unsigned int**)ppAddrBits10 = (unsigned int *)iAddr;

		bRc = TRUE;
	} while (0);

	return bRc;
}

BOOL decryptBytesDataToModeAddr(
								OUT unsigned char* pcByteContent,
								INOUT void** ppAddrBits76,
								INOUT void** ppAddrBits54,
								INOUT void** ppAddrBits32,
								INOUT void** ppAddrBits10)
{
	BOOL bRc = FALSE;
	unsigned int iAddr = 0;
	unsigned int iDataTmp = 0;
	
	do 
	{
		if ((NULL == pcByteContent)
			|| ((NULL == ppAddrBits76) || (NULL == *ppAddrBits76))
			|| ((NULL == ppAddrBits54) || (NULL == *ppAddrBits54))
			|| ((NULL == ppAddrBits32) || (NULL == *ppAddrBits32))
			|| ((NULL == ppAddrBits10) || (NULL == *ppAddrBits10)))
		{
			break;
		}
		
		*pcByteContent = 0;

		/// get bit76 to addr
		iDataTmp = (unsigned int)(*ppAddrBits76) & 0x3;
		*pcByteContent |= (iDataTmp << 6);
		
		/// get bit54 to addr
		iDataTmp = (unsigned int)(*ppAddrBits54) & 0x3;
		*pcByteContent |= (iDataTmp << 4);
		
		/// get bit32 to addr
		iDataTmp = (unsigned int)(*ppAddrBits32) & 0x3;
		*pcByteContent |= (iDataTmp << 2);
		
		/// get bit10 to addr
		iDataTmp = (unsigned int)(*ppAddrBits10) & 0x3;
		*pcByteContent |= iDataTmp;

		bRc = TRUE;
	} while (0);

	return bRc;
}

void* GetModeAddrPointer(IN void* pAddrBits76)
{
	void* pRc = NULL;

	do 
	{
		if (NULL == pAddrBits76)
		{
			break;
		}

		pRc = (unsigned int*)((unsigned int)pAddrBits76 & (~3));
	} while (0);

	return pRc;
}


相关文章推荐

保护模式进阶--读取1MB地址之外的数据

作者在介绍了一个简单的引导区程序后,就开始引入了DOS操作系统,我感觉在介绍一个从零开始的操作系统时,引入一个成型的操作系统不是一件很好的事情,因此非到万不得已,我还是坚持在pmtest1.asm程序...

微信开发原理 公众平台开发模式的数据交互方式

公众平台开发模式的数据交互方式 1.2 公众平台开发模式的数据交互方式 公众平台消息接口为开发者提供了与用户进行消息交互的能力。对于成功接入消息接口的公众账号,当用户发消息给公众账号时...
  • GoodShot
  • GoodShot
  • 2014年08月23日 10:37
  • 12087

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle     1. 主键1 2. uniq  in...
  • attilax
  • attilax
  • 2016年01月19日 00:04
  • 555

epoll学习笔记(ET模式下事件触发原理和数据收发存在的问题)

这篇文章所讲的例子和情况可以结合《epoll的LT模式和ET模式 》这篇看。 epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这...

数据库系统原理(4)--数据依赖与关系模式规范化

关系模式设计中的问题关系数据库设计要解决的主要问题 什么样的数据库模式才合理? 怎么分解才能满足要求? 衡量的标准是什么? 理论基础是什么? 如何进行实现? 关于好的数据库模式好的数据库模式是不会发生...

java数据库数据源框架原理--装饰模式和适配器模式

在编程当中有很多的设计模式,这些设计模式对于我们代码的可维护性,高内聚低耦合有很大的帮助。在java的数据库操作当中就使用了装饰模式和适配器模式。1,装饰模式在不必改变原类文件和使用继承的情况下,动态...

深入剖析DHCP服务IP地址自动分配原理

以下内容摘自笔者最新出版的《深入理解计算机网络》一书,目前该书已在当当网和京东网上可以正式预订了:当当网链接:http://product.dangdang.com/main/product.aspx...
  • lycb_gz
  • lycb_gz
  • 2013年01月14日 09:22
  • 24687
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用模式地址原理,隐藏数据
举报原因:
原因补充:

(最多只允许输入30个字)