首页
社区
课程
招聘
[原创]萌新上路, 学习EditPlus注册码校验流程
发表于: 2020-9-23 12:33 3299

[原创]萌新上路, 学习EditPlus注册码校验流程

2020-9-23 12:33
3299

本文是我在科锐学习汇编过程中的一个知识的运用, 感谢科锐老师们的耐心教导. 另外我文笔较差, 如有错误的地方, 还望各路大佬指点.

操作到弹框提示, 激活失败

image-20200922211105973

栈回溯, 找到验证流程的代码

MesageBoxW: 此时已经显示错误信息了. 再往上走两层, 因为注册激活所做的事情一般不会一个函数做完, 可能会有封装.

image-20200922212606232

再次找到一处代码, 此时错误消息已经传递到了函数, 大概率不是校验函数

image-20200922212730931

此处代码, 仍然概率不大

image-20200922212828406

通过栈回溯最后选中了0039A8FC

image-20200922213418364

在0039A8FC向上的一个call(addr:0039A8F7)下断

未发现参数明显含有账号名,注册码 的 call调用, 所以再往上找一层call调用.

image-20200922214550486

此时, EBP 看上去栈已经找不到此函数的返回地址了. 所以沿着 0039A8F7 的代码, 往上翻翻根据特征查找函数头部

image-20200922214811408

根据上一步信息在 0039A5C0 处下断, 运行观察验证是否为要找的目标函数的头部.

校验函数分析1(0039A5C0)

0039ADA0 此函数非常符合特征

image-20200922220055846

之后还有一个返回值 eax, 对比跳转的动作, 很可疑.

调试函数返回后, 此时 eax 为0, 尝试改为1使他后面的jnz 发生跳转.

image-20200922220538525

提示激活成功, 那么初步确定此函数为加密校验高度相关的函数.

校验函数分析2(0039ADA0)

程序重新跑起来后, 直接在 0039ADA0 处断了下来. 猜测程序启动时会校验身份的有效性. 先不动, F9 直接运行

image-20200922221116393

提示注册码无效. 再次验证了0039ADA0函数跟校验关系密切. 将程序退出重新跑起来, 单步分析0039ADA0函数

此函数中间一个两层大循环, 最后的eax值为 call 00EEB238的返回值

image-20200922222036919

校验函数分析3(0024B238)

函数很简单

image-20200922223536844

去掉无效代码

image-20200922223442303

经调试发现, cmp 条件是恒成立的, 相等直接ret. 所以需要看上一个函数(001BAC60)

image-20200922223801541

校验函数分析4(001BAC60)

一堆加密算法, 就不一一截图了.

image-20200922223914801

可以看出有很多jxx跳转到 001BAD83 的xor eax, eax 然后调用 分析3(0024B238)处, 上文已分析此函数对eax不影响. 所以关键点就是

为了验证, 将jxx 001BAD83的代码全部干掉. 一共三处

image-20200922224605136

注册激活分析就此告一段落

image-20200922224734720

总结:

先监视注册表相关API, 在以下函数下断, 然后程序跑起来

RegOpenKeyExW

image-20200922230207411

013F7DFF 处为系统注册表, 不理会.

image-20200922231507221

012B6F25 打开失败, 也不理会

image-20200922231719345

继续排出不关注的注册表断点, 此处就比较可疑.

image-20200922232807968

后面紧接着就是注册表的查询, 可疑

image-20200922232907414

继续运行发现另一处也断下来了, 而且查询了相同的 ValueName = License 5, 但跟结点不同.

image-20200922233856347

基于此搜索注册表 ES-Computing,找到三处 ?\Software\ES-Computing\EditPlus\Install\License xx, 全部删除测试

分析完毕, 身份是以加密形式存放在注册表中.

image-20200923000153850

总结:

