背景知识

VC++编程知识

OD工具使用

汇编知识

功能实现

简单的互换点击功能;

将两个功能互换

效果图:

创建test程序

使用VS2017创建一个新的MFC工程命名为test,去掉默认按钮,新加两个button,分别命名test,test2。

创建添加两个新方法:

```C++

void CtestDlg::dispaly()

{

MessageBox(L"test");

}

void CtestDlg::dispaly1()

{

MessageBox(L"test2");

}

void CtestDlg::OnBnClickedButton1()

{

dispaly();

}

void CtestDlg::OnBnClickedButton2()

{

dispaly1();

}

编译生成`exe`可执行文件;

## 使用OD动态调试

使用`od`打开`test.exe`;

这里需要使用`bp MessageBoxW`下断点,这里因为使用宽字符(MessageBox是在库里声明了一个宏 当你使用宽字符的时候,也就是unicode的时候,自动帮你转换使用 MessageBoxW 而当你使用窄字符的时候,会自动帮你转换到 MEssageBoxA)。

然后运行`F9`。`alt+b`查看断点:

```text

7727FD3F | user32 | 始终 | mov edi,edi

Alt+c返回CPU汇编代码窗口;切换到test.exe程序点击test2按钮;

这个时候会自行到断点地方,注意看堆栈窗口里面的数据,如以下信息;

0017EBE4   01648053  /CALL 到 MessageBoxW 来自 test.0164804D

0017EBE8   000F07D6  |hOwner = 000F07D6 ('test',class='#32770')

0017EBEC   01C6600C  |Text = "test"

0017EBF0   0067EEE0  |Title = "test"

0017EBF4   00000000  \Style = MB_OK|MB_APPLMODAL

0017EBF8   0017EDD8

0017EBFC   CCCCCCCC

0017EC00   0017FA3C

0017EC04  /0017ECF0

0017EC08  |015D3ED4  返回到 test.015D3ED4 来自 test.015A1169

0017EC0C  |01C6600C  UNICODE "test"

0017EC10  |0067EEE0  UNICODE "test"

会发现调用来源,鼠标移动到0017EBE4   01648053  /CALL 到 MessageBoxW 来自 test.0164804D右键点击反汇编窗口中跟随,然后在该call入口按F2下断点,按alt+b切换断点界面,去掉bp MessageBoxW,按F9运行。然后,然后再次点击test2 button看是否能断下。

反复测试button,发现两个button都会断下,那么证明,两处都调用了这里,这个时候,先去掉当前断点,重新下bp MessageBoxW断点,在执行一次button会发现,堆栈窗口里面还有一个调用地址;

先跟随过去,下断点,重复上面的动作测试一下,结果发现,这里才是正确的断点。

015D3E40  /> \55            push ebp                                 ; 这里是 test2 call

015D3E41  |.  8BEC          mov ebp,esp

015D3E43  |.  81EC CC000000 sub esp,0xCC

015D3E49  |.  53            push ebx

015D3E4A  |.  56            push esi

015D3E4B  |.  57            push edi

015D3E4C  |.  51            push ecx

015D3E4D  |.  8DBD 34FFFFFF lea edi,[local.51]

015D3E53  |.  B9 33000000   mov ecx,0x33

015D3E58  |.  B8 CCCCCCCC   mov eax,0xCCCCCCCC

015D3E5D  |.  F3:AB         rep stos dword ptr es:[edi]

015D3E5F  |.  59            pop ecx                                  ;  test.015D20AB

015D3E60  |.  894D F8       mov [local.2],ecx

015D3E63  |.  6A 00         push 0x0

015D3E65  |.  6A 00         push 0x0

015D3E67  |.  68 1860C601   push test.01C66018                       ;  UNICODE "test2"

015D3E6C  |.  8B4D F8       mov ecx,[local.2]

015D3E6F  |.  E8 F5D2FCFF   call test.015A1169                       ;  call test2

015D3E74  |.  5F            pop edi                                  ;  test.015D20AB

