记得上次问树袋熊大哥,大哥回答得挺详细,但我一直想试一试INT 3断点是如何插入的。经过两天的折腾,终于弄明白了,不敢独享,大哥见笑啦。下面是分析:
目标:英语会话精灵2.0(topbar.exe)注册机
使用工具:IDA4.15,Softice
程序使用upx加壳,有改动!部分资源经过XOR加密(文件尾部)废话少说,切入正题。
为节省篇幅,只分析其原理:(假设已经知道我们要插入断点的地址--即已经跟踪出注册码地址)
<1>使用CreateProcessA加载要调试的程序topbar.exe,获得句柄hThread
循环使用ReadProcessMemory读取topbar.exe进程地址addr1(47a057),如果此处指令为我们预设指令,则
使用子程序(sub1)修改此处指令为INT 3(CCH),并保存原指令(5byte)后等待中断发生。
sub1 流程
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dwLength=1Ch
lpBuffer-->PMEMORY_BASIC_INFORMATION(dwLength=1C byte)
lpAddress-->addr1
hProcess-->
invoke VirtualQueryEx,hProcess,lpAddress,lpBuffer,dwLength(Kernel32.lib)
lpflOldProtect-->
flNewProtect=4;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
lpNumberOfBytesWritten=0
nSize=5
lpBuffer-->读取缓冲
lpBaseAddress-->addr1
hProcess-->
invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten
lpflOldProtect-->
flNewProtect=flOldProtect;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
<2>
&&&&&&&&&&&&&&&&&&&&&&&&&&&
中断发生后,由调试程序(注册机)接管,使用GetThreadContext取得topbar.exe的CONTEXT上下文
读取CONTEXT STRUCT的offset B8h即regEip的值,比较是否程序在此中断,此时regEip的值应为addr1+1,将regEip
减1,(即恢复IP指针)使用SetThreadContext保存修改了的CONTEXT结构
指针是恢复了但被修改的指令并没有恢复,因此下一步就是恢复原来的指令:调用sub2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sub2 流程
dwLength=1Ch
lpBuffer-->PMEMORY_BASIC_INFORMATION(dwLength=1C byte)
lpAddress-->addr1
hProcess-->
invoke VirtualQueryEx,hProcess,lpAddress,lpBuffer,dwLength(Kernel32.lib)
lpflOldProtect-->
flNewProtect=4;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
lpNumberOfBytesWritten=0
nSize=5
lpBuffer-->写缓冲指向保存好的指令
lpBaseAddress-->addr1
hProcess-->
invoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesWritten
lpflOldProtect-->
flNewProtect=flOldProtect;
dwSize-->1000h
lpAddress-->47a000
hProcess-->
invoke VirtualProtectEx,hProcess,lpAddress,dwSize,flNewProtect,lpflOldProtect
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
<3>
现在指令也恢复了,被调试程序可以正常运行了,完了吗,不对,忘了我们要干什么啦,好的,
下一步就是读取注册码(假设我们已经知道注册码的位置,在此程序中我们修改的指令的上一条指令POP EAX的EAX中存放
有注册码,见附源程序片段):
使用GetThreadContext取得topbar.exe的CONTEXT 结构上下文,
lpContext->CONTEXT 结构
ContextFlags=10007h ; CONTEXT_FULL=CONTEXT_CONTROL OR CONTEXT_INTEGER OR CONTEXT_SEGMENTS
invoke GetThreadContext,hThread,lpContext
此时CONTEXT ->B0h即regEax即为注册码的地址,将其存入CONTEXT-->B8h,然后使用ReadProcessMemory读出注册码.
CONTEXT STRUCT
ContextFlags DWORD ?
iDr0 DWORD ?
iDr1 DWORD ?
iDr2 DWORD ?
。。。
。。。
regEdx DWORD ?
regEcx DWORD ?
regEax DWORD ? ;offset B0
regEbp DWORD ?
regEip DWORD ? ;offset B8
regCs DWORD ?
regFlag DWORD ?
regEsp DWORD ?
regSs DWORD ?
ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
CONTEXT ENDS
××××××××××××××××××
topbar.exe源程序片段:
:0047A048 8B45F4 mov eax, dword ptr [ebp-0C]
:0047A04B 8D55F8 lea edx, dword ptr [ebp-08]
:0047A04E E89DE7F8FF call 004087F0
:0047A053 8B55F8 mov edx, dword ptr [ebp-08]
:0047A056 58 pop eax---》》》注册码
:0047A057 E8489EF8FF call 00403EA4
:0047A05C 0F853D010000 jne 0047A19F
:0047A062 6840000400 push 00040040
:0047A067 B908A24700 mov ecx, 0047A208
* Possible StringData Ref from Code Obj ->"successs!"
:0047A06C BA18A24700 mov edx, 0047A218
结论:通过上面的分析,现在我就可以写出自己的注册机,实际上我已经写了。使用的就是看雪学院下载的win32asm教程第28-29篇的debug篇的一个小程序(只需稍加改动,加入我的代码即可)当然,要想向树袋熊大哥一样写出那么漂亮的界面,那得下一翻大功夫.
如有想试牛刀者,Eamil to me softdim@vip.sina.com,英语会话精灵2.0(topbar.exe)及其注册机文件都不大,是一个很好的学习例子。
相关推荐
制造业重点关注的17个Agent智能体落地场景方案.pptx
制造业重点关注的17个Agent智能体落地场景方案.pptx
内核中的插桩调试
插桩法是内核常用的一种调试手段,利用代码中插桩,执行到此时执行对应的钩子函数(hook)来达到调试的目的,从实现来说,它不可避免的会带来一些性能上的开销,不过随着实现的不断优化,这部分的开销已经越来越小了。比如使能了 dynamic ftrace 后的内核,在关闭 ftrace 开关的情况下,实际上只是多了个几个 nop 指令,并不会带来很大的性能开销。下面就来看下内核中都有哪几种常用的插桩调试机制。 ftrace 我在其他博客中有介绍过,它的原理是使用 gcc 编译器的 -pg 选项,达到在内核代码中插桩
科技中介服务机构如何构建智能化服务平台以提升服务效率与专业度?.docx
科技中介服务机构如何构建智能化服务平台以提升服务效率与专业度?
深入探索编译插桩技术(三、解密 JVM 字节码)
本篇是《深入探索编译插桩技术》系列文章的第三篇,相比前两篇文章来说,难度上升了不止一个档次,所以含金量比较高。并且,拥有扎实的 JVM 字节码基础能让我们更好地掌握 ASM 这个强大的编译插桩工具,而灵活地运用 ASM 能让我们的个人以及项目团队的生产力有质的提升,这一点,无论是在中小型公司,还是在一二线的大公司来说,都是能极大地提升自身的生产力以及个人与团队的价值。因此,掌握 JVM 字节码便是一件迫不及待的事情了。 下面👇,让我们扬帆起航开始我们的JVM 字节码探索之旅吧。 本文吸取了市面...
【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策
内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。
H3C模拟器HCL防火墙路由模式主备配置实验
摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商
二进制插桩与DTA
二进制插桩 所谓插桩,其实就是在二进制程序指定位置(指令,函数)插入监控代码,类似hook,静态二进制插桩(Static Binary Instrumentation,SBI,反汇编,会修改磁盘文件)和动态二进制插桩(Dynamic Binary Instrumentation, DBI,对动态指令流进行修改,慢4倍)。常用框架有Intel Pin或者valgrind。(虚拟机对指令流进行修改) DTA 动态污点分析(Dynamic Taint Analysis,DTA)也称为数据流追踪(Data F
MATLAB实战:利用扫频数据重构系统伯德图的关键步骤
本文详细介绍了如何利用MATLAB处理扫频数据并重构系统伯德图的完整实战流程。内容涵盖数据导入与清洗、增益与相位的精确计算、频率响应数据对象(frd)的构建、数据平滑与插值处理,以及最终生成专业伯德图并进行关键参数(如相位裕度)标注的方法。文章重点解决了从实测“黑盒子”系统数据出发,获取直观频率响应特性曲线的核心问题,为控制系统分析与设计提供了实用指南。
反调试 - int 2dh , int 3h
原理 第 0x2d(45) 号中断处理函数是 KiDebugService,执行Int 2dh指令时,进程如果没有处于被调试状态,将会抛出异常,如果在被调试状态则能够正常执行。我们可以利用这一点检测调试器的存在。 如果...
从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧
本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。
如何入门强化学习
很多同学在入门强化学习的时候都会遇到困难,那我这里就简单介绍一下应该如何入门强化学习,并以开源代码为例详解强化学习实战。
int3断点指令的原理和示例
今天有人让我解释一下断点调试的原理,我就想先解释一下int3指令,就写了一篇短文。 单字节指令int3的二进制码是0xcc,它的效果是: 处理器执行到0xcc时,会陷入内核,执行int3的异常处理代码,比如给当前进程发送一个SIGTRAP信号。 就这么简单。剩下的就看信号处理程序如何发挥了。 我给出一个简单的代码,演示一下一个程序的 自我单步跟踪 如何实现: #include <stdio.h> #include <sys/mman.h> #include <signal.
SAP ABAP BADI_FINS_ACDOC_POSTING_EVENTS 深度应用:KO88工单结算的凭证字段定制与财务数据增强
本文深入探讨了SAP ABAP中BADI_FINS_ACDOC_POSTING_EVENTS在KO88工单结算中的应用,详细解析了如何通过BADI实现财务凭证字段的定制与数据增强。文章提供了从结构扩展到BADI方法实现的完整步骤,包括性能优化建议和实际应用中的测试验证流程,帮助开发人员高效解决企业个性化财务需求。
通过实例学习ROP技术
这两天闲着无聊就在 exploit-db 上找个小软件练练手,但是 exploit-db 上面给的 poc 并能正常运行,无奈只好自己写了一个,顺便写篇文章把自己写 shellcode 的思路分享给大家。 软件介绍及环境搭建 漏洞软件:MPlayer 虚拟机:win xp sp3 实验工具:OD 软件下载地址及POC: https://pan.baidu.com/s/1kWdnKkZ 这款软件有点年份了,并且开启了 DEP 保护机制。我们的目的是通过使用 ROP 技术绕过 DEP 并执行
linux应用程序段错误调试
一、堆、栈 在分析段错误之前,先了解一下什么是堆?什么是栈? 堆:一般由开发者分配释放,如果没有释放,程序结束时,在有的OS中可能会被自动释放,分配方式类似于链表。堆的操作方式为,队列优先,先进先出的原则。 栈:由操作系统自动分配,存放函数的参数值,局部变量。栈的操作方式为,先进后出的原则。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH:操作在堆栈的顶部加入一个元素...
华南理工大学电子与信息学院23年预推免复试面试经验贴
华南理工大学电子与信息学院23年预推免复试面试经验贴
VirtualProtect()
VirtualProtect 改变调用进程的一段页的保护属性。要改变其他进程,请使用 VirtualProtectEx 函数。 BOOL WINAPI VirtualProrect( __in LPVOID lpAddress , __in SIZE_T dwSize , __in DWORD flNewProtect , __out PDWORD lpfl
海波龙(Hyperion,现属 Oracle)合并报表以 HFM(Hyperion Financial Management)为核心系统,方法论核心是以控制为基础确定合并范围,通过维度建模统一数据口径
摘要:海波龙合并报表系统(HFM)采用"规则驱动、维度建模"的方法论,通过四个核心环节实现自动化合并:确定合并范围、数据标准化、自动抵销调整及报表生成。系统支持多会计准则,以控制为基础划分合并方法(完全合并/权益法/成本法),通过维度建模统一数据口径,自动处理内部交易抵销、外币折算等复杂操作。业务操作流程涵盖数据采集、转换、抵销调整到报表生成全过程,关键控制点包括内部交易匹配、股权变动处理等。最终输出合规合并报表及完整审计线索,满足监管与管理需求。(150字)
使数据区“可执行”的几种常规办法
一、VirtualProtect 这个函数可以修改缓冲区的页面属性,传入 PAGE_EXECUTE_READWRITE 让缓冲区可执行。 BOOL VirtualProtect( LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect ); 二、SetProcessDEPPolicy 这个函数可以在运行时修改进程的DEP属性。 BOOL SetProcessDEPPolicy( DWORD
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
int 3中断与软件调试
摘要:平常编程调试的过程中,我们可能会有这样的疑惑:“为什么使用硬件模拟器,比如bochs调试的时候,开始设置的调试断点都不会生效?”,“断点调试的本质是什么,为什么程序能够在特定的地方停留下来?既然程序是指令流,为何CPU没有一直执行下去?”,“在软件中断的情况下,如何进行调试?”。断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能。本章我们将介绍IA-32 CPU是如何支持断点和单步
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
如何用int 3
int 3就是我们常说的软件断点,问题是,在什么时候我们需要用到int 3呢? 我们经常会碰到这样一种场景,有时候一个软件会由多个EXE组成,其中的某些EXE是由另外的EXE调用的,这时候我们通常调用其它EXE创建进程的时候必须用Visual Studio 的Attach Process把VS的调试器和进程关联上(同样用WinDbg也是如此)。这时候我们会碰到一个问题,就是因为
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
int 3 断点原理
和大家分享一下自己的想法,错误之处请指出,话不多说: 学习目的:调试过程中你能够灵活的利用断点,几乎可以事半功倍,断点包括(硬件断点 内存断点,int3断点...) 从原理+实践出发,更好.更深入的了解int3 断点原理 (int3 机器码为 CC) 环境配置 先讲笔者现在的电脑环境吧还是:windows7 旗...
VirtualProtect函数
首先我们来看看MSDN上对VirtualProtect函数的说明。 BOOL VirtualProtect( LPVOID lpAddress, DWORD dwSize, DWORD flNewProtect, PDWORD lpflOldProtect ); 各参数的意义为: lpAddress,要改变属性的内存起始地址。 dwSize,要改变属性的内存区
2684



被折叠的 条评论
为什么被折叠?



