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

转载 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;
}


chrome以窗口模式运行(无地址栏与标签栏)

客户希望我们开发的不是一个B/S系统,而是一个客户端应用。 还有在一些需要全屏的需求的B/S系统的时候,需要隐藏所有浏览器的相关的内容。 按F11的全屏不能满足要求。   只需...
  • wlphyl
  • wlphyl
  • 2016年09月05日 17:01
  • 4824

隐藏在squid3的HTTP代理服务后面的主机IP地址为什么能检测到?

前几天在自己的linode上装了个squid3,同时打开了
  • zym0017d
  • zym0017d
  • 2014年04月08日 17:34
  • 2637

实现网站(网页)跳转且可隐藏跳转后网址的代码

点击打开链接 实现网站(网页)跳转且可隐藏跳转后网址的代码 澄子 2017-04-04 23:44:01 浏览304 评论0 阿里云 域名 根目录 http 网页设计 U...
  • bystarlight
  • bystarlight
  • 2017年05月05日 12:23
  • 2914

CPU的设计原理,数据总线和地址总线

如上图: SOC中包含了CPU,Flash,串口和内存 在嵌入式平台工作时,编译好的二进制文件先放在flash里面(暂存作用),开机的时候,CPU把二进制文件从flash拷贝到内存运行。总线:地址...
  • wxywxywxy110
  • wxywxywxy110
  • 2017年12月10日 16:07
  • 84

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

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

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

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

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

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

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

这篇文章所讲的例子和情况可以结合《epoll的LT模式和ET模式 》这篇看。 epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这...
  • u014069683
  • u014069683
  • 2014年03月25日 17:34
  • 991

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
  • 595

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

在编程当中有很多的设计模式,这些设计模式对于我们代码的可维护性,高内聚低耦合有很大的帮助。在java的数据库操作当中就使用了装饰模式和适配器模式。1,装饰模式在不必改变原类文件和使用继承的情况下,动态...
  • geferdezero
  • geferdezero
  • 2016年10月29日 13:20
  • 163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用模式地址原理,隐藏数据
举报原因:
原因补充:

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