/*人为地在更改结构体指针的类型,从而手动地实现结构体指针在读取第一个字段之后便被截断,可以用来隐藏不想暴露的其他信息*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo(){
printf("inSide foo function\n");
}
typedef void (* Func)();
typedef struct _hidden_Node{
int value;
char name[20];
Func childFunc;
}Hidden,* PHidden;
typedef struct _simple_Node{
int value;
}Simple, * PSimple;
int main(int argc, char** argv){
PHidden node =(PHidden)malloc(sizeof(Hidden));
node->value = 10;
strcpy(node->name, "hidden node");
node->childFunc = foo;
PSimple pnode = (PSimple)node;
/*
Simple fakenode = {value: node->value};
(Simple *) simpleP = &(Simple fakenode);
(Simple *) simpleP = (Simple *) node;
*/
//p = (PSimple) node;
printf("******inside the real hidden node***********\n");
printf("value = %d\n", node->value);
printf("name = %s\n", node->name);
node->childFunc();
printf("******inside the simple node****************\n");
printf("value = %d\n", pnode ->value);
//printf("name = %s\n", pnode->name);
//node->childFunc;
return 0;
}
这种结构体强制截断的应用前提是结构中数据是按照初始化顺序存放的,故而只要从起始地址开始的数据是相同,那么结构体指针是可以强制转化,从而可以实现人为截断结构体暴露出的字段。这中方式是一种很简单但很有效的加密暴露机制。只要对方不知道目标结构体的所有的真实字段内容和排序(可人为地在字段中添加无效字段,以增加对方暴力破解的难度),那么是很难攻破这种看似简单实际很有效的保护手段。
printf("value = %d\n", pnode->value);
...
error C2039:"name"不是_simple_node的成员,请参见_simple_node的声明