逆向工程——从分析到流程结构至破解
文章只供研究用 其他用途概不负责 有问题请私密 如有侵权等请联系 立马删除博文
软件名称:
软件来源:
目标模块:登录 注册 重启验证
工具:OD(单分支执行)——IDA(详细分析)——PEiD(初步扫描)——Procmon(监控程序操作)
前言:
一个合格的逆向从事者或者研究者,在我看来不管程序安全机制完善度有多高,都应该拿出自己最高的技术标准去对待
程序的操作行为是未知的,而你是探索这个黑盒的人,留个心眼总会给你带来安全感。
OD动态分析需要干什么:
打开:CreateProcess创建调试进程—接受调试事件 PS:因为资料缺陷以及本人比较懒,感兴趣的朋友可以私下分析
附加:注册窗口类—Createsorteddata创建进程表—填充进程表(详细请参考百度文章(https://wenku.baidu.com/view/0bd24c1d10a6f524ccbf8538.html)—OpenProcess打开目标进程—填充进程表—CreateWindow创建窗口—DebugActiveProcess调试器捆绑
OD常用分析方法(附加):开发者稍微有点安全意识都会做防破解
壳——压缩壳
这个感觉没啥好说的,使用PE变形技术对PE进行瘦身,嵌入代码到目标程序(修改程序OEP至嵌入的代码在接上程序本身代码),嵌入的代码作用为还原(针对使用的PE瘦身技术进行还原)
壳——加密壳
VMP:主要分为两个版本 3.0以上或3.0以下
3.0以下的反反调试/脱壳/技术已经成熟 。 (相对不安全)
3.0以上的版本因为公开资料等等原因相对比较复杂。 (相对安全) PS:目前国内的几个团队自动化已经成功 ,公开资源已经有过反调试等脚本流露出来
壳——压缩+加密(多层壳)
外壳/里壳/壳中壳 (麻烦) PS:单层壳会脱 多层就不会了?
字符串加密
反调试
守护进程
修改SSDT入口实现的HOOK技术 PS:SSDT分为两种 基于Win32k.sys的SSDT以及常规SSDT
PS:本文章的重点不再这里,所以就不详细解释了!!!
正文:
程序预览
判断开发语言—加壳情况
根据节表的信息判断为无壳 VB语言开发
首先附加程序——断下关机 格盘等API
判断一下PEiD的识别是否准确
在IDE程序开发中一般会有重定位属性 所以根据Base Address+Offset获得程序入口地址
根据VB入口特征 以及OD反馈信息 确定PDiD识别准确 VB开发
定位登陆模块的方法
1:根据字符法+回溯法获得
2:根据按钮事件脚本获得
3:根据特征码(816C24)获得
开始定位模块地址
调试阶段——修改标志位,反向跳转
跟踪到此,程序跑飞掉,恢复所有线程,继续跟踪。
修改标志位,反向跳转
登陆模块破解完毕
定位注册模块的方法
1:根据字符法+回溯法获得
2:根据按钮事件脚本获得
3:API钩子
VbaStrcmp 比较两个字符串
VbaFreeStr 释放出字符串所占的内存
VbaFreeObj 释放出VB一个对象
VbaVarDup 复制变量
4个函数的功能 从正向来说 你会干嘛?
判断串——释放内存——释放对象
这串信息会给我们分析提供很大的帮助 既然提示“注册名不允许为空” 肯定是判断了长度了 既然如此 我们肯定也能在这里得到注册名正确的长度,不过在这里我们先执行破解 摸清楚大概的程序走向!!!
我们记住“48D070”这个地址 看是谁对这个地址进行了写入操作 在顺藤摸瓜就能找到算法Call了
一般来说到这里来说 程序的注册模块基本宣告破解完毕,但是真的如此么?开发者真的一点保护都没做?
在查壳阶段没看到加壳 分析的过程中也没碰到反调试/关键数据加密/这种时候就要留个心眼了,大家都是聪明人 别降低大家智商!!
伪注册
重新打开程序我们发现依然提示未注册 ,按照正向的思路
打开用户输入的序列号/注册码文件——调用算法模块——跟用户文件内容比较——根据结果做出相应反应
按照这种思路,我们之前的破解分析工作都白费了? 这是错误的思想 起码我们摸清楚了注册模块,这种伪注册也只是重新验证了一次而已,我们在把它干掉不就好了。逆向分析/破解的日常中 这是很正常的,文章开头提出的黑盒就是这个意思,你不知道它到底是个什么流程,你只能碰见一个问题,解决一个问题!!!
既然得出了正向思路,我们验证我们的思路
重启验证方法
API
监控软件
我们通过监控发现很多操作都是基于MDB数据库的,所以换一条路,通过API来实现
VB程序封装了一层 所以我们不通过Win32API,通过VB的API。 PS:吾爱OD/看雪/爱破解/是很成熟的OD
__vbastrcomp __vbastrcmp __vbavartsteq rtcMidCharVar rtcLeftCharVar __vbaStrCat ASC 这是比较常见的
断下来且没有弹出注册窗口。说明方法可行,继续跟踪!
再一次出现真码 我们细心分析后续操作
VbaStrMove
72A26C30 > 56 push esi ; 天泽医院.0048D070
72A26C31 8BF1 mov esi,ecx ; 天泽医院.0048D070
72A26C33 57 push edi
72A26C34 8BFA mov edi,edx //Edi=真码(0069172C)
72A26C36 8B06 mov eax,dword ptr ds:[esi]
72A26C38 85C0 test eax,eax
72A26C3A 74 07 je short msvbvm60.72A26C43 //ZF=1
72A26C3C 50 push eax
72A26C3D FF15 F4199472 call dword ptr ds:[<&OLEAUT32.#6>] ; oleaut32.SysFreeString
72A26C43 893E mov dword ptr ds:[esi],edi //DS:[48D070]=0069172C
72A26C45 8BC7 mov eax,edi //Eax=真码(0069172C)
72A26C47 5F pop edi
72A26C48 5E pop esi ; 天泽医院.0048D070
真码被复制到了DS:[48D070]
0046F292 . 8B15 70D04800 mov edx,dword ptr ds:[0x48D070] //Edx=真码
0046F298 . 8B45 D8 mov eax,dword ptr ss:[ebp-0x28]
0046F29B . 8995 48FFFFFF mov dword ptr ss:[ebp-0xB8],edx //真码入栈
0046F2A1 . 8D55 AC lea edx,dword ptr ss:[ebp-0x54]
0046F2A4 . C785 40FFFFFF>mov dword ptr ss:[ebp-0xC0],0x8008
0046F2AE . 8B08 mov ecx,dword ptr ds:[eax] ; msado15.1D70D3E8
0046F2B0 . 52 push edx
0046F2B1 . 50 push eax
0046F2B2 . FF51 54 call dword ptr ds:[ecx+0x54] ; msado15.1D70C3D2
真码入栈了 我们可以在细心一点跟踪
vbaVarTstEq
从表面来看 这似乎是判断真假码了,我们跟进去看下
72A497F6 > FF7424 08 push dword ptr ss:[esp+0x8]
72A497FA FF7424 08 push dword ptr ss:[esp+0x8]
72A497FE 6A 00 push 0x0
72A49800 E8 51FEFFFF call msvbvm60.72A49656
72A49805 8B0485 A4E69672 mov eax,dword ptr ds:[eax*4+0x7296E6A4]
72A4980C C2 0800 retn 0x8
Push真码的地址进了栈,我们继续跟进Call
注意:因为观察栈结构中的数据 实际发现跟想法对不上 ,并且在后续分析中,这两个地址大量出现并且影响着最终注册结果,但是通过观察栈段和数据段,我们发现没有任何的联系。所以我们根据最理想的情况来做假想
call msvbvm60.72A49656
Eax=真码地址 Ecx=假码地址
继续跟踪不管它!
这似乎才是真正的判断?
我们先看下函数
HRESULT VarBstrCmp( BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags );
bstrLeft 第一个串
bstrRight 第二个串
lcid
用于确定是使用UNICODE还是ANSI字符串的程序的语言环境标识符
dwFlags
以下是比较结果标志。
值 | 含义 |
---|---|
NORM_IGNORECASE 00000001 |
忽略大小写。 |
NORM_IGNORENONSPACE 0x00000002 |
忽略非空格字符。 |
NORM_IGNORESYMBOLS 0x00000004 |
忽略符号。 |
NORM_IGNOREWIDTH 0x00000008 |
忽略字符串宽度。 |
NORM_IGNOREKANATYPE 0x00000040 |
忽略假名类型。 |
NORM_IGNOREKASHIDA 0x00040000 |
忽略阿拉伯语的kashida字符。 |
返回代码/值 | 描述 |
---|---|
VARCMP_LT 0 |
bstrLeft小于bstrRight。 |
VARCMP_EQ 1 |
参数相等。 |
VARCMP_GT 2 |
bstrLeft大于bstrRight。 |
我们跟进去看下究竟是干嘛的
Eax=2 根据MSDN的信息来看,第一个字符串大于第二个字符串。 即:真码大于假码
这么看来先前不明的两个地址 0018FA1C 018FA70是为这个函数准备的 即:vbaVarTstEq调用VarBstrCmp及后续的一系列操作需要这两个地址
现在我们继续跟踪 直到返回程序地址段
Eax返回值为0 然后又释放掉了字符串变量 看来最终的结尾要来了
继续修改标志位 我们的注册是错误的 即:程序的执行结果,我们需要反着跟
程序后续还有些操作 但是主要判断已经破解掉 程序已经认为注册码是有效的 所以没继续跟下去。
到这里程序的 登陆模块——注册模块——重启验证模块等都已破解掉
注册机的开发将在另一篇博文
转载请注明出处.........感谢
逆向工程——从分析到流程结构至破解相关推荐
- 移植u-boot-2016.11到JZ2440(二:分析启动流程)
目录 2. 分析启动流程 2.1 u-boot.lds链接脚本 2.2 vectors.S 2.3 start.S 2.3.1 设置SVC管理模式.关看门狗.关 ...
- 移植u-boot-2012.04.01到JZ2440(二:分析启动流程)
目录 2. 分析启动流程 2.1 u-boot.lds链接脚本 2.2 start.S启动文件 2.2.1 设置异常向量表 2.2.2 设置SVC管理模式.关看门狗.关中断.设置时钟频 ...
- 16年10月18号2th运算符与流程结构
---恢复内容开始--- 2th: 一:运算符 算数运算符 + - * / %取余 9%3=0 ++自增 --自减 关系运算符 < <= ...
- 【讨论】基于WF的流程结构
大家都知道,在WF中默认情况下,其活动是以树状结构组成的,简单说就是复合活动包含其子活动,如果子活动也是复合活动也可以包含其子活动,但同一个活动不能成为两个活动的子活动.这种方式被大量使用在WF自带的 ...
- mysql顺序结构_MySQL学习之流程结构
流程结构 流程结构:代码的执行顺序. if分支 根据要求选择合适的执行部分. 基本语法 if在MySQL中有两种基本用法 1.用在select查询当中,当作一种条件来进行判断. 基本语法:if(条件, ...
- mysql page header_MySQL系列:innodb源码分析之page结构解析
page header是page的头信息,占用38个字节,分别存储以下信息: FIL_PAGE_SPACE 4字节 page所属的表 ...
- 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
文章目录 前言 一.ActivityManagerService.attachApplicationLocked 二.ActivityStackSupervisor.attachApplication ...
- c++基础——程序流程结构之选择结构
程序流程结构 C/C++支持最基本的三种程序运行结构:顺序结构.选择结构.循环结构 顺序结构:程序按顺序执行,不发生跳转 选择结构:依据条件是否满足,有选择的执行相应功能 循环结构:依据条件是否满足, ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...
最新文章
- iOS从零开始学习直播之2.采集
- 一些琐碎+分不清的知识点
- 如何成为一个设计师和程序员混合型人才
- WTM重磅更新,LayuiAdmin免费用 and more
- java构造器_Java类加载的过程
- java mq发送sdk_【转载】java实现rabbitmq消息的发送接受
- vrm华为_华为-笔记本电脑如何安装FusionCompute虚拟化平台?
- VALSE学习(十四):自主学习
- 279.完全平方数(力扣leetcode) 博主可答疑该问题
- MATLAB模糊控制器
- Android之伪装QQ后台偷偷发短信
- 中国农业大学计算机专硕2019分数线,中国农业大学2019考研复试分数线已公布
- [OCCT] OCC官方示例介绍
- 封装了一个加单的php验证码功能类,超级详细,麻雀虽小五脏俱全
- 【每日力扣10】有效的数独
- 如何通过自媒体创业月入万元
- 适用于程序员的钢琴、五线谱入门教程
- 分布式计算原理之分布式协调与同步(1)——分布式互斥
- 探探提醒对方账号异常_我告诉你探探中对方账号异常怎么回事
- springboot vue mybatis mysql校园疫情数据分析平台源码