Nisy 发表于 2017-6-29 00:21:33

AVS Vidoe Editor 7.5 验证分析

下午看到群里有人提到 AVS Vidoe Editor 的效果要胜过会声会影,于是从官方拖了一个看下效果。
官方网站:http://www.avs4you.com/

将程序安装到 D:\Program Files (x86)\AVS4YOU\AVSVideoEditor 目录
点注册后却打开 C:\Program Files (x86)\AVS4YOU\Registration.exe 程序来验证 ...


0018F328   00A69B6C/CALL 到 CreateProcessA 来自 AVSVideo.00A69B67
0018F32C   0018F3C0|ModuleFileName = "C:\Program Files (x86)\AVS4YOU\Registration.exe"
0018F330   0E379120|CommandLine = "C:\PROGRA~2\AVS4YOU\REGIST~1.EXE "-reg:Software\AVS4YOU\VideoEditor\""
0018F334   0018F3B4|pProcessSecurity = 0018F3B4
0018F338   0018F3B4|pThreadSecurity = 0018F3B4
0018F33C   00000001|InheritHandles = TRUE
0018F340   00000000|CreationFlags = 0
0018F344   00000000|pEnvironment = NULL
0018F348   00000000|CurrentDir = NULL
0018F34C   0018F370|pStartupInfo = 0018F370
0018F350   0018F360\pProcessInfo = 0018F360

于是乎,该公司的验证模式可能为通过进程间交换(传参)实现注册验证。也可能还有网络验证,如果注册信息是由Registration.exe来保存(也可以通过共享内存来传递给AVSVideoEditor.exe),那AVSVideoEditor.exe启动的时候一定会去读取保存的注册信息。懒得去看如何保存了,直接分析主程序的启动验证。


我们发现未注册窗口标题可以作为突破点:


但是右键搜索字符串却没有找到,所以该资源可能存在文本后其他DLL的资源中。我们在 AVSVideoEditor.sib 文件中发现该资源,资源字符串未 IDS_0, 搜索该字符串并下断。


004E3508|.E8 F3090000   CALL    AVSVideo.@TLicenceManager@%GetActualLicence$i$i12$%$qqrl$l
004E350D|.85C0          TEST    EAX, EAX                                                      ;kernel32.BaseThreadInitThunk
004E350F|.0F8D ED000000 JGE   AVSVideo.004E3602
004E3515|.66:C746 10 48>MOV   WORD PTR DS:, 48
004E351B|.8D45 C4       LEA   EAX, DWORD PTR SS:
004E351E|.E8 2912F2FF   CALL    AVSVideo.0040474C
004E3523|.50            PUSH    EAX                                                         ;kernel32.BaseThreadInitThunk
004E3524|.FF46 1C       INC   DWORD PTR DS:
004E3527|.BA 7C72B300   MOV   EDX, AVSVideo.00B3727C                                        ;IDS_0


在这里断下来了,并且我们发现了这个函数名:@TLicenceManager@%GetActualLicence$i$i12$%$qqrl$l
O(∩_∩)O哈哈~ 简直就是败笔,这个是导出函数名 ...
修改后发现显示关于等功能还是提示未注册,按道理来说肯定是在相同的函数中做验证,按这个思路试着找下特征码:

004E3FB7    43            INC   EBX
004E3FB8    8B4D D4         MOV   ECX, DWORD PTR SS:
004E3FBB    8B79 0C         MOV   EDI, DWORD PTR DS:
004E3FBE    3B5F 08         CMP   EBX, DWORD PTR DS:
004E3FC1^ 0F8C 59FFFFFF   JL      AVSVideo.004E3F20
004E3FC7    83C8 FF         OR      EAX, FFFFFFFF                  // EAX 不能返回 FFFFFFFF
004E3FCA    8B55 D8         MOV   EDX, DWORD PTR SS:
004E3FCD    64:8915 0000000>MOV   DWORD PTR FS:, EDX
004E3FD4    5F            POP   EDI                              ; AVSVideo.009D79CC
004E3FD5    5E            POP   ESI                              ; AVSVideo.009D79CC
004E3FD6    5B            POP   EBX                              ; AVSVideo.009D79CC
004E3FD7    8BE5            MOV   ESP, EBP
004E3FD9    5D            POP   EBP                              ; AVSVideo.009D79CC
004E3FDA    C3            RETN


特征码:0F 8C 59 FF FF FF 83 C8 FF 找到五处。果然如此 ...

修改后保存,程序没有校验,但是启动的时候还有一处弹框。我们定位下这里弹窗验证了什么:


