zoukankan      html  css  js  c++  java
  • 某代码查看器的保护突破

    现象

    分析

    通过行为分析,发现这个提示对话框应该是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.


  • 相关阅读:
    C# post请求,Json转换实体类
    jq div 托拉拽
    json转换成实体类
    C# 队列、锁、异步
    关于C#调用protobuf 序列化和反序列化
    关于System.Data.Entity.Infrastructure.DbUpdateException 的问题
    C# 本地CSS和JS引用无问题,部署服务器之后出现500错误
    windows服务
    下拉加载更多DEMO(js实现)
    禁用iPhone手机浏览器上给电话号码自动加上的link样式
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3073284.html
Copyright © 2011-2022 走看看