FairStars Recorder 分析

FairStars Recorder 分析  
Ty1921
------------------------------------------------------------------------


1,PEID --> ASPack 2.12 -> Alexey Solodovnikov,因为是SMC,不脱壳。脱壳的话ESP定律再ImpREC简单修复即可。

2,表现:先出现主窗口,后出现注册窗口,有错误PN提示,ABOUT显示未注册版本,功能限制暂未尝试

3,关注:
(1)如果有注册码,会放在什么地方,该如何下断
(2)注册判断在主窗口初始化之后还是之前
(3)会不会出现干扰声音的暗桩,猜测是不是加入一段没有规律的声音跟原来的声音数据相与

4,先注册次,发现注册信息没有被清空,N大教程上指明了这里是个漏洞,于是转到OD,ALT+M打开内存,再按CTRL+B搜索,先用ASCII搜索没有找到,再换用unicode搜索,成功找到:
0016A658  74 00 79 00 31 00 39 00 32 00 31 00 00           t.y.1.9.2.1..
下硬件访问断点,之前没看最新的视频,所以这种方法没跟进,暂略....

5,OD载入,常规下断 bp GetPrivateProfileStringA,bp RegQueryValueA,程序运行后没有断下,要么API使用错误,要么根本没生成文件,对方判断不存在,自然不去读取

6,除SendMessage,UpdateWindow和Create打头的API外,其余全部下断(API断点设置工具),如果切换到注册窗口被断下时,取消该断点并F9运行,依次类推
点击Register注册,被ShowWindow断下。

复制内容到剪贴板
代码:
00116C24   77D4DACD  /CALL 到 ShowWindow 来自 comctl32.77D4DAC7
00116C28   005A09DC  |hWnd = 005A09DC (class='tooltips_class32',parent=002105EC)
00116C2C   00000000  /ShowState = SW_HIDE

取消该断点,继续F9运行,断在MessageBoxW

复制内容到剪贴板
代码:
00116A40   78316909  /CALL 到 MessageBoxW 来自 mfc80u.78316903
00116A44   002105EC  |hOwner = 002105EC ('Registration',class='#32770',parent=004C0606)
00116A48   005191B8  |Text = "Registration Number Incorrect!"
00116A4C   010E1490  |Title = "Recorder"
00116A50   00000030  /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL

7,向上跟踪,来到

复制内容到剪贴板
代码:
00420DB0    56              PUSH ESI
00420DB1    8BF1            MOV ESI,ECX
00420DB3    E8 08FEFFFF     CALL 00420BC0                            ; 弹出消息在该CALL内,跟进
00420DB8    85C0            TEST EAX,EAX
00420DBA    74 08           JE SHORT 00420DC4
00420DBC    8BCE            MOV ECX,ESI
00420DBE    5E              POP ESI
00420DBF    E9 A8B60500     JMP 0047C46C                             ; JMP to mfc80u.#4729
00420DC4    5E              POP ESI
00420DC5    C3              RETN

8,在00420BC0处按CTRL+F8(这是个很实惠的方法,可以让你键盘的F8长命百岁),不多时就弹出了对话框,来到:

