反汇编

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

linux 命令之 objdump 简单使用

孤街浪徒 提交于 2020-02-19 08:08:04
objdump 介绍 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 objdump 选项介绍 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 -C --demangle 将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。 --debugging -g 显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 -e --debugging-tags 类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 --disassemble -d 从objfile中反汇编那些特定指令机器码的section。 -D --disassemble-all 与 -d 类似,但反汇编所有section. --prefix-addresses

.NET程序反汇编JustDecompile 开源

风格不统一 提交于 2020-02-13 07:39:53
JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 集成,能够创建Visual Studio project文件。JustDecompile与Reflector相比的话,个人更喜欢JustDecompile,因为他免费,而且对于一些C#动态类型的反编译效果比较好,对于某个第三方程序集,如果它缺乏文档,或者是一个bug 或性能问题的根源,反编译往往是最快捷的解决方案。Telerik已经将 Reflexil 、程序集编辑器(assembly editor)和 De4Dot 等插件集成到了JustDecompile中。此外,开发者可以借助最新发布的API与支持文档开发自己的插件。昨天他们宣布开源了,具体参见 http://blogs.telerik.com/justteam/posts/15-05-08/justdecompile-engine-becomes-open-source 。博客里提到5.13号有好消息。 来源: https://www.cnblogs.com/shanyou/p/4491124.html

反汇编工具objdump的使用简介

折月煮酒 提交于 2020-02-11 00:01:22
1、反汇编的原理&为什么要反汇编 arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf(操作系统上的可执行文件)格式的可执行程序反过来得到汇编源代码。 -D(objdump 后面可以带不同参数实现不同功能)表示反 > 左边的是elf的可执行程序(反汇编的原材料), >右边的是反汇编生成的汇编程序。 反汇编的原因有以下: (1)、逆向破解。 (2)、调试程序时,反汇编代码可以帮助我们理解程序,尤其是在理解链接脚本、链接地址等概念时。 (3)、把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系。非常有助于深入理解C语言。 2、反汇编文件格式和看法 (汇编 assembly 反汇编 dissembly 大部分汇编文件以.s作为后缀) 打开反汇编后的dis文件如下图,这时要对应我们的elf(是二进制文件要用WinHex.exe软件打开)格式文件进行分析(因为elf格式还没有去掉符号,标号等,而当用arm-linux-objcopy -o binary led.elf led.bin)生成的可烧录文件已经去掉了符号等。 我们要理解:标号地址、标号名称、指令地址、指令机器码、指令机器码反汇编到的指令 扩展

关于Integer的缓存问题

