他们会把做内核的人当成无所不能的,认为你们对反编译啥的都应该会。

俗话说的好,人要活成别人想要的样子嘛:

看下如何停止进程,让大家看到内存中到底是啥样子;

简单的print globalA当然能输出来变量globalA的地址以及这个地址中的值,但是如果这里是一个链表,能通过编程的方法把这里的数值给dump出来么,直接就dump函数么,两个思路吧,要么是代码中自己写一个函数供调用,要么是我自己写一个外挂程序去调用。

第一种方法:

第一种方法可以,借助gdb的call 功能,就能让程序去执行特定的调测函数,测试程序:call showNode(root)就可以了

https://github.com/honpey/codebox/blob/master/gdb/gdb_call.c

第二种方法:gdb能不能开一个外观呢?gdb自己写函数去调用

还是先从最简单的动态库开始,我先在动态库中作函数

#include <stdio.h>
int max(int a, int b) {
    return (a>b)?a:b;
}
int min(int a, int b) {
    return (a<b)?a:b;
}
void sayhello() {
    printf("hello libso\n");
}
其中max和min函数都不依赖外部的函数,都是raw的,可以直接调用,此时甚至都不需要什么动态库,直接静态的就好,但是后面由于需要有sayhello,因此需要有plt的重定位的加持。

可以看到max函数位于.text段的这个位置(odjdump -d cal.so):0x00000000000006e0;min位于0x00000000000006f6

那么text段的偏移(readelf -S cal.so)是005e0,大小是13f,所以整个代码段的大小是[005e0, 0071f)这么大的位置

上面两个函数相互相互印证吧,我们看到0x6e0/6f6确实是位于[005e0, 0071f)这个区间内,那么案例说,我直接去执行这个地址就能得到max和min的结果, 试验成功,

步骤:

1) gdb gdb_call  22044

2) call open("cal.so", 2)

3) call mmap(0, 4096, 1|2|4, 1, 3, 0)

4) set $addr=$addr_base+0x6e0 //$addr_base= /proc/22044/maps得到

5) call $addr(1, 100) 就真的返回100了

这个倒是简单,对于动态加载的呢?

先看下反汇编的函数:

void sayhello() {
    printf("hello libso\n");
}

------->

000000000000070c <sayhello>:
 70c:    55                           push   %rbp
 70d:    48 89 e5                 mov    %rsp,%rbp
 710:    48 8d 3d 12 00 00 00     lea    0x12(%rip),%rdi        # 729 <_fini+0x9>
 717:    e8 a4 fe ff ff           callq  5c0 <puts@plt>
 71c:    90                       nop
 71d:    5d                       pop    %rbp
 71e:    c3                       retq   
编译其看到这里的5c0会咋整?

内容很多,下面一篇详细介绍吧

gdb查看内存中所有的信息的更多相关文章

  1. MIUI添加内存调试工具:查看进程中的Bitmap信息

    Android开发中的内存管理一直是令人头痛的事情.其中占用内存最大的一般是Bitmap.   在上周五发布的MIUI开发版中,我添加了查看内存里Bitmap信息的功能.大家开发app的时候可以使用这 ...

  2. GDB查看内存(x 命令)

    gdb查看内存命令 首先使用gdb [YourFileName].c进入gdb界面 使用examine命令,字母缩写为x查看内存地址的值.x命令语法 x/[number][format] <ad ...

  3. GDB查看内存命令(x命令) 用gdb查看指定地址的内存内容

    GDB查看内存命令(x命令) - super119 - 博客园 https://www.cnblogs.com/super119/archive/2011/11/18/2254382.html 可以使 ...

  4. x/nfu-用gdb查看内存

    用gdb查看内存 2007-12-08 12:43 用gdb查看内存 格式: x /nfu <addr> 说明x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, ...

  5. Android 设备,如何root,执行adb shell,查看设备中的数据库信息等【转】

    原文地址: Android 设备,如何root,执行adb shell,查看设备中的数据库信息等

  6. Xcode如何查看内存中的数据

    在  debug 模式下如何在断点处,查看字符指针变量内存中的值,像vs2008的调试工具一样的内存查看器,现在只能查看第一个内存中的值可以在输出窗口采用gdb命令:x /nfu <addr&g ...

  7. aix 查看内存,CPU 配置信息

    内存lsattr -El mem0cpu lsdev -C |grep procCPU的信息lsattr -El proc0   #bootinfo -r查看物理内存     使用命令#  lsdev ...

  8. gdb查看内存(转)

    可以使用examine命令(简写是x)来查看内存地址中的值.x命令的语 法如下所示: x/<n/f/u> <addr> n.f.u是可选的参数. n是一个正整数,表示需要显示的 ...

  9. Xcode debug时如何查看内存中的数据

    对于IPhone开发/XCode的初学者,如何在调试时查看变量的值是很头痛的事情.因为Xcode的expression 经常无法正确显示变量的值.但是强大的GDB可以很方便的帮我们查看变量的值.   ...

随机推荐

  1. LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)

    一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中 ...

  2. 【PTA 天梯赛训练】六度空间(广搜)

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  3. 修改zabbix字体格式

    环境: centos7 zabbix3.2 1.获取喜欢的字体格式文件(喜欢别的字体也可以去网上下载) 通常都是ttf格式,可直接在windows下获取C:\Windows\Fonts 2.配置zab ...

  4. 浅谈C#实现Web代理服务器的几大步骤

    代理服务程序是一种广泛使用的网络应用程序.代理程序的种类非常多,根据协议不同可以分成HTTP代理服务程序.FTP代理服务程序等,而运行代理服务程序的服务器也就相应称为HTTP代理服务器和FTP代理服务 ...

  5. 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)

    在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...

  6. Django的aggregate()和annotate()函数的区别

    aggregate() aggregate()为所有的QuerySet生成一个汇总值,相当于Count().返回结果类型为Dict. annotate() annotate()为每一个QuerySet ...

  7. Python2 Sequence类型簇

  8. Hue 工具使用

    Hue 是一个 Web 接口的 Hadoop 分析数据工具,由 Cloudra 公司开源 官方网址 Github 地址 -> 安装方法 文档地址 一.Build 1.ubuntu安装所需环境(以 ...

  9. 【Consul】多数据中心

    Consul的一个关键特性是支持多数据中心.consul架构中提到是构建低耦合的多个数据中心,一个数据中心的网络连接问题或故障不在其他数据中心的可用性.每个数据中心都是独立运行,并且拥有私有的LAN ...

  10. 3155: Preprefix sum

    3155: Preprefix sum https://www.lydsy.com/JudgeOnline/problem.php?id=3155 分析: 区间修改,区间查询,线段树就好了. 然后,这 ...