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的时候忘记去掉导出函数名了,导致我们很轻易就摸清楚了验证的设计流程。
谢谢分享 收藏了
谢谢分享 收藏了
校长动作好快,学习了,详尽的分析,破解的思路{:lol:} 校长动作好快,详尽的分析,学习了破解的思路{:lol:} 校长好厉害哦 校长好厉害哦 大赞一个了,感谢分享了 大赞一个了,感谢分享了 学习,分析的很不错