苏嵌//张朋//2018.07.18

本文记录了一天内关于函数调用过程、数组操作及多维数组使用的深入学习经历,包括掌握函数调用流程、数组遍历技巧、多维数组应用及指针数组使用等内容。

苏嵌                                                                                                                                   项目实战

学习日志                                       姓名:张朋                       日期:2018年07月18日

 

 

 

 

今日学习任务

 

  1. 函数调用的过程。
  2. 数组的遍历、数组名的作用、数组指针变量的作用及使用。
  3. 学会使用多维数组并掌握其应用。
  4. 了解并学会左右法则的使用。

今日任务完成情况

 

(详细说明本日任务是否按计划完成,开发的代码量)

今日任务按计划完成。

  1. 掌握了函数的调用过程,更加深刻的理解了数组使用及其遍历的过程。
  2. 进一步的学会了左右法则的使用。
  3. 知道了return和exit()的区别,懂得了如何让函数返回多个值。
  4. 更加深刻的知道了多维数组的使用以及指针数组的使用。

今日开发中出现的问题汇总

 

  1. 函数调用的过程分为哪几个步骤?
  2. 调用子函数时传值和传地址的区别?
  3. return和exit()的区别?
  4. 让子函数返回多个值的方法是什么?

 

今日未解决问题

 

今日开发收获

通过今天的学习,让我对指针和数组的理解更加的深刻了,明白了函数有关的相关知识(以前所不知道的知识)。懂得了怎么让函数返回多个值。还有就是数组名的作用,以及如何画多维数组的内存分布图。同时,通过今天课上的代码练习,让我进一步的增强了写代码的能力。

 

自我评价

 

(是否按开发规范完成既定任务,需要改进的地方,与他人合作效果等)

 

 

今天可以跟上老师的步骤, 在今天的学习中,我懂得了之前一直模糊不清的知识点,让我不再对多维数组和指针感到恐惧,反而更加喜欢编写这方面的程序。但是,由于只是刚刚开始理解这些方面的知识,所以编写代码的时候还是非常吃力的。这就要求自己在课下多花些时间编写代码,通过大量的练习不断的提高自己的能力。

其他

 

 

 

//1.数组的遍历方法(多种方法)(源代码如下)

  1 #include <stdio.h>
  2 
  3 #define MAX_LEN 3
  4 int main()
  5 {
  6     int i;
  7     int arr[MAX_LEN];
  8     int * parr = arr;
  9 
 10     int arr_len;
 11 
 12     for(i = 0; i < MAX_LEN; i++)
 13     {
 14        // scanf("%d",arr + i);
 15      //  scanf("%d",parr + i);
 16         //scanf("%d",&arr[i]);
 17         scanf("%d",parr++);
 18     }
 19     parr = arr;
 20     for(i = 0; i < MAX_LEN; i++)
 21     {
 22        // printf("arr[%d] = %d\n",i,arr[i]);
 23         printf("arr[%d] = %d\n",i,*parr++);
 24     }
 25 
 26 
 27     return 0;
 28 }
//2.进行多个系统功能函数的重写,源代码如下:

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 char *my_strcpy(char *dest, char *src)
  5 {
  6     char *d_tmp = dest;
  7     char *s_tmp = src;
  8     while(*s_tmp != '\0')
  9     {
 10         *d_tmp = *s_tmp;
 11         d_tmp++;
 12         s_tmp++;
 13     }
 14     *d_tmp = '\0';
 15     return dest;
 16 }
 17 char *my_strncpy(char *dest, char *src, int num)
 18 {
 19     int i;
 20     char *d_tmp = dest;
 21     char *s_tmp =src;
 22 
 23     for(i = 0; i < num; i++)
 24     {
 25         *(d_tmp + i) = *(s_tmp + i);
 26     }
 27     *(d_tmp + i) = '\0';
 28     return d_tmp;
 29 }
 30 char *my_strcat(char *dest, char *src)
 31 {
 32 
 33     char *d_tmp = dest;
 34     char *s_tmp = src;
 35 
 36     while(*d_tmp != '\0')
 37     {
 38         d_tmp++;
 39     }
 40     while(*s_tmp != '\0')
 41     {
 42         *(d_tmp) = *(s_tmp);
 43         s_tmp++;
 44         d_tmp++;
 45     }
 46     *d_tmp = '\0';
 47     return dest;
 48 }
 49 char *my_strncat(char *dest, char *src, int len)
 50 {
 51     int i;
 52 
 53     char *d_tmp = dest;
 54     char *s_tmp = src;
 55 
 56     while(*d_tmp != '\0')
 57     {
 58         d_tmp++;
 59     }
 60     for(i = 0; i < len; i++)
 61     {
 62         *(d_tmp + i) = *(s_tmp + i);
 63     }
 64     *(d_tmp +i) = '\0';
 65     return dest;
 66 }
 67 int my_strcmp(char *dest, char *src)
 68 {
 69     char *d_tmp = dest;
 70     char *s_tmp = src;
 71 
 72     while(*s_tmp == *d_tmp)
 73     {
 74         s_tmp++;
 75         d_tmp++;
 76         if((*s_tmp == '\0') && (*d_tmp == '\0'))
 77         {
 78             return 0;
 79         }
 80         if((*s_tmp) > (*d_tmp))
 81         {
 82             return -1;
 83         }
 84         if(*s_tmp < (*d_tmp))
 85         {
 86             return 1;
 87         }
 88     }
 89 }
 90 int main()
 91 {
 92     char *str = "hello world!";
 93     //char *str1 = "Hi!Hi!";
 94     char ptr[100] = "h!!!";
 95 
 96    // char *temp = my_strcpy(ptr,str);
 97 
 98     //char *temp1 = my_strncpy(ptr,str,3);
 99      //char *temp2 = my_strcat(ptr,str);
100       // char *temp3 = my_strncat(ptr,str,3);
101       int ret = my_strcmp(ptr,str);
102     printf("str = %s\n",str);
103     printf("ptr = %s\n",ptr);
104     //printf("str1 = %s\n",str1);
105    // printf("temp = %s\n",temp);
106   // printf("temp1 = %s\n",temp1);
107     // printf("temp2 = %s\n",temp2);
108    // printf("temp3 = %s\n",temp3);
109    printf("ret = %d\n",ret);
110 
111     return 0;
112 }
 

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值