命令行参数_结构体

命令行参数 main( int argc, char *argv[ ], char *envp[ ] )  //char *argv[ ]也可以写作char **argv   命令行参数默认有一个,就是exe本身。   程序名 + 参数 在一起叫 命令行参数。   Shell:外壳程序,调

指针3

指针3 指针数组:元素为指针构成的数组。   数组指针:指向数组的指针。 语法: 例一: int nAry[3] = {1, 2, 3}; 指向nAry[3]的指针: int (*ptrAry)[3] = &nAry; //注意,nAry前面的&必须写,因为nAry的类型是int,不加&amp

指针2

拾遗 需求和概要设计与语言无关。   需求: 写目标,给用户看,可能需要用户参与编写和签字。   概要设计: 概要设计写实现过程,不谈细节,以用户操作流程为主,不体现开发环境。概要设计可能需要需求人员和开发人员共同编写。   详细设计(重点):要体现流程以及函数之间的关联,例如画树状图。给

指针1

指针 指针与地址的区别:地址没有类型,指针有类型。   不同类型的指针必须显示转换,否则编译时报错。   定义指针时,*要贴近变量名,增加可读性。   指针必须处于可控状态,1、是NULL(0值状态)2、指向一个已经控制的变量。   指针出问题,大部分情况是类型搞错了。发现相关问

软件安全2

投简历技巧: 找产品核心算法,指出优点和不足,并提供改进方案,最后附上个人简历。   少用全局变量,全部变量不方便移植。   防止程序被破解的关键点: 劫持数据、无明文、无溢出、不同用户名对应不同序列号、加密代码。   SMC(Self Modifying Code)技术,就是一种将可执行

拾遗 vc6带的工具undname可以还原经过名称粉碎的变量,用法: undname –f 粉碎名 取多个个字符时,可以在单引号中写多个字符,例如将abc赋值给n: int n = ‘bca’;  //因为不是字符串,所以abc在内存里以小端形式排列 宏 #define不替换“”中的字符串和‘’中的字符。

_cinit()

_cinit()函数负责初始化全局变量(包括静态全局变量)。当全局变量初值为函数返回值时,会在main()函数之前调用,由_cinit()调用。代码如下: 此时,g_nTest值为0,函数调用关系如下: 执行fun()函数后,g_nTest值为10,然后才执行main()函数。 _cinit()还负责初始化8087浮点

变量

拾遗 0xC0000096 表示无效代码或者不可访问代码。   只要调用WINAPI,有检查错误的机会,一定要检查,例如检查API的返回值。   慎用全局变量: 所有程序都可见这个变量; 控制它保证读写不冲突。   debug版本的关键编译参数:/Od /Zi release版本的关键编译

加密算法_作用域

加密算法 加密算法一般存在碰撞点,所以要保证碰撞点分布均匀,并在只有一个碰撞点的区间使用。   通过不可逆算法得出的结果,一般叫校验码。   校验和算法: 以加密“abc”为例, 将‘a’左移21位,得到结果再右移7位,结果记为A; 将‘b’左移21位,得到结果再右移7位,结果记为B; ‘c’同上,

程序安全

程序安全 输入字符串一定要检查长度!!!!gets()因为不检查长度,所以极不安全,弃之。 用scanf输入字符串,要控制输入长度,例如scanf(“%16s”,sz)。   限制输入字符串长度防止溢出攻击; 关键文字加密,防止出现明文; 关键数据要通过运算得出结果,防止暴破; 验证结果,例如,密码通过不可逆