博客
关于我
【滴水逆向笔记】C语言参数、变量及if逆向
阅读量:800 次
发布时间:2019-03-25

本文共 1204 字,大约阅读时间需要 4 分钟。

全局变量与局部变量

内存布局是程序运行时将内存划分的逻辑区域。根据需求,程序会将内存分成代码区、堆栈、堆和常量区。

局部变量

局部变量是在函数内部定义的变量。其特点包括:

  • 在编译时没有固定的地址
  • 只有在函数执行时,在堆栈内存中分配内存
  • 函数执行完成后,内存会成为垃圾
  • 只能在函数内部使用
  • 函数变量的反汇编通常是[ebp-4][ebp-8],表示在ebp指针所指的位置减去一定偏移量处的值。

    全局变量

    全局变量是在程序运行时始终存在的变量,其特点包括:

  • 在编译时就分配固定的地址
  • 保留到进程结束才会释放
  • 可以被所有函数修改
  • 最终存留的值是最后一次修改的值
  • 全局变量的反汇编通常是mov寄存器, byte/word/dword ds:[0x12345678]

    参数传递

    参数传递方式可能通过堆栈或寄存器完成。常见的传递方式包括standard calling和fastcall。传递方式取决于如何将参数值从调用函数的上下文传输到目标函数的参数位置。码可以是:

    push ebxpush eaxmov ecx, dword ptr ds: []mov ecx, dword ptr ds: []push 45push 33call 函数地址

    参数是否通过寄存器传递可以通过kernel_movie magnusμ ... 来判断。

    堆数组的使用

    堆数组通常用于存储大量数据。初始化方式包括静态初始化或动态分配。访问数组时需要确认索引是否合理。

    void Function() {    printf("%d\n", arr);}int arr[10] = {1, 3, 7, 2, 8, 11, 5, 23, 22, 10};

    输出结果为4354848。读取单个元素时,需确保索引在数组范围内。

    int x = arr[9];printf("%d\n", x);

    输出结果为10。

    分支语句

    if语句通过跳转实现条件控制。cmp指令用于修改标志寄存器,紧接着的是jcc指令。asmlinkage函数应该 jumps到正确的分支。

    if (x > y) {    // x大于y时执行} else {    // else执行}

    elseif通过多次cmp和jcc实现。逆向分析可验证分支是否处于激活状态。

    函数内部功能分析

    根据技术文档,大致确定可执行的组件。重点关注中间模块的功能,合理分布参数。注意缓存机制和预先定义的函数返回值。例如:

    [DllImport("kernel32.dll")]static uint sprintf(IntPtr hBuf, IntPtr pFormat, char[] arg);int Program_Start() {    // 功能描述    return 0;}int main() {    // 主程序内容    return 0;}

    返回值存储在eax中。

    转载地址:http://pjjyk.baihongyu.com/

    你可能感兴趣的文章
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>