本文是我在科锐学习汇编过程中的一个知识的运用, 感谢科锐老师们的耐心教导. 另外我文笔较差, 如有错误的地方, 还望各路大佬指点.

  • VM 虚拟机
    • windows 7(32)
  • windows 7(32)
  • EditPlus
    • 分析注册码读写方式
    • 分析激活流程
  • 分析注册码读写方式
  • 分析激活流程
  • OllyICE
  • 用户输入用户名注册码, 鼠标点击注册按钮完成授权激活
    • 校验通过: 激活成功
    • 校验失败: 弹框提示, 激活失败, 程序挂起
  • 校验通过: 激活成功
  • 校验失败: 弹框提示, 激活失败, 程序挂起
  • 实现功能的方式
    1. 获取输入的用户名和注册码
    2. 验证算法和验证动作
      • 不排除需要网络
    3. 验证成功, 保存授权身份.
  • 不排除需要网络
  • 鼠标点击注册按钮时, 监视获取窗口Text的相关函数
  • 鼠标点击注册按钮时, 监视窗口处理过程的鼠标点击事件
  • 鼠标点击注册按钮时, 监视窗口处理过程的Command事件
  • 在弹框提示激活失败时, 调试器暂停根据栈信息回溯定位关键流程
  • 软件打开程序都能识别授权身份
  • 如果需要达到以上功能有几种方式
    1. 写文件
    2. 写注册表
    3. 通过网络
  • 监视文件相关函数
  • 监视注册表相关函数
  • 排除网络方式(虚拟机环境无网络功能仍然正常)
  • 选择在弹框提示激活失败时, 调试器暂停根据栈信息回溯定位关键流程的方式进行定位分析
  • 注册激活的重点是校验部分, 而校验部分必须有充足的条件至少包含用户名、注册码. 所以找关键函数时, 以此特征作为条件筛查.
  • 注意: 验证代码肯定不会在系统库中
  • 进入 call 003E8D08 内部调试
  • 未发现参数明显含有账号名,注册码 的 call调用, 所以再往上找一层call调用.

    image-20200922214550486

  • 此时, EBP 看上去栈已经找不到此函数的返回地址了. 所以沿着 0039A8F7 的代码, 往上翻翻根据特征查找函数头部

    image-20200922214811408

  • 根据上一步信息在 0039A5C0 处下断, 运行观察验证是否为要找的目标函数的头部.

    • 通过单步执行已验证无误.
  • 通过单步执行已验证无误.
  • 单步筛选参数含有用户名、注册码的call
  • 0039ADA0 此函数非常符合特征

    image-20200922220055846

  • 之后还有一个返回值 eax, 对比跳转的动作, 很可疑.

  • 调试函数返回后, 此时 eax 为0, 尝试改为1使他后面的jnz 发生跳转.

    image-20200922220538525

  • 提示激活成功, 那么初步确定此函数为加密校验高度相关的函数.

  • 先在0039ADA0处下断, 上一步提示需要重新启动程序. 所以此时需要重启应用程序.
  • 程序重新跑起来后, 直接在 0039ADA0 处断了下来. 猜测程序启动时会校验身份的有效性. 先不动, F9 直接运行

    image-20200922221116393

  • 提示注册码无效. 再次验证了0039ADA0函数跟校验关系密切. 将程序退出重新跑起来, 单步分析0039ADA0函数

  • 此函数中间一个两层大循环, 最后的eax值为 call 00EEB238的返回值

    image-20200922222036919

  • 函数很简单

    image-20200922223536844

  • 去掉无效代码

    image-20200922223442303

  • 经调试发现, cmp 条件是恒成立的, 相等直接ret. 所以需要看上一个函数(001BAC60)

    image-20200922223801541

  • 一堆加密算法, 就不一一截图了.

    image-20200922223914801

  • 可以看出有很多jxx跳转到 001BAD83 的xor eax, eax 然后调用 分析3(0024B238)处, 上文已分析此函数对eax不影响. 所以关键点就是

    • 001BAD7C: mov eax, 1
    • 001BAD83: xor eax, eax
  • 为了验证, 将jxx 001BAD83的代码全部干掉. 一共三处

    image-20200922224605136

  • 001BAD7C: mov eax, 1
  • 001BAD83: xor eax, eax
  • 函数(001BAC60) 是校验函数, 程序内部的多次校验都是调用的此函数以次函数的eax结果识别身份是否有效. 很容易绕过.
  • RegOpenKeyW
  • RegOpenKeyExA
  • RegOpenKeyExW

    image-20200922230207411

  • 软件怎么识别身份这里, 运气成分较大所以到这里好像没什么可以总结的.
  1. 系统:
    • VM 虚拟机
      • windows 7(32)
  2. 目标:
    • EditPlus
      • 分析注册码读写方式
      • 分析激活流程
  3. 工具:
    • OllyICE
  1. 功能
    • 用户输入用户名注册码, 鼠标点击注册按钮完成授权激活
      • 校验通过: 激活成功
      • 校验失败: 弹框提示, 激活失败, 程序挂起
  2. 思路
    • 实现功能的方式
      1. 获取输入的用户名和注册码
      2. 验证算法和验证动作
        • 不排除需要网络
      3. 验证成功, 保存授权身份.
  3. 切入点
    • 鼠标点击注册按钮时, 监视获取窗口Text的相关函数
    • 鼠标点击注册按钮时, 监视窗口处理过程的鼠标点击事件
    • 鼠标点击注册按钮时, 监视窗口处理过程的Command事件
    • 在弹框提示激活失败时, 调试器暂停根据栈信息回溯定位关键流程
  1. 获取输入的用户名和注册码
  2. 验证算法和验证动作
    • 不排除需要网络
  3. 验证成功, 保存授权身份.
  1. 功能
    • 软件打开程序都能识别授权身份
  2. 思路
    • 如果需要达到以上功能有几种方式
      1. 写文件
      2. 写注册表
      3. 通过网络
  3. 切入点
    • 监视文件相关函数
    • 监视注册表相关函数
    • 排除网络方式(虚拟机环境无网络功能仍然正常)
  1. 写文件
  2. 写注册表
  3. 通过网络
  1. 切入点
    • 选择在弹框提示激活失败时, 调试器暂停根据栈信息回溯定位关键流程的方式进行定位分析
    • 注册激活的重点是校验部分, 而校验部分必须有充足的条件至少包含用户名、注册码. 所以找关键函数时, 以此特征作为条件筛查.
  2. 栈回溯
    • 注意: 验证代码肯定不会在系统库中
  3. 操作到弹框提示, 激活失败

    image-20200922211105973

    1. 调试器操作: 暂停执行, 可观察到栈情况
    2. 栈回溯, 找到验证流程的代码

      1. MesageBoxW: 此时已经显示错误信息了. 再往上走两层, 因为注册激活所做的事情一般不会一个函数做完, 可能会有封装.

        image-20200922212606232

      2. 再次找到一处代码, 此时错误消息已经传递到了函数, 大概率不是校验函数

        image-20200922212730931

      3. 此处代码, 仍然概率不大

        image-20200922212828406

      4. 通过栈回溯最后选中了0039A8FC

        image-20200922213418364

    3. 在0039A8FC向上的一个call(addr:0039A8F7)下断

      • 进入 call 003E8D08 内部调试
      • 未发现参数明显含有账号名,注册码 的 call调用, 所以再往上找一层call调用.

        image-20200922214550486

      • 此时, EBP 看上去栈已经找不到此函数的返回地址了. 所以沿着 0039A8F7 的代码, 往上翻翻根据特征查找函数头部

        image-20200922214811408

      • 根据上一步信息在 0039A5C0 处下断, 运行观察验证是否为要找的目标函数的头部.

        • 通过单步执行已验证无误.
  4. 校验函数分析1(0039A5C0)

    • 单步筛选参数含有用户名、注册码的call
    • 0039ADA0 此函数非常符合特征

      image-20200922220055846

    • 之后还有一个返回值 eax, 对比跳转的动作, 很可疑.

    • 调试函数返回后, 此时 eax 为0, 尝试改为1使他后面的jnz 发生跳转.

      image-20200922220538525

    • 提示激活成功, 那么初步确定此函数为加密校验高度相关的函数.

  5. 校验函数分析2(0039ADA0)

    • 先在0039ADA0处下断, 上一步提示需要重新启动程序. 所以此时需要重启应用程序.
    • 程序重新跑起来后, 直接在 0039ADA0 处断了下来. 猜测程序启动时会校验身份的有效性. 先不动, F9 直接运行

      image-20200922221116393

    • 提示注册码无效. 再次验证了0039ADA0函数跟校验关系密切. 将程序退出重新跑起来, 单步分析0039ADA0函数

    • 此函数中间一个两层大循环, 最后的eax值为 call 00EEB238的返回值

      image-20200922222036919

  6. 校验函数分析3(0024B238)

    • 函数很简单

      image-20200922223536844

    • 去掉无效代码

      image-20200922223442303

    • 经调试发现, cmp 条件是恒成立的, 相等直接ret. 所以需要看上一个函数(001BAC60)

      image-20200922223801541

  7. 校验函数分析4(001BAC60)

    • 一堆加密算法, 就不一一截图了.

      image-20200922223914801

    • 可以看出有很多jxx跳转到 001BAD83 的xor eax, eax 然后调用 分析3(0024B238)处, 上文已分析此函数对eax不影响. 所以关键点就是

      • 001BAD7C: mov eax, 1
      • 001BAD83: xor eax, eax
    • 为了验证, 将jxx 001BAD83的代码全部干掉. 一共三处

      image-20200922224605136

  8. 注册激活分析就此告一段落

    image-20200922224734720


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-23 12:38 被scanxx编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//