12_C语言06_switch语句反汇编

switch语句反汇编

测试环境:VC++6.0

分支少于4的时候没有意义,编译器会生成类似if...else之类的反汇编,不超过三个分支,不会生成索引表。

会建立一张表,表里面存的各个分支语句函数的地址,然后来索引。

case后面的常量可以是无序的,并不影响大表的生成。

代码分析

5:        switch(x)
6: {
0040D728 mov eax,dword ptr [ebp+8] ;将参数3放到eax中
0040D72B mov dword ptr [ebp-4],eax
0040D72E mov ecx,dword ptr [ebp-4]
0040D731 sub ecx,1
0040D734 mov dword ptr [ebp-4],ecx
0040D737 cmp dword ptr [ebp-4],3
0040D73B ja $L349+0Dh (0040d781)
0040D73D mov edx,dword ptr [ebp-4]
0040D740 jmp dword ptr [edx*4+40D792h] ;从表中索引地址,然后跳转
7: case 1:
8: printf("AAA");
0040D747 push offset string "AAA" (00422fa4)
0040D74C call printf (00401080)
0040D751 add esp,4
9: break;
0040D754 jmp $L349+0Dh (0040d781)
10: case 2:
11: printf("BBB");
0040D756 push offset string "BBB" (00422f54)
0040D75B call printf (00401080)
0040D760 add esp,4
12: break;
0040D763 jmp $L349+0Dh (0040d781)
13: case 3:
14: printf("CCC");
0040D765 push offset string "CCC" (00422020)
0040D76A call printf (00401080)
0040D76F add esp,4
15: break;
0040D772 jmp $L349+0Dh (0040d781)
16: case 4:
17: printf("DDD");
0040D774 push offset string "DDD" (0042201c)
0040D779 call printf (00401080)
0040D77E add esp,4
18: break;
19: }

练习

1.写一个switch语句,不生产大表也不生产小表,贴出对应的反汇编.

2.写一个switch语句,只生产大表,贴出对应的反汇编

3.写一个switch语句,生成大表和小表,贴出对应的反汇编

4.为do..while语句生成的反汇编填写注释

5.为while语句生成的反汇编填写注释

6.为for语句生成的反汇编填写注释

零基础逆向工程12_C语言06_switch语句反汇编的更多相关文章

  1. 零基础逆向工程14_C语言08_指针02_反汇编

    1.指针数组 5: char* keyword[] = {"if", "for", "while", "switch"} ...

  2. 零基础逆向工程13_C语言07_指针01_反汇编

    1."带*类型"的特征探测 宽度 在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位. 声明 1.带有* 的变量类型的标准写 ...

  3. 零基础逆向工程15_C语言09_位运算

    1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic ...

  4. 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写

    #define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...

  5. 零基础逆向工程11_C语言05_结构体

    结构体小结 结构体是按照分配的大小,局部变量会自动数据对齐 1字节对齐,省空间,但cpu查找效率低 4字节对齐,不省空间,但cpu查找效率高 VC6默认的结构对齐大小 项目右键-> settin ...

  6. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

  7. 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码

    向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...

  8. 零基础学习C语言入门必备知识

    今天跟大家一起从零学C语言: 1. C语言简介 1.1 C语言发展史 C语言是一种广泛使用的面向过程的计算机程序设计语言,既适合于系统程序设计,又适合于应用程序设计.C语言的发展历程大致如图1-1所示 ...

  9. 零基础学习C语言字符串操作总结大全

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

随机推荐

  1. 微信开放平台搭建之EasyWeChat

    背景 公司有一个产品,需要用到微信授权登录及微信消息推送等功能.本来能够简单的使用公众号的接口将appid和appsecrect等信息写到配置文件里,但是作为一个产品化的东西,从体验等各方面来讲都不能 ...

  2. 系统启动挂载根文件系统时Kernel panic

    转自:http://qiuye.iteye.com/blog/543595 这类问题很常见,先总体介绍一下解决思路. 能出现让人激动的的控制台,那么系统移植已经接近完成:但是不少人在最后一步出现问题. ...

  3. 三台主机搭建LAMP(apache、mariadb、php)

    实验环境:均是CentOS7 httpd:172.16.254.88   2.4.6 PHP:172.16.250.140 5.4.16 mariadb:172.16.250.94 5.5.52 第三 ...

  4. sql web Admin 源码.net 升级

    http://www.cnblogs.com/foundation/archive/2008/10/07/1305297.html

  5. mongodb启动脚本

    #!/bin/sh # #chkconfig: #description: mongodb start() { /usr/local/yunshipei/enterplorer/mongodb/bin ...

  6. [poj2955/nyoj15]括号匹配(区间dp)

    解题关键:了解转移方程即可. 转移方程:$dp[l][r] = dp[l + 1][r - 1] + 2$ 若该区间左右端点成功匹配.然后对区间内的子区间取max即可. nyoj15:求需要添加的最少 ...

  7. CF-839A

    A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  8. ASP.NEt ajax 弹出窗口在页面无法关闭

    <meta http-equiv="X-UA-Compatible" content="IE=9" />     今天又有客戶投訴公司的網頁有問題. ...

  9. 仿iPhone、iPad界面滑屏切换

    <!DOCTYPE html> <html lange='en'> <head> <meta charset='UTF-8'> <title> ...

  10. ColorMask与Blend

    Shader "N/T" { Properties { _Color ("Texture to blend", Color) = (1,1,1,1) } Sub ...