某代码查看器的保护突破

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/8914637

现象

分析

通过行为分析,发现这个提示对话框应该是modal dialog性质的messagebox.在win32 api中,好像有doModalDialog和MessageBox的函数,由于界面相关操作的api一般存在于user32.dll

用windbg附加到进程上去,并查找一下有没有上面函数.

对照MSDN,主要在上面下划线的函数打断点

运行一下si,照样输入注册码”hello world”

根据MessageBox的原型

int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTRlpCaption,UINT UType);

看一下第二个参数0006fcac,由于是A后缀,说明是ASCII码.

可见,这里已经找到了相应的错误处理分支.

如果这个进程是多线程的话,那么它有可能通过另外一个线程把注册码比对结果放到这个线程来弹出对话框.

看一下有多少个线程:

只有一个线程,看来它比对注册码应该也是这个线程里.

再仔细看一下栈:

0006fc7000407c8d 000d0226 0006fcac 005bc3dcUSER32!MessageBoxA

WARNING:Stack unwind information not available. Following frames may be wrong.

0006fc9400407ec5 0006fcac 00000005 00000000Insight3+0x7c8d

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

0006fec400447ac5 00000001 00000000 00000000 Insight3+0x48c3c

0006fee00043fdfd 7c921000 0006fed0 7c937ea0 Insight3+0x47ac5

0006ff340051ed0b 00400000 00000000 00092341 Insight3+0x3fdfd

0006ffc07c81776f 00091378 7c93003d 7ffd9000 Insight3+0x11ed0b

可以看到,

0006fc9400407ec5 0006fcac 00000005 00000000Insight3+0x7c8d

的第一个参数和MessageBoxA的第二个参数是一样的.也就是说,真正产生

You typedan invalid serial number

是在

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

而由windbg显示堆栈的第二列数据是返回地址,指向调用者函数的下一条指令可知,

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

的地址是00407ec5

由于00407ec5是位于执行文件的地址范围,又是绝对地址,所以,用ida打开这个执行文件,跳转到这个地址

根据调用约定,可以看到, 0006fcac这个值是00407EAD这条指令调用_sprintf得来的.这方面的知识可以看我<<coredump原理问题探究windows版>>的第三章.

在00407EAD断点,看一下并在windbg下看一下这段汇编:

可以看到, ebp+Str就是ebp+8,就是函数的第一个参数.看一下这个参数是什么,按照sprintf的原型,它应该是格式化字符串

由于这个值是第一参数,由上一层函数

0006fec400447ac5 00000001 00000000 00000000 Insight3+0x48c3c

传过来的.

返回值则是由

0006feac00448c3c 0053e96c 00000001 00000002 Insight3+0x7ec5

可知是00448c3c.

有可能上一层函数才是做注册码校验,由于校验不通过,才会走到错误分支,把这个值传过来,弹出一个对话框来的.

用IDA看一下00448c3c所在的函数

可以看到,确实如此.那么loc_448c32这个分支是由哪里跳过来的.

双击一下右面的

; CODE XREF: sub_448AC3+11Dj

就可以跳转到

由上面可以看到,跳到loc_448c32是因为sub_448f37的返回值为0.也就是说,sub_448f37有可能是校验注册码的函数.

在调用sub_448F37的地址00448BD9打断点,看一下sub_448F37的参数值是什么?

可以看到,sub_448F37确实是校验注册码的地方.

通过对sub_448F37里面的一系列过程逆向,可以找出42万个注册码.有这样的特征:

SI3US-XXXXXX-YYYYY

其中X和Y可以是任意数字.必须有六个X,五个Y.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈仁松博客

UWP基础教程 - XAML开篇

XAML是英文Extensible Application Markup Language的缩写,中文可以称为“可扩展应用程序标记语言”,是基于Extensiv...

4278
来自专栏大内老A

基于CallContextInitializer的WCF扩展导致的严重问题

WCF是一个具有极高扩展度的分布式通信框架,无论是在信道层(Channel Layer)还是服务模型层(Service Model),我们都可以自定义相关组件通...

2229
来自专栏技术博客

Json.Net6.0入门学习试水篇

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。简单地说,JSON 可以将 JavaScript 对象中表示的...

1062
来自专栏大内老A

Dora.Interception: 一个为.NET Core度身定制的AOP框架

多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码。之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代...

2765
来自专栏大内老A

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator

对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute。...

22910
来自专栏AhDung

【手记】未能从程序集System.Net.Http.Formatting中加载类型System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter

2393
来自专栏张善友的专栏

Ibatisnet Quick Start

准备工作 1. 下载ibatis软件包(http://ibatis.apache.org/dotnetdownloads.html)。 2. 创建测试数据库,并...

1978
来自专栏张善友的专栏

IBatisNet基础组件

DomSqlMapBuilder DomSqlMapBuilder,其作用是根据配置文件创建SqlMap实例。可以通过这个组件从Stream, Uri, Fil...

3165
来自专栏程序员的SOD蜜

C#调用C和C++函数的一点区别

最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程...

2626
来自专栏数据结构与算法

RNQOJ [stupid]愚蠢的矿工(树形依赖背包)

$f[i][j] = max(f[i + 1][j - w[i]] + val[i], f[i + siz[rev[i]]][j]);$

1774

扫码关注云+社区

领取腾讯云代金券