首页 > 其他 > 详细

ida使用之函数的熟悉

时间:2020-11-28 09:31:43      阅读:28      评论:0      收藏:0      [点我收藏+]

1. 1. 常量的逆向.exe

2. 2. 字符串的初始化.exe

  • 找main函数

技术分享图片

技术分享图片

  • 定位函数体

    • 找cookie后xor后的call,表示vs2019函数
    • 找函数后段xor,表示返回值

技术分享图片

技术分享图片

技术分享图片

  • 分析ds段值,将其设置为肉眼可见

    • 技术分享图片
  • 分析赋值语句,将第一个变量名设置为char*

    • 技术分享图片
    • 技术分享图片
    • 分析语句发现每4字节赋值,直到+14h处赋值2字节
    • 那么就可以判定字符串长0x14h+0x2h=0x16h
    • 猜测剩下的0x4Eh字节为0字符,那么下一个call为memset
    • 技术分享图片
    • 0x16h+0x4Eh=0x64h=100d
    • 那么我们则可以将char_buff,设置为char buff[100];
    • 技术分享图片
  • 猜测代码段2为rep直接循环赋值

    • 分析得4*9+2+0xA2=200d
    • 则可设置变量为wchar_t buff[100]=L"...";

技术分享图片

技术分享图片

  • 猜测段3为未指定长度的char*

    • 原因是因为没有结尾处的memset();
    • char* buff="字符串";

技术分享图片

  • END

3. 3. 构造函数和析构函数.exe

  • 找main函数

    • 技术分享图片
    • 技术分享图片
  • 分析代码段

    • xor,mov,mov,call,则表示CheckForDebuggerJustMyCode
    • 技术分享图片
    • 我们先来看一下源码
    • 技术分享图片
    • 我们先讲一下概念,类的构造函数在语法上没有返回值.
    • 但是在汇编实现层面上,实际上返回的是this指针.
    • 在析构函数中,的确没有返回值,但是会传入一个ecx作为thiscall调用.
    • 由此特性,我们可以得出call前给ecx赋值的局部变量为this指针.
    • PS:析构函数在main函数结束时自动调用,
    • 所以在析构函数前会有一个main函数返回值的赋值
    • 技术分享图片
  • 分析构造函数

    • 技术分享图片
  • 分析析构函数

    • 技术分享图片
  • END

4. 4. 存在继承关系的构造函数.exe

  • 找main函数

    • 技术分享图片
  • 分析代码段

    • 技术分享图片
  • 分析构造函数

    • 技术分享图片
  • END

5. 5. 存在虚函数的例子.exe

  • 找main函数

    • 技术分享图片
  • 构造函数

    • 概念:在有系函数的情况下,
    • 在this指针的前4字节,会保存着虚表的指针
    • 技术分享图片
  • END

6. 6. 使用成员函数访问成员数据.exe

  • 找main函数

    • 技术分享图片
  • 分析main函数

    • 我们先看源码
#include <stdio.h>
// 深入探索C++对象模型

class COBj2
{

};

class CObj
{
private:
    // 内类初始化的操作在哪里初始化
    int number1 = 10;
    int number2 = 20;
public:
    CObj() = default;
    CObj(int n1, int n2):
        number1(n1), number2(n2) { }

    // 通过函数访问数据成员的例子
    void set(int n1, int n2) 
    { 
        number1 = n1;
        number2 = n2;
        printf("CObj::CObj()\n"); 
    }
};


int main()
{
    // 这个 obj2 不存在构造和析构
    // 对于没有任何数据的对象来说,
    // 编译器不会提供构造函数
    COBj2 obj2;

    // 局部对象
    CObj obj;
    CObj obj3(10, 20);

    obj.set(100, 200);

    // !!!!!!!! 自己提供一个使用赋值方式的构造函数
    //  比较该构造函数和其他两种的区别

    return 0;
}
    • 概念:当一个类没有任何意义时,编译器不会将它编译,如CObj2
    • 当一个类没有析构函数的意义时,编译器不会将它编译,如CObj
    • 那么我们在汇编代码里面会发现并没有obj2和obj的析构
    • 分析参数:我们发现有两个局部变量给ecx赋值了
    • 那么可以猜测这里有两个class的实例
    • 再次分析会发现第一个实例化时,没有传参
    • 第二个实例化时,压入了20,10,那么可以得出
    • 该函数实例化时可以传入两个int类型的值
    • 以及还有一个函数实例化时没有参数
    • 后续传参200,100传入函数时
    • 我们可以猜测这是将这两个参数改变了
  • 分析构造函数1

    • 发现构造函数中对改值初始化了10,20
    • 技术分享图片
  • 分析构造函数2

    • 对比构造函数1发现唯一的区别就是参数时由ebp+N提供的
    • 且由寄存器作为缓存赋值至this指针+N
    • 技术分享图片
  • 分析函数调用1

    • 由上文分析可得寄存器临时存参后赋值给[eax]+N
    • 且与上文函数唯一区别在于增加了printf函数的调用
    • 技术分享图片
  • END

7. 7. 虚函数的使用.exe

  • 找main函数

    • 技术分享图片
  • 分析构造函数

    • 发现该构造无函数内容,只有一条虚表生成的代码
    • 技术分享图片
  • 分析成员函数

    • 发现该成员函数只有一条printf函数
    • 技术分享图片
  • 分析main函数

    • 技术分享图片
  • 实现虚表hook

    • 技术分享图片
  • END

8. 8. 友元和静态.exe

  • 找main函数

  • END

9. 9. 指针和引用.exe

  • 找main函数
  • END

ida使用之函数的熟悉

原文:https://www.cnblogs.com/liujun1016/p/14051006.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!