015D3E75  |.  5E            pop esi                                  ;  test.015D20AB

015D3E76  |.  5B            pop ebx                                  ;  test.015D20AB

015D3E77  |.  81C4 CC000000 add esp,0xCC

015D3E7D  |.  3BEC          cmp ebp,esp

015D3E7F  |.  E8 F97EFBFF   call test.0158BD7D

015D3E84  |.  8BE5          mov esp,ebp

015D3E86  |.  5D            pop ebp                                  ;  test.015D20AB

015D3E87  \.  C3            retn

注意:这里主要是不去分析整个流程,因为这样分析很容易掉进坑爬不出来,先用测试的方法论,撸一遍可能就省去了很多时间。

到这里先保存这个call,采用同样方法找到test button的call。

015D3EA0  /> \55            push ebp                                 ;  这里是test call

015D3EA1  |.  8BEC          mov ebp,esp

015D3EA3  |.  81EC CC000000 sub esp,0xCC

015D3EA9  |.  53            push ebx

015D3EAA  |.  56            push esi

015D3EAB  |.  57            push edi

015D3EAC  |.  51            push ecx

015D3EAD  |.  8DBD 34FFFFFF lea edi,[local.51]

015D3EB3  |.  B9 33000000   mov ecx,0x33

015D3EB8  |.  B8 CCCCCCCC   mov eax,0xCCCCCCCC

015D3EBD  |.  F3:AB         rep stos dword ptr es:[edi]

015D3EBF  |.  59            pop ecx                                  ;  test.01648053

015D3EC0  |.  894D F8       mov [local.2],ecx

015D3EC3  |.  6A 00         push 0x0

015D3EC5  |.  6A 00         push 0x0

015D3EC7  |.  68 0C60C601   push test.01C6600C                       ;  UNICODE "test"

015D3ECC  |.  8B4D F8       mov ecx,[local.2]

015D3ECF  |.  E8 95D2FCFF   call test.015A1169                       ;  call test1111

015D3ED4  |.  5F            pop edi                                  ;  test.01648053

015D3ED5  |.  5E            pop esi                                  ;  test.01648053

015D3ED6  |.  5B            pop ebx                                  ;  test.01648053

015D3ED7  |.  81C4 CC000000 add esp,0xCC

015D3EDD  |.  3BEC          cmp ebp,esp

015D3EDF  |.  E8 997EFBFF   call test.0158BD7D

015D3EE4  |.  8BE5          mov esp,ebp

015D3EE6  |.  5D            pop ebp                                  ;  test.01648053

015D3EE7  \.  C3            retn

这里就找到两个button功能call了,需要调换两个地方,发现如果直接call修改,需要堆栈平衡,闲麻烦,往上找找谁调用这里push ebp的地址,会发现上面有个jmp,在数据窗口上面直接跳转过去;

完成

啊哈,直接把两个地址互换一下,OK完成。记录下整个分析流程。