自闭症网瘾萝莉.ら 提交于 2020-02-11 00:00:20
先看一段示例代码: public class TestMain { public static void main ( String [ ] args ) { Integer a = 66 ; Integer b = 66 ; System . out . println ( "a等于b:" + ( a == b ) ) ; //结果是true Integer c = 166 ; Integer d = 166 ; System . out . println ( "c等于d:" + ( c == d ) ) ; //结果是false } } 为什么会是这样的结果,以上代码看上去只是单纯的赋值,所以我们反汇编看下,底层是否有调用什么方法,而我们却不知道。 以上是部分反汇编后的代码,可以看到反汇编的第一行的66,和我们代码第三行对应,反汇编的第二行则调用的是Integer.valueOf()的方法,对66这个数字进行自动装箱。从这里也可以猜到自动装箱和拆箱在底层是怎么实现的了,其实最后还是调用相应方法来做类型的转换。 所以接下来看 Integer . valueOf ()方法的源码: public static Integer valueOf ( int i ) { //这里做了一个比较,如果在这个范围内的数值,则取IntegerCache里的值,否则新建Integer对象 if (

VS如何反汇编

痞子三分冷 提交于 2020-02-09 02:39:20
1. 打开反汇编窗口:调试模式下,按Ctrl+F11。 2. 术语:   2.1 ESP(Extended Stack Pointer): 堆栈指针,寄存器存放当前线程的栈顶指针;  i.e: move ebp, esp -- 用ebp保存当前栈指针;   2.2 EBP(Extended Base Pointer): 基址指针,寄存器存放当前线程的栈底指针;  i.e: push ebp -- 将基址指针压入栈;   2.3 EIP:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完成当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行;   2.4 EAX: 累加器(Accumulator),加法乘法指令的缺省寄存器;   2.5 EBX: 基地址(Base)寄存器,在内存寻址时存放基地址;   2.6 ECX:计数器(Counter),是重复(REP)前缀指令和LOOP指令的内定计数器;   2.7 EDX:存放整数除法产生的余数;   2.8 ESI/EDI: 源/目标索引寄存器(Source/Destination Index), 在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串。 上面从网上找来的。 也可以这样 或者 来源: https://www.cnblogs.com/hsuppr/p/7762322.html

函数重载-name mangling或mame decoration技术-看看反汇编

馋奶兔 提交于 2020-01-31 23:12:47
函数重载 文件-创建新项目-空项目 源文件-右键新建项-main.cpp #include <iostream> using namespace std; int main() { getchar(); return 0; } c语言不支持函数重载 C++支持函数重载 #include <iostream> using namespace std; int sum(int v1, int v2){ return v1 + v2; } int main() { cout << sum(10, 20) << endl; getchar(); return 0; } 现在希望sum函数多一些接收的参数 #include <iostream> using namespace std; int sum(int v1, int v2){ return v1 + v2; } int sum(int v1, int v2, int v3){ return v1 + v2 + v3; } int main() { cout << sum(10, 20) << endl; cout << sum(10, 20, 30) << endl; getchar(); return 0; } 两个函数的函数名一模一样,但是后面的参数或类型或顺序不同,称之为过程重载(函数重载) 实参的隐式转换会产生恶意性

bochs调试简单操作系统方法

假如想象 提交于 2020-01-19 21:15:42
我用的是bochs 2.6.11 首先进入bochs的调试模式使用的是 ,打开bochsdbg。同理他也会让你选择配置文件。 选择完了配置文件,弹出两个窗口,一个是调试命令行,一个是操作系统窗口 最初的时候,他会显示一些日志,然后注意: 显示了下一条指令的所在地和指令内容。我们观察因为实模式下 BIOS的引导代码实在 0xf000:0xfff0这里,也就是机器一加电后,cs和ip的初始化内容,我们可以看到他要跳转到 0xf000:e05b这里,这个时候才是我们真正的BIOS代码。 之后查看 0x7c00:0000这里,发现他的内容是0000,这个是正常的,毕竟我们的mbr是需要BIOS加载到对应位置的,这个时候BIOS还没有运行呢。 下面引入一下实模式的内存布局,方便没有了解过的小伙伴们学习。 接着引入bochs的调试方法 首先是xp命令 (提示:bochs下的一个字 是 四个字节) xp/ 这后面可以跟 b h w g 分别对应的是 字节 两个字节 一个字 两个字 之后跟内存地址 (注意上面指令指定了一次显示内存单元的大小之后再次查看内存单元就是以一个字节来访问的了, xp/4 0x7c00 xp之后跟数字就是连续查看几个单元,所以应该是查看4个字节) 之后是 u命令 用来将内存数据反汇编成指令 u后面加需要反汇编的指令数和起始地址,例如: u [num] [start]

javap(反汇编命令)

倾然丶 夕夏残阳落幕 提交于 2020-01-17 14:15:41
用法: javap <options> <classes> 其中, 可能的选项包括: -help --help -? 输出此用法消息 -version 版本信息 -v -verbose 输出附加信息 -l 输出行号和本地变量表 -public 仅显示公共类和成员 -protected 显示受保护的/公共类和成员 -package 显示程序包/受保护的/公共类 和成员 (默认) -p -private 显示所有类和成员 -c 对代码进行反汇编 -s 输出内部类型签名 -sysinfo 显示正在处理的类的 系统信息 (路径, 大小, 日期, MD5 散列) -constants 显示最终常量 -classpath <path> 指定查找用户类文件的位置 -cp <path> 指定查找用户类文件的位置 -bootclasspath <path> 覆盖引导类文件的位置 public class TestMain { public static void main(String[] args){ short a = 4; int b = 5; a+=b; System.out.println(a); } } javac TestMain.java javap -c -l TestMain www:faj faunjoe$ javap -c -l TestMain 警告:

javap(反汇编命令)详解

二次信任 提交于 2020-01-17 13:52:41
javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。 语法:   javap [ 命令选项 ] class. . .   javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。 命令选项   -help 输出 javap 的帮助信息。   -l 输出行及局部变量表。   -b 确保与 JDK 1.1 javap 的向后兼容性。   -public 只显示 public 类及成员。   -protected 只显示 protected 和 public 类及成员。   -package 只显示包、protected 和 public 类及成员。这是缺省设置。   -private 显示所有类和成员。   -J[flag] 直接将 flag 传给运行时系统。   -s 输出内部类型签名。   -c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。   -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本   -classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或