我为什么要学习C++反汇编
写在开始
从6月7日开始到今天已经有5天了,在这5天的业余时间(工作之余)里终于系统的完成了C++反汇编的大部分问题的学习,今天写篇总结,算是对这几天学习的总结。
首先我想说明的一个问题就是我为什么要花时间研究C++反汇编?
这事得从笔者遇到的一个问题开始说起,大约2周前我们项目做在开发过程中遇到了一个Crash的问题,由于只有客户提供的一个.dmp文件,我们只能从这个地方入手,说起来很奇怪,从C++代码的角度根本看不出来问题,我找来了一个传说中的公司的大牛,大牛就在我面前给我详细的分析了一遍这个转储文件,感觉他看反汇编出来的代码就像看C++源代码一样,看问题也会更透彻,这个问题分析结束了之后笔者觉得应该在这方面稍微研究一下,于是有了最近的几篇文章。
我是怎么研究的
说起汇编代码,最开始接触是上大学的时候,学校教的IBM-PC汇编语言,当时觉得还成,用汇编写些东西还算顺利,后来大三以后在做在做嵌入式开发(ARM,DSP开发笔者都略懂)的时候也写过一些汇编的代码,那么为什么看C++反出来的汇编我突然看不懂了呢?
首先就是对不上号,看到汇编代码,不知道对应的C++代码应该是什么样子的,于是在这几天里面我写了很多的demo, 试图找到两者之间的对应关系,包括:
1. 函数调用
2. 虚函数处理
3. 类处理
4. This指针
5. 虚表
6. 参数传递
7. 栈实现
…
终于把这两者之间的对应关系找到了,找到了这两者的对应关系以后,再去看反出来汇编感觉是有如神助,行云流水,不敢说全懂了,但是大部分已经打通了。
总结,建议和致谢
感谢大牛让我见识到了C++反汇编有东西需要学,其实学习这东西不是说一个人有多牛,重要的是你应该根据自己的情况知道自己欠缺哪方面的知识,并且知道如何去补上这些东西,如果有需要同样知识的朋友,建议作代码对比,个人觉得这是一个捷径。如果对这方面有什么问题欢迎一起讨论,共勉..
我为什么要学习C++反汇编的更多相关文章
- 为什么要学习Linux
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 本篇修改自我在知乎上回答的问题,为什么要学习 Linux? 我最开始用Linux是 ...
- linux内核学习之一 简单c语言反汇编
(我是第一次发技术博客的菜鸟,恳请大家指导!!) 一 由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...
- 为什么要学习java?
前面说了什么是java java只是一门语言,中文,英语,c++,c#等等数之不尽的语言 java的应用领域: 1)安卓应用 2)金融业服务器的应用 3)Java Web应用 4)软件工具 5)交易应 ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
- C/C++ char* arr与char arr[]的区别(反汇编解析)
写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- [转]我为什么要学习python
我为什么要学习python 引言:学习python近两年,谈谈我对于python的一点小理解,也从一些方面谈谈自己微薄的想法,也就是我为什么学习python 这里我不讨论python的一些有用的库 ...
- 什么是Angular? 我们为什么要学习它?
在我更新Ionic的时候有人问我什么是 Angular,我们为什么要学习它啊?这个是我的疏忽了,在没有告诉你们什么是 Angular 的时候就让大家着手去学习 Ionic .那么今天就让我们认识一下什 ...
- 通过反汇编理解函数调用机制(x86和ARM)
如下,一个简单的程序 #include <stdio.h> int add(int a, int b) { return a + b; } void main() { , b = ; in ...
随机推荐
- hihoCoder#1133 二分·二分查找之k小数
原题地址 经典问题了,O(n)时间内找第k大的数 代码: #include <iostream> using namespace std; int N, K; int *a; int se ...
- @JoinColumn 匹配关联多个字段
两张表结构如下 TABLE_A: ID, COLA1, COLA2 TABLE_B: ID, A_ID, COLB1, COLB2 A和B是一对多的关系. 我在B的BEAN上面,通过Anotation ...
- 2016 Multi-University Training Contest 5 solutions BY ZSTU
ATM Mechine E(i,j):存款的范围是[0,i],还可以被警告j次的期望值. E(i,j) = \(max_{k=1}^{i}{\frac{i-k+1}{i+1} * E(i-k,j)+\ ...
- java打开本地应用程序(调用cmd)---Runtime用法详解
有时候我们需要借助java程序打开电脑自带的一些程序,可以直接打开或者借助cmd命令窗口打开一些常用的应用程序或者脚本,在cmd窗口执行的命令都可以通过这种方式运行. 例如: package cn.x ...
- MySQL介绍及安装&MySQL软件基本管理
mysql介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好 ...
- [CERC2015]Digit Division
题目描述 We are given a sequence of n decimal digits. The sequence needs to be partitioned into one or m ...
- List和Map、Set的区别
首先 List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合:List 中存储的数据是有顺序,并且允许重复:Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可 ...
- CentOS系统如何设置服务开机自动运行
centos安装好apache,mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了.例如要开机 ...
- js实现动态删除表格的行或者列-------Day57
昨天记录了动态加入表格的一行,当然这个一行是指一行数据,也就是说一行多少列也是加上的,而且第几列的内容都能够加入上,先来回想下它的实现的关键点: 1.var row=table.insertRow() ...
- [NPM] Create a new project using the npm init <initializer> command
Historically, the npm init command was solely use to create a new package.json file. However, as of ...