[Android]安全第二步,基础的开始,分析平时写法与安全

今天又开始在大神的指导下学习知识了,开始基础的学习研究~

1.首先先说点别的,生成.h文件大家不知道还记得不,反正我记性差,已经忘掉了~~,没错忘掉了,那我想了个简单的方法,把顺序步骤写下,以后无脑操作吧,少年们
1.1在android studio的Terminal里面将路径移动到要生成.h文件的类, 也就是存在native方法的类的路径下面,
1.2然后使用 javah -jni -d ../jni com.ndk.blue.ndkdmo_0309.MainActivity
复制上面的一块,然后回车运行即可,然后.h粗来了, 其中 com.ndk.blue.ndkdmo_0309.MainActivity为存在native的类的路径,只要替换这里就好了~~

回归正轨,开始一天其实总结起来比较简单的东西,以备后用
2.开始的时候还真的摸不着头脑,遵从大神的指示开始从给不同的字符赋值写起。好伐,大概是神马样子呢,
首先从 指针这种开始,~~

char const * getXingChar() {
char * dest = "hello chars";
return dest;
}
然后我们轻易的在ida找到了这个方法,然后看到了以下

这个是不安全的,那么继续,
char const * getShuZuChar() {
char dest[] = "hello chars";
return dest;
}
数组这种呢,继续ida,


咦,红色圈圈的那些奇怪的16进制是什么,其实是ascii码,翻译一下你就知道,其实还是那些字符串,同时注意 __stack_chk_guard_ptr和___stack_chk_guard是根据读取本地保存的授权码,检验授权码是否合法,PC指向当前指令的下两条指令的地址

假定当前正在执行的指令的地址是xxxx0,那么pc的值就是xxxx8,也就是后面第二条指令的地址,当前指令的地址+8

char const * getSmallChar() {
const char dest[] = {'a','b','c'};
return dest;
}

这种初始化的操作我们可以发现每次赋值的操作

char  * getSimpleChar() {
char dest[33] = {0};
dest[0] = 'a';
dest[0] = 'a';
dest[0] = 'a';

return dest;
}



进行了初始化,然后再次赋值,也是能发现赋值内容滴

char const * getStrcpyChar() {
char a[20],c[]="i am strcpy";
strcpy(a,c);
return a;
}



我们看到了初次赋值的操作,然后在经过strcpy的方法进行赋值

下面是最后一种,同时有个小提示(在非c99标准中,以下是错误的,i的初始化不能再for里面, : 'for' loop initial declarations are only allowed in C99)
for (int i = 0; i < 333; i++) {
dest[i]='a';
}
初始化比较在int的外面,

char const * get333Char() {
char dest[333] = {0};
int i = 0;
for ( i = 0; i < 333; i++) {
dest[i]='a';
}
return dest;
}

0x14D就是初次初始化的数量,0X31是初始化的为字符1,0x61为第二次复制到数据,0XDE为第二次循环赋值的数据。

然后在看一个int的数组声明
int const * get333Int() {
int dest[333] = {651};
int i = 0;
for ( i = 0; i < 223; i++) {
dest[i]=4441;
}
return dest;
}





静态变量的位置
char const * getStatic33Char() {
static char dest[333] = {'w'};
int i = 0;
for ( i = 0; i < 223; i++) {
dest[i]='a';
}
return dest;
}



位置开始的地址


位置结束的地址

之间正好是0x14d

对于全局变量和静态变量
char dest333[333] = {45};
static char STATIC333[333] = {94};

dest333[333] 
在IDA中我们可以发现其在data区域中进行了初始化



所以我可以总结出开发过程中安全注意的事项:
1.非必要情况下尽量不使用指针的方法初始化数据
2.非必要情况下不要将数据存储到全局变量中
3.非必要情况下不要将数据存储到静态变量中
4.减少不同的类型尤其是占位长度不同的加减操作
5.内存对齐原则,尽量相同类型的变量放在一起
6.连续字符长度不得大于等于12个,且不等于10个
7.尽量使用堆而不是使用栈的方式加入struct等,




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值