您的位置:首页 > 移动开发 > Android开发

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

2016-11-23 20:58 555 查看
今天又开始在大神的指导下学习知识了,开始基础的学习研究~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等,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息