004E6EA8    803D B8D5D500 0>CMP   BYTE PTR DS:, 0
004E6EAF    74 3A         JE      SHORT AVSVideo.004E6EEB
004E6EB1    6A 01         PUSH    1
004E6EB3    6A 00         PUSH    0
004E6EB5    66:C745 E4 0C00 MOV   WORD PTR SS:, 0C
004E6EBB    BA F475B300   MOV   EDX, AVSVideo.00B375F4         ; ASCII "MainForm::StartTimerOnTimer() - begin...\r\n"
004E6EC0    8D45 FC         LEA   EAX, DWORD PTR SS:
004E6EC3    E8 7C7F5800   CALL    AVSVideo.00A6EE44
004E6EC8    FF45 F0         INC   DWORD PTR SS:
004E6ECB    8B10            MOV   EDX, DWORD PTR DS:
004E6ECD    52            PUSH    EDX
004E6ECE    68 ACD5D500   PUSH    AVSVideo.00D5D5AC
004E6ED3    E8 F0DEF1FF   CALL    AVSVideo.00404DC8
004E6ED8    83C4 10         ADD   ESP, 10
004E6EDB    FF4D F0         DEC   DWORD PTR SS:
004E6EDE    8D45 FC         LEA   EAX, DWORD PTR SS:
004E6EE1    BA 02000000   MOV   EDX, 2
004E6EE6    E8 A9825800   CALL    AVSVideo.00A6F194
004E6EEB    6A 04         PUSH    4
004E6EED    8B8B C0080000   MOV   ECX, DWORD PTR DS:
004E6EF3    51            PUSH    ECX
004E6EF4    E8 57830500   CALL    AVSVideo.0053F250                ; 这个函数跟进 ...
004E6EF9    83C4 08         ADD   ESP, 8
004E6EFC    E8 2F530400   CALL    AVSVideo.0052C230
004E6F01    80B8 94000000 0>CMP   BYTE PTR DS:, 0
004E6F08    74 19         JE      SHORT AVSVideo.004E6F23

跟进 0053F250

0053F290    E8 B342FFFF   CALL    AVSVideo.@TLicenceManager@GetActualLicence$qqrlrd   // 又一次验证 ...
0053F295    8945 80         MOV   DWORD PTR SS:, EAX





函数名字都一样,败笔就是你编译lib的时候把函数导出名倒是去掉呀 ... 把这个验证返回值修改就不会弹未注册了,下方还有一处验证剩余多少天,由于没有注册信息会显示0天不过就显示一次不影响使用。

0053F73E    E8 FD2D1F00   CALL    AVSVideo.@AVSRegistry@$bdtr$qv   ; 注册后只弹一次框
0053F743    66:C747 10 1800 MOV   WORD PTR DS:, 18
0053F749    83C4 08         ADD   ESP, 8
0053F74C    84DB            TEST    BL, BL
0053F74E    74 12         JE      SHORT AVSVideo.0053F762          ; JMP 就不会弹窗
0053F750    8D45 FC         LEA   EAX, DWORD PTR SS:
0053F753    50            PUSH    EAX
0053F754    E8 C3000000   CALL    AVSVideo.0053F81C
0053F759    59            POP   ECX                              ; 0018FAFC
0053F75A    8B10            MOV   EDX, DWORD PTR DS:          ; AVSVideo.00B71D28
0053F75C    FF92 FC000000   CALL    NEAR DWORD PTR DS:       ; 弹框
0053F762    FF4F 1C         DEC   DWORD PTR DS:



我们OD再搜索一下@TLicenceManager类相关的导出函数吧:




一共6处,前五处是功能,最后一处是启动的弹窗。分析出验证流程,直接爆破掉好了。




猜想该公司整个系列都是这样的验证体系,通过进程交互完成注册信息的验证和保存,主程序启动时读取注册信息,并在 @TLicenceManager@GetActualLicenceXXXXXX 函数中完成是否注册的验证,可能是该公司被爆破过,所以做了N多个相同的这种函数,但是代码有五个函数是相同的,第六个也大同小异。爆破就是修改函数返回值即可。最后败笔就是编译lib的时候忘记去掉导出函数名了,导致我们很轻易就摸清楚了验证的设计流程。


飓风861 发表于 2017-6-29 00:51:20

谢谢分享   收藏了

飓风861 发表于 2017-6-29 00:51:30

谢谢分享   收藏了

不破不立 发表于 2017-6-29 07:33:54

校长动作好快,学习了,详尽的分析,破解的思路{:lol:}

不破不立 发表于 2017-6-29 07:34:04

校长动作好快,详尽的分析,学习了破解的思路{:lol:}

fcing 发表于 2017-6-29 08:33:53

校长好厉害哦

fcing 发表于 2017-6-29 08:34:02

校长好厉害哦

cfc1680 发表于 2017-6-29 08:50:50

大赞一个了,感谢分享了

cfc1680 发表于 2017-6-29 08:51:00

大赞一个了,感谢分享了

small-q 发表于 2017-6-29 08:52:43

学习,分析的很不错
页: [1] 2 3
查看完整版本: AVS Vidoe Editor 7.5 验证分析