汇编学习实战修改win32扫雷
概述
概述下面的游戏我们都玩过
这个扫雷的程序点击右上角的关闭按钮会直接退出整个程序。我们利用od实现如下效果:
点击右上角弹出一个dialog
,让用户确认是否是否关闭。
思路概念
win
程序有消息机制,关闭的时候会触发WM_CLOSE
消息.因此我们首先断点这个消息看看大致逻辑。
OD
窗口点击查看->窗口(无数据请右键刷新)
选中对应的窗口选中消息断点。
接着点击扫雷关闭按钮触发关闭消息
这里利用断点分析后续流程
我首先记录下结论:
01001c23
如果是close消息会跳转到010021a2
010021a2
会将消息分发到系统默认处理。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扫雷相关推荐
- Win32汇编学习——windows汇编语法(小甲鱼教程)
Win32汇编学习--windows汇编语法(小甲鱼教程) 1)指令集 .386 语句是汇编语句的伪指令,类似指令有:.8086 . .186 ..286 ..386/.386p . .486/ ...
- 8086汇编学习小记-王爽汇编语言实验12
8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...
- 寄存器---汇编学习笔记
第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...
- Keras深度学习实战(3)——神经网络性能优化技术详解
Keras深度学习实战(3)--神经网络性能优化技术详解 0. 前言 1. 缩放输入数据集 1.1 数据集缩放的合理性解释 1.2 使用缩放后的数据集训练模型 2. 输入值分布对模型性能的影响 3. ...
- Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...
- 逆向学习实战之--替换哈罗单车图片
逆向学习实战之–替换哈罗单车图片 最近学习iOS逆向知识也有一段时间了,今天就找了一个App练下手,来检测这段时间的学习效果. 逆向的APP是哈罗单车,目的是实现替换地图上面单车的定位图片,之前好像在 ...
- 【HSI】高光谱的数据集分类深度学习实战及代码理解
[HSI]高光谱的数据集分类深度学习实战及代码理解 文章目录 [HSI]高光谱的数据集分类深度学习实战及代码理解 一.配置文件编写 二.高光谱图像的处理 2.1图像数据变换 2.2 数据整合 2.3 ...
- 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1
日萌社 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1 人工智能AI:TensorFlow Keras PyTorch ...
- 8086汇编学习之[BX],CX寄存器与loop指令,ES寄存器等
同类学习笔记总结: (一).8086汇编学习之基础知识.通用寄存器.CS/IP寄存器与Debug的使用 (二).8086汇编学习之DS寄存器.SS/SP寄存器 一.汇编程序的基本格式: 1.基本格式与 ...
最新文章
- SoC(System on chip)与NoC(network-on-chip)
- opencv4.4.0函数手册_实战 MySQL8.0 窗口函数的巧妙应用
- 排序算法入门之冒泡排序优化
- 处理Excel,填充空白区域
- microstation添加txt文件_C开发实战-文件操作
- Sublime和LaTeX支持
- linux安装moodle最新版,在linux下安装moodle
- 【Java练习】图书管理系统【详解篇15+完整代码】
- k-means聚类算法过程与原理
- 编译原理课程设计c语言,编译原理课程设计心得体会
- 2021年全国计算机南京考点,2021考研考场安排:往年南京市考研考点及考场安排
- 国内Linux笔记天花板,不接受反驳!
- VUE学习笔记------奕长苏
- 中国象棋棋盘java_如何用java swing 实现中国象棋的棋盘。棋盘就好。。。
- 如何安装cygwin
- GoogleNet、AleXNet、VGGNet、ResNet等总结
- 配合清退工作,建议将金融科技纳入监管沙盒
- Oracle 优化篇+Linux系统参数(vm.min_free_kbytes)
- 第三类医疗器械经营企业注册条件
- 很经典话,随便一句都可以当做QQ签名