博客
关于我
【滴水逆向笔记】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/

    你可能感兴趣的文章
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    PostGIS在Windows上的下载与安装
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>
    Postgres invalid command \N数据恢复处理
    查看>>
    Postgres like 模糊查询匹配集合
    查看>>
    Postgres 自定义函数内实现 in 操作符的递归查询
    查看>>
    Postgres 返回当前时间前后指定天数的集合
    查看>>
    postgres--vacuum
    查看>>
    postgres--wal
    查看>>
    postgres--流复制
    查看>>
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>