概述

概述下面的游戏我们都玩过

这个扫雷的程序点击右上角的关闭按钮会直接退出整个程序。我们利用od实现如下效果:
点击右上角弹出一个dialog,让用户确认是否是否关闭。

思路概念

win程序有消息机制,关闭的时候会触发WM_CLOSE消息.因此我们首先断点这个消息看看大致逻辑。

OD窗口点击查看->窗口(无数据请右键刷新)


选中对应的窗口选中消息断点。


接着点击扫雷关闭按钮触发关闭消息


这里利用断点分析后续流程


我首先记录下结论:

  1. 01001c23 如果是close消息会跳转到010021a2
  2. 010021a2 会将消息分发到系统默认处理。
  3. 010021bb 将会返回过程函数

于是我们利用如下思想完成需求:
01001c23跳转我们的额外我们内部插入新的代码。
内部代码如果是close消息那么弹出dialog,如果不是跳转回010021a2.
如果用户点击dialog确认关闭按钮,那么跳转回010021a2
如果用用户点击dialog取消按钮,那么跳转到010021bb 从而跳过关闭事件

于是我们在某处写入如下代码:


疑问点你怎么知道MessageBoxA函数位置?



od如何保存修改的代码到新的exe?


注入与重定位

假设我们需要单独写一个程序,对扫雷进行注入弹出一个dialog.其需要考虑重定位问题.


执行上面的按钮会执行注入一段代码到扫雷程序.

.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitiveinclude dlgdemo.inc.datag_szWinimeName db "扫雷",0g_szUser32 db "user32",0g_szMessageBoxA db "MessageBoxA",0
.code;被注入的代码
INJECT_CODE:;这里主要让其把字符串也拷贝过去jmp INJECT_MESGBOXg_szHello db "helloworld",0;存储messagbox函数的相对位置;messagbox是dll库地址,因此每个程序相对dll的位置是固定的g_pfnMessageBox dd 0INJECT_MESGBOX:;重定向代码正确位置,因为注入后offset是原始程序的地址,而不是目标程序的地址call NEXT
NEXT:;call后会存储当前返回地址到栈。此处弹出返回地址计算相对偏移pop ebx;减去之后得到两个程序之间的偏移差sub ebx,offset NEXT;得到字符串的地址lea eax,[offset g_szHello+ebx];得到messagebox的相对位置lea ecx,[offset g_pfnMessageBox+ebx]push MB_OKpush NULLpush eaxpush NULLcall dword ptr [ecx]retINJECT_END:g_dwCodeSize dd $ - offset INJECT_CODE;InitInject 主要用于让其代码段可读可写
;g_pfnMessageBox存储在代码段但是我们需要让其存储MessageBoxA函数地址
InitInject procLOCAL @hUser32:HANDLELOCAL @dwOldProc:DWORDinvoke VirtualProtect,offset INJECT_CODE,g_dwCodeSize,PAGE_EXECUTE_READWRITE,addr @dwOldProcinvoke GetModuleHandle,offset g_szUser32;存储模块句柄mov @hUser32,eaxinvoke GetProcAddress,@hUser32,offset g_szMessageBoxAmov g_pfnMessageBox,eaxinvoke VirtualProtect,offset INJECT_CODE,g_dwCodeSize,@dwOldProc,addr @dwOldProcretInitInject endpInject procLOCAL @hWnd:HWNDLOCAL @dwPid:DWORDLOCAL @hProc:HWNDLOCAL @lpAddr:LPVOIDLOCAL @dwBytesWrited:DWORDLOCAL @hUser32:HANDLEint 3;得到窗口句柄invoke FindWindow,NULL,offset g_szWinimeNamemov @hWnd,eax;得到进程的idinvoke GetWindowThreadProcessId,@hWnd,addr @dwPid;得到进程句柄并获取所有权限invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,@dwPid;保存进程句柄mov @hProc,eax;申请内存invoke VirtualAllocEx,@hProc,NULL,1000h,MEM_COMMIT,PAGE_EXECUTE_READWRITE;保存内存引用mov @lpAddr,eax;int 3;内存写入invoke  WriteProcessMemory,@hProc,@lpAddr,offset INJECT_CODE,offset INJECT_END - offset INJECT_CODE,addr @dwBytesWrited;创建线程invoke CreateRemoteThread,@hProc,NULL,0,@lpAddr,NULL,0,NULLretInject endpstart:invoke GetModuleHandle,NULLmov        hInstance,eaxinvoke InitCommonControlsinvoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULLinvoke ExitProcess,0;########################################################################DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAMmov        eax,uMsg.if eax==WM_INITDIALOG.elseif eax==WM_COMMANDmov edx,wParam.if dx==btn_xxxinvoke InitInject;invoke MessageBox,hWin,offset g_szHello,NULL,MB_OKinvoke Inject.endif.elseif eax==WM_CLOSEinvoke EndDialog,hWin,0.elsemov       eax,FALSEret.endifmov       eax,TRUEretDlgProc endpend start

