- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
下午看到群里有人提到 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:[ESI+10], 48
- 004E351B |. 8D45 C4 LEA EAX, DWORD PTR SS:[EBP-3C]
- 004E351E |. E8 2912F2FF CALL AVSVideo.0040474C
- 004E3523 |. 50 PUSH EAX ; kernel32.BaseThreadInitThunk
- 004E3524 |. FF46 1C INC DWORD PTR DS:[ESI+1C]
- 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:[EBP-2C]
- 004E3FBB 8B79 0C MOV EDI, DWORD PTR DS:[ECX+C]
- 004E3FBE 3B5F 08 CMP EBX, DWORD PTR DS:[EDI+8]
- 004E3FC1 ^ 0F8C 59FFFFFF JL AVSVideo.004E3F20
- 004E3FC7 83C8 FF OR EAX, FFFFFFFF // EAX 不能返回 FFFFFFFF
- 004E3FCA 8B55 D8 MOV EDX, DWORD PTR SS:[EBP-28]
- 004E3FCD 64:8915 0000000>MOV DWORD PTR FS:[0], 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:[D5D5B8], 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:[EBP-1C], 0C
- 004E6EBB BA F475B300 MOV EDX, AVSVideo.00B375F4 ; ASCII "MainForm::StartTimerOnTimer() - begin...\r\n"
- 004E6EC0 8D45 FC LEA EAX, DWORD PTR SS:[EBP-4]
- 004E6EC3 E8 7C7F5800 CALL AVSVideo.00A6EE44
- 004E6EC8 FF45 F0 INC DWORD PTR SS:[EBP-10]
- 004E6ECB 8B10 MOV EDX, DWORD PTR DS:[EAX]
- 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:[EBP-10]
- 004E6EDE 8D45 FC LEA EAX, DWORD PTR SS:[EBP-4]
- 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:[EBX+8C0]
- 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:[EAX+94], 0
- 004E6F08 74 19 JE SHORT AVSVideo.004E6F23
- 跟进 0053F250
- 0053F290 E8 B342FFFF CALL AVSVideo.@TLicenceManager@GetActualLicence$qqrlrd // 又一次验证 ...
- 0053F295 8945 80 MOV DWORD PTR SS:[EBP-80], EAX
复制代码
函数名字都一样,败笔就是你编译lib的时候把函数导出名倒是去掉呀 ... 把这个验证返回值修改就不会弹未注册了,下方还有一处验证剩余多少天,由于没有注册信息会显示0天不过就显示一次不影响使用。
- 0053F73E E8 FD2D1F00 CALL AVSVideo.@AVSRegistry@$bdtr$qv ; 注册后只弹一次框
- 0053F743 66:C747 10 1800 MOV WORD PTR DS:[EDI+10], 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:[EBP-4]
- 0053F753 50 PUSH EAX
- 0053F754 E8 C3000000 CALL AVSVideo.0053F81C
- 0053F759 59 POP ECX ; 0018FAFC
- 0053F75A 8B10 MOV EDX, DWORD PTR DS:[EAX] ; AVSVideo.00B71D28
- 0053F75C FF92 FC000000 CALL NEAR DWORD PTR DS:[EDX+FC] ; 弹框
- 0053F762 FF4F 1C DEC DWORD PTR DS:[EDI+1C]
复制代码
我们OD再搜索一下@TLicenceManager类相关的导出函数吧:
一共6处,前五处是功能,最后一处是启动的弹窗。分析出验证流程,直接爆破掉好了。
猜想该公司整个系列都是这样的验证体系,通过进程交互完成注册信息的验证和保存,主程序启动时读取注册信息,并在 @TLicenceManager@GetActualLicenceXXXXXX 函数中完成是否注册的验证,可能是该公司被爆破过,所以做了N多个相同的这种函数,但是代码有五个函数是相同的,第六个也大同小异。爆破就是修改函数返回值即可。最后败笔就是编译lib的时候忘记去掉导出函数名了,导致我们很轻易就摸清楚了验证的设计流程。
|
评分
-
查看全部评分
|