复制内容到剪贴板
代码:
00420C8B    FF15 8C675100   CALL DWORD PTR DS:[51678C]               ; mfc80u.#2896
00420C91    83F8 01         CMP EAX,1                                ; 判断SN长度是否为16位
........
00420C9A    68 2C925100     PUSH 0051922C                            ; UNICODE "UserName Error!"
........
00420CC2    83F8 08         CMP EAX,8                                ; 判断PN是否为8位
........
00420D03    83F8 10         CMP EAX,10                               ; 判断SN是否为16位
00420D06    0F85 8A000000   JNZ 00420D96
00420D0C    E8 6DB70500     CALL 0047C47E                            ; JMP to mfc80u.#1079
00420D11    8B40 04         MOV EAX,DWORD PTR DS:[EAX+4]             ; 关注该地址
00420D14    8B68 20         MOV EBP,DWORD PTR DS:[EAX+20]
00420D17    8D86 D0070000   LEA EAX,DWORD PTR DS:[ESI+7D0]
00420D1D    50              PUSH EAX
00420D1E    8D8D 10340100   LEA ECX,DWORD PTR SS:[EBP+13410]
00420D24    FF15 98675100   CALL DWORD PTR DS:[516798]               ; mfc80u.#774
00420D2A    53              PUSH EBX
00420D2B    8D8D 14340100   LEA ECX,DWORD PTR SS:[EBP+13414]
00420D31    FF15 98675100   CALL DWORD PTR DS:[516798]               ; mfc80u.#774
00420D37    57              PUSH EDI
00420D38    8D8D 18340100   LEA ECX,DWORD PTR SS:[EBP+13418]
00420D3E    FF15 98675100   CALL DWORD PTR DS:[516798]               ; 执行该CALL三次
00420D44    8BCD            MOV ECX,EBP
00420D46    E8 152B0200     CALL 00443860                            ; 关键CALL,AL
00420D4B    84C0            TEST AL,AL
00420D4D    74 39           JE SHORT 00420D88                        ; 跳向失败
00420D4F    8BCE            MOV ECX,ESI
00420D51    E8 6AF9FFFF     CALL 004206C0
00420D56    6A 00           PUSH 0
00420D58    6A 00           PUSH 0
00420D5A    68 0C925100     PUSH 0051920C                            ; UNICODE "Registered OK!"
00420D5F    E8 F4B20500     CALL 0047C058                            ; JMP to mfc80u.#1118

9,先进入该关键CALL看下(选定该行回车,或者CTRL+G 输入地址00443860):

复制内容到剪贴板
代码:
00443860    53              PUSH EBX
........
0044386D    FF15 8C675100   CALL DWORD PTR DS:[51678C]               ; 取长度
00443873    83F8 10         CMP EAX,10
00443876    75 69           JNZ SHORT 004438E1                       ; 清0,SN位数错误
00443878    8DBE 14340100   LEA EDI,DWORD PTR DS:[ESI+13414]
0044387E    8BCF            MOV ECX,EDI
00443880    FF15 8C675100   CALL DWORD PTR DS:[51678C]               ; 51678c,取长度
00443886    83F8 08         CMP EAX,8
00443889    75 56           JNZ SHORT 004438E1                       ; 清0,PN位数错误
0044388B    8BCE            MOV ECX,ESI
0044388D    E8 6E62FFFF     CALL 00439B00                            ; 委琐的黑名单比较
00443892    84C0            TEST AL,AL
00443894    74 1A           JE SHORT 004438B0                        ;
00443896    5F              POP EDI
00443897    C786 08340100 0>MOV DWORD PTR DS:[ESI+13408],0
004438A1    C786 0C340100 0>MOV DWORD PTR DS:[ESI+1340C],1
004438AB    5E              POP ESI
004438AC    32C0            XOR AL,AL
004438AE    5B              POP EBX
004438AF    C3              RETN
004438B0    8BCB            MOV ECX,EBX
004438B2    FF15 4C695100   CALL DWORD PTR DS:[51694C]               ; mfc80u.#3391
004438B8    50              PUSH EAX
004438B9    8BCF            MOV ECX,EDI
004438BB    FF15 4C695100   CALL DWORD PTR DS:[51694C]               ; mfc80u.#3391
004438C1    50              PUSH EAX
004438C2    8BCE            MOV ECX,ESI
004438C4    E8 173CFFFF     CALL 004374E0                            ; 关键CALL,AL
004438C9    84C0            TEST AL,AL
004438CB    74 14           JE SHORT 004438E1                        ; 送0还是送的关键判断
004438CD    33C0            XOR EAX,EAX                              ; 清0
004438CF    5F              POP EDI
004438D0    8986 08340100   MOV DWORD PTR DS:[ESI+13408],EAX         ; 将AL=0传给标志位1
004438D6    8986 0C340100   MOV DWORD PTR DS:[ESI+1340C],EAX         ; 将AL=0传给标志位2
004438DC    5E              POP ESI
004438DD    B0 01           MOV AL,1
004438DF    5B              POP EBX
004438E0    C3              RETN
004438E1    B8 01000000     MOV EAX,1
004438E6    5F              POP EDI
004438E7    8986 0C340100   MOV DWORD PTR DS:[ESI+1340C],EAX         ; 将AL=1传给标志位1
004438ED    8986 08340100   MOV DWORD PTR DS:[ESI+13408],EAX         ; 将AL=1传给标志位2
004438F3    5E              POP ESI
004438F4    32C0            XOR AL,AL                                ; 清0操作
004438F6    5B              POP EBX
004438F7    C3              RETN

