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 个人博客转载 。