od反汇编linux,新手学习反汇编之OD寻找功能call相关推荐

  1. Linux新手学习起步

    因为岗位变动现在接触一些科技.网络方面的工作,所以想多学一些知识丰富一下大脑的储备.不能让其他同事说我是大外行! 实话实说工作已经16年了,原来上学期间对电脑.对网络还是比较喜欢的.虽然不是计算机等相 ...

  2. Linux 新手学习任务

    在一个论坛上http://www.linuxdiyf.com/看到的,感觉受用,特此转了下来,被Linux学习之用. 新手的练习任务在这里: 任务一:打开系统主菜单,逐一细看,而后默想一遍:逐次打开若 ...

  3. 【Windows 逆向】OD 调试器工具 ( OD 附加进程 | OD 调试器面板简介 | 反汇编窗口 | 寄存器窗口 | 数据窗口 | 堆栈窗口 )

    文章目录 一.OD 附加进程 二.OD 调试器面板简介 ( 反汇编窗口 | 寄存器窗口 | 数据窗口 | 堆栈窗口 ) 一.OD 附加进程 先启动游戏 , 打开 OD 调试工具 ; 游戏 参考 [Wi ...

  4. linux下反汇编命令,Linux命令学习手册-objdump命令

    objdump [选项] objfile... [功能] 显示二进制文件信息 [描述] objdump用来显示一个或者多个目标文件的信息.使用选项控制具体显示哪些信息.参数objfile...可以是静 ...

  5. 如何学习Linux / 新手入门

    如何学习Linux / 新手入门 一.从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的.例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用 ...

  6. linux课程内容知识脉络,云计算学习路线教程大纲课件:Linux新手入门教程

    云计算学习路线教程大纲课件,Linux新手入门教程讲解: v> Shell编程之基础知识 No.1 Shell脚本的基本语法结构 第一行: "#!/usr/bin/env bash&q ...

  7. Linux新手大礼包:学习Linux你必须知道的那些事儿

    欢迎加入Linux的大家庭!对你来说,这可能还是一个陌生的领域,不过相信随着逐步深入的了解,你会喜欢上Linux,喜欢上开源的!首先,让我们来看一下,Linux新手应该注意和了解哪些事情吧! 1.   ...

  8. Linux 命令(2)—— od 命令

    1.功能简介 od(Octal Dump)命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或 ASCII 编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od 命令系统默 ...

  9. linux系统pkl,(网摘)Linux新手必看:浅谈如何学习linux

    地址:http://www.eimhe.com/bbs/viewthread.php?tid=53256&extra=page=1> Linux新手必看:浅谈如何教习linux 一.起步 ...

  10. Linux命令学习资料总结

    对 Linux 新手非常有用的 20 个命令 1. ls命令 ls命令是列出目录内容(List Directory Contents)的意思.运行它就是列出文件夹里的内容,可能是文件也可能是文件夹. ...

最新文章

  1. 《为什么我们的决策总出错》摘录
  2. The prefix “mvc“ for element “mvc:annotation-driven“ is not bound 异常
  3. C++标准类型库string
  4. 产品经理入门应该怎样学习和成长?
  5. MVC之前的那点事儿系列(4):Http Pipeline详细分析(上)
  6. 【CF1230E】Kamil and Making a Stream【GCD性质】【暴力vector】
  7. NoSuchElementException
  8. CAN总线技术 | 物理层03 - 采样点
  9. python入门指南阅读答案_【python】入门指南1
  10. 按照两个dataframe的index合并数据
  11. Python之数据分析(Numpy的子模块:线性代数模块linalg、傅里叶变换模块fft)
  12. springcloud工作笔记107---Springboot中MyBatis 自动转换 map-underscore-to-camel-case=true 开启驼峰命名映射
  13. Kotlin — 心印(熟悉与锻炼Kotlin语法)
  14. windows更新不支持的硬件_漫威复仇者联盟首次打折半价,GTA5最大更新即将到来,糖豆人将更新困难模式,赛博朋克2077首发不支持A卡光追...
  15. (免费自取)厦门大学林子雨老师的spark(python)版本的pyspark链接hbase的jar包
  16. 银联刷卡POS机冲正
  17. 小程序实现文字竖排展示
  18. 花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...
  19. 编程累了进来听听音乐
  20. awg线径与电流_AWG_线径电流

热门文章

  1. 翻译狗文档免费下载手册(补充版)
  2. SQLServer中如何高效解析JSON格式数据
  3. 一文读懂Layer 2:Layer 2指基于底层区块链...
  4. HTML5视频和音频常见的格式,HTML5中视频音频的使用详解
  5. 用Tkinter打造GUI开发工具(35)Tkinter中的视频播放组件
  6. 金融量化分析【day112】:量化平台的使用-第一个策略
  7. 国外遥感影像如何下载之利用USGS网站影像下载无需JAVA
  8. 三星android截屏快捷键是什么,三星s10截屏快捷键是什么
  9. 在线OJ后端涉及到的知识点
  10. 哪个手机浏览器可以倍速_手机四款浏览器APP的比较