10,跟踪上面的关键call,因为只看返回的AL,来到段尾的这个的地方,也就是爆破点:

复制内容到剪贴板
代码:
004378A8    75 09           JNZ SHORT 004378B3                       ; 可以改为jnz 4378aa跳到下一行
004378AA    E8 C1660100     CALL 0044DF70
004378AF    B0 01           MOV AL,1
004378B1    EB 0D           JMP SHORT 004378C0
004378B3    89B7 0C340100   MOV DWORD PTR DS:[EDI+1340C],ESI
004378B9    E8 B2660100     CALL 0044DF70
004378BE    32C0            XOR AL,AL                                ; 可以改成inc al

11,SMC
找区段很是郁闷,很久不做都忘了怎么操作,加上系统快崩溃,偶尔冒个不相干的错误,真是无语。
topo感觉不如pe-tool好用,起码后者在加了区段之后能正常运行。

ESP,来到:

复制内容到剪贴板
代码:
0071840B   /75 08           jnz short Recorder.00718415              ; 可在此修改为跳转到SMC代码处  JMP 745000
0071840D   |B8 01000000     mov eax,1
00718412   |C2 0C00         retn 0C
00718415   /68 81CC4700     push Recorder.0047CC81                   ; 修改这里当然也是可行的,只要注意不覆盖RETN下面的指令
0071841A    C3              retn                                     ; 返回到OEP

以下任意一个可行:
mov byte ptr ds:[4378a9],00
mov byte ptr ds:[4378be],0fe

相关实现代码:

复制内容到剪贴板
代码:
00745000    C605 A9784300 0>mov byte ptr ds:[4378A9],0
00745007    C605 BE784300 F>mov byte ptr ds:[4378BE],0FE
0074500E    68 81CC4700     push Recorder.0047CC81                   ; 恢复壳中的代码,因为之前的jnz被改成jmp之后,覆盖了下面的指令
00745013  - C3              ret                                      ; 返回OEP

上面代码的二进制复制:
C6 05 A9 78 43 00 00 C6 05 BE 78 43 00 FE 68 81 CC 47 00 C3

12,资料和引用

SMC奥义:

1、找到跳向OEP的跳转,修改为JMP SMC代码   2、确定OEP地址   3、找空代码位置    4、确定怎么修改能达成破解      ——月之精灵

一般要在壳中找空白的空间,可以先从壳所在段未尾找。
在需要patch地方下断,仔细比对F9运行前后该段是否有变化,没有变化就能用了。                                      ——hflywolf

代码段的末尾向上找空白的地方,最好在.data段的最后或者把所有段的属性加上可执行可写,这样就随便找空白都可以      ——shoooo

luocong.com/articles/show_article.asp?Article_ID=18                                             ——老罗

SMC技术破解一般适应1~3层压缩保护,如果软件被壳多层保护,使用SMC技术会非常麻烦,不如脱壳解密来得快。           ——匿名

 

 

 

原文地址,   http://bbs.chinapyg.com/viewthread.php?tid=51802&extra=page%3D1       个人博客转载 。

你可能感兴趣的:(c,api,Class,mfc,byte,破解)