汇编学习实战修改win32扫雷相关推荐

  1. Win32汇编学习——windows汇编语法(小甲鱼教程)

    Win32汇编学习--windows汇编语法(小甲鱼教程) 1)指令集 .386 语句是汇编语句的伪指令,类似指令有:.8086 . .186  ..286  ..386/.386p  . .486/ ...

  2. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  3. 寄存器---汇编学习笔记

    第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...

  4. Keras深度学习实战(3)——神经网络性能优化技术详解

    Keras深度学习实战(3)--神经网络性能优化技术详解 0. 前言 1. 缩放输入数据集 1.1 数据集缩放的合理性解释 1.2 使用缩放后的数据集训练模型 2. 输入值分布对模型性能的影响 3. ...

  5. Keras深度学习实战(1)——神经网络基础与模型训练过程详解

    Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...

  6. 逆向学习实战之--替换哈罗单车图片

    逆向学习实战之–替换哈罗单车图片 最近学习iOS逆向知识也有一段时间了,今天就找了一个App练下手,来检测这段时间的学习效果. 逆向的APP是哈罗单车,目的是实现替换地图上面单车的定位图片,之前好像在 ...

  7. 【HSI】高光谱的数据集分类深度学习实战及代码理解

    [HSI]高光谱的数据集分类深度学习实战及代码理解 文章目录 [HSI]高光谱的数据集分类深度学习实战及代码理解 一.配置文件编写 二.高光谱图像的处理 2.1图像数据变换 2.2 数据整合 2.3 ...

  8. 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1

    日萌社 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1 人工智能AI:TensorFlow Keras PyTorch ...

  9. 8086汇编学习之[BX],CX寄存器与loop指令,ES寄存器等

    同类学习笔记总结: (一).8086汇编学习之基础知识.通用寄存器.CS/IP寄存器与Debug的使用 (二).8086汇编学习之DS寄存器.SS/SP寄存器 一.汇编程序的基本格式: 1.基本格式与 ...

最新文章

  1. SoC(System on chip)与NoC(network-on-chip)
  2. opencv4.4.0函数手册_实战 MySQL8.0 窗口函数的巧妙应用
  3. 排序算法入门之冒泡排序优化
  4. 处理Excel,填充空白区域
  5. microstation添加txt文件_C开发实战-文件操作
  6. Sublime和LaTeX支持
  7. linux安装moodle最新版,在linux下安装moodle
  8. 【Java练习】图书管理系统【详解篇15+完整代码】
  9. k-means聚类算法过程与原理
  10. 编译原理课程设计c语言,编译原理课程设计心得体会
  11. 2021年全国计算机南京考点,2021考研考场安排:往年南京市考研考点及考场安排
  12. 国内Linux笔记天花板,不接受反驳!
  13. VUE学习笔记------奕长苏
  14. 中国象棋棋盘java_如何用java swing 实现中国象棋的棋盘。棋盘就好。。。
  15. 如何安装cygwin
  16. GoogleNet、AleXNet、VGGNet、ResNet等总结
  17. 配合清退工作,建议将金融科技纳入监管沙盒
  18. Oracle 优化篇+Linux系统参数(vm.min_free_kbytes)
  19. 第三类医疗器械经营企业注册条件
  20. 很经典话,随便一句都可以当做QQ签名

热门文章

  1. NOI2004郁闷的出纳员题解
  2. 计算机基础课程范文,计算机基础课程计报告范文.doc
  3. Python小例子——利用递归绘制分形树
  4. niuke --abc
  5. 性能统计工具 sysstat 使用介绍
  6. Retrofit流程及设计模式全解析
  7. 工作站的数据处理比微型计算机,高效液相色谱分析-数据处理系统
  8. 【VRP问题】基于模拟退火遗传实现带时间窗的车辆路径规划问题
  9. TWaver HTML5 on Microsoft Surface RT
  10. jimogsh 推荐《Mathematica演示项目笔记》