SourceFormatX的分析

据说作者是个比较牛X的人物,传说这个软件破不了
软件官方站为:http://cn.textrush.com/formatxdownload.htm 

简单说一下,这款软件比较适合程序员用,是个格式化代码的软件,在龙族论坛看到有人求破解,顺便分析了一下。以下是我的部分分析。

用 PEID V0.94 查壳显示为 PECompact 1.68 - 1.84 -> Jeremy Collake


OD载入忽略OD提示的加壳信息,OD取消分析

程序入口
005D4900 > /EB 06           JMP SHORT SourceFo.005D4908              ; 向下走
005D4902   |68 58321700     PUSH 173258
005D4907   |C3              RETN
005D4908   \9C              PUSHFD                                   ; 再向下走一步
005D4909    60              PUSHAD                                   ; 在这看寄存器ESP的值。利用ESP堆栈平衡原理对0023ffc0下断点 在命令行下 hr 0012ffc0 然后按F9键运行程序
005D490A    E8 02000000     CALL SourceFo.005D4911
005D490F    33C0            XOR EAX,EAX

我们来到了这里F8但步走
00625550    50              PUSH EAX                                 ; 程序停在这。
00625551    68 58325700     PUSH SourceFo.00573258                   ; 注意看这句跳转很远,00573258 就是程序的真正入口点
00625556    C2 0400         RETN 4                                   ; 返回到程序的真正入口点

00573258    55              PUSH EBP                                 ; 在这个位置脱壳就可以了。
00573259    8BEC            MOV EBP,ESP
0057325B    B9 98000000     MOV ECX,98
00573260    6A 00           PUSH 0
00573262    6A 00           PUSH 0
00573264    49              DEC ECX
00573265  ^ 75 F9           JNZ SHORT SourceFo.00573260
00573267    53              PUSH EBX
00573268    56              PUSH ESI
00573269    57              PUSH EDI
0057326A    B8 202B5700     MOV EAX,SourceFo.00572B20
0057326F    E8 D434E9FF     CALL SourceFo.00406748
00573274    33C0            XOR EAX,EAX
00573276    55              PUSH EBP
00573277    68 B6755700     PUSH SourceFo.005775B6
0057327C    64:FF30         PUSH DWORD PTR FS:[EAX]
0057327F    64:8920         MOV DWORD PTR FS:[EAX],ESP
00573282    68 C8755700     PUSH SourceFo.005775C8                   ; ASCII "SourceFormatX"
00573287    6A FF           PUSH -1
00573289    6A 00           PUSH 0
0057328B    E8 9435E9FF     CALL SourceFo.00406824                   ; JMP 到 kernel32.CreateMutexA
00573290    E8 5736E9FF     CALL SourceFo.004068EC                   ; JMP 到 ntdll.RtlGetLastWin32Error

现在开始修复输入表
运行未脱壳程序,然后在ImportREC v1.6获取系统中的进程中选择d:\software\sourceformatx\sourceformatx.exe这个文件。
用 PEID V0.94 查脱壳后的文件新的入口点为:00173258
在ImportREC v1.6的OEP窗口中填入新的入口点地址00173258,然后点自动获取ITA,然后再点获取输入表,这时我们可以在ImportREC v1.6的已找到的输入表函数窗口中看到内容。点ImportREC v1.6下面的修复抓取文件,然后选择脱壳后的那个文件

运行程序测试
程序提示错误信息意思是原程序被修改或是感染了病毒要求重新安装。
This file has been modified. Reason might be a possible virus infection!
Please scan your system with Anti-Virus software and reinstall SourceFormatX.

这个软件在设置菜单中有个语言选择功能,观察程序安装目录下有个Language文件夹,里面是软件的多语言包。所以软件运行的时候是中文的但刚才的提示是英文信息。

OD从新载入,下断点bp MessageBoxA 然后F9运行程序断在这里

77D504EA >  8BFF            MOV EDI,EDI                              ; ntdll.7C930738
77D504EC    55              PUSH EBP
77D504ED    8BEC            MOV EBP,ESP
77D504EF    833D BC04D777 0>CMP DWORD PTR DS:[77D704BC],0
77D504F6    74 24           JE SHORT user32.77D5051C
77D504F8    64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
77D504FE    6A 00           PUSH 0
77D50500    FF70 24         PUSH DWORD PTR DS:[EAX+24]
77D50503    68 240BD777     PUSH user32.77D70B24
77D50508    FF15 C812D177   CALL DWORD PTR DS:[<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange

堆栈中的信息
0012FA1C   005723FE  /CALL 到 MessageBoxA 来自 dump_1_.005723F9
0012FA20   00000000  |hOwner = NULL
0012FA24   0137F550  |Text = "This file has been modified. Reason might be a possible virus infection!
Please scan your system with Anti-Virus software and reinstall SourceFormatX."
0012FA28   00000000  |Title = NULL
0012FA2C   00000030  \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0012FA30   0012FA3C  指向下一个 SEH 记录的指针
0012FA34   00572419  SE处理程序
0012FA38   0012FA90
0012FA3C   0012FAA0  指向下一个 SEH 记录的指针
0012FA40   0057243B  SE处理程序

bc MessageBoxA 清除断点。
0012FA1C   005723FE  /CALL 到 MessageBoxA 来自 dump_1_.005723F9

ALT+F9 执行到用户代码

005723F6  |.  50            PUSH EAX                                 ; |Text
005723F7  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
005723F9  |.  E8 E64CE9FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
005723FE  |.  E8 A516E9FF   CALL dump_1_.00403AA8                    ;  我们停在这句
00572403  |>  33C0          XOR EAX,EAX

向上看,005723AC这句可以跳过信息提示,我们在他上一句005723AA上按F2键下断点,然后从新载入程序.
005723AA  |.  85C0          TEST EAX,EAX
005723AC  |.  74 55         JE SHORT dump_1_.00572403                ;  这可以跳过刚才的提示信息。
005723AE  |.  B8 58020000   MOV EAX,258
005723B3  |.  E8 F865FEFF   CALL dump_1_.005589B0
005723B8  |.  6A 30         PUSH 30
005723BA  |.  6A 00         PUSH 0
005723BC  |.  8D55 C4       LEA EDX,DWORD PTR SS:[EBP-3C]
005723BF  |.  B8 50245700   MOV EAX,dump_1_.00572450                 ;  ASCII "048239208055115004022092049223212153211085088214096235171199045065175245161237188161254047037044011202138091162136004109021094209142142036171036237229012230163058010161174013220001021217133220159233060049216058002163226161077173070012013"...    ;这些数字可能是RAS加密
005723C4  |.  E8 F3F2EDFF   CALL dump_1_.004516BC
005723C9  |.  FF75 C4       PUSH DWORD PTR SS:[EBP-3C]
005723CC  |.  68 58255700   PUSH dump_1_.00572558                    ;  ASCII "
"
005723D1  |.  B8 64255700   MOV EAX,dump_1_.00572564                 ;  ASCII "048239210055115005023082048225032131104081179097192149072070167172013195138060209158198098085058087004039104198123010065130095202131063119190206127103009221021177089221145007117196097146071015201010225245113084060124061078241091099049249"...    ;这些数字可能是RAS加密
005723D6  |.  8D55 C0       LEA EDX,DWORD PTR SS:[EBP-40]
005723D9  |.  E8 DEF2EDFF   CALL dump_1_.004516BC
005723DE  |.  FF75 C0       PUSH DWORD PTR SS:[EBP-40]
005723E1  |.  8D45 C8       LEA EAX,DWORD PTR SS:[EBP-38]
005723E4  |.  BA 03000000   MOV EDX,3
005723E9  |.  E8 4E1BE9FF   CALL dump_1_.00403F3C
005723EE  |.  8B45 C8       MOV EAX,DWORD PTR SS:[EBP-38]
005723F1  |.  E8 4A1CE9FF   CALL dump_1_.00404040
005723F6  |.  50            PUSH EAX                                 ; |Text
005723F7  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
005723F9  |.  E8 E64CE9FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
005723FE  |.  E8 A516E9FF   CALL dump_1_.00403AA8                    ;  我们停在这句

从新载入后运行程序,我们停在005723AA  |.  85C0          TEST EAX,EAX 把光标停在这句上,按空格键我们修改代码
把TEST EAX,EAX改成xor EAX,EAX然后把修改后的文件存盘。

005723A4  |.  5A            POP EDX
005723A5  |.  E8 F26EE9FF   CALL dump_1_.0040929C
005723AA  |.  85C0          TEST EAX,EAX                             ;  把这句改成 xor eax,eax
005723AC  |.  74 55         JE SHORT dump_1_.00572403                ;  这可以跳过刚才的提示信息。
005723AE  |.  B8 58020000   MOV EAX,258

现在运行程序。当程序打开后程序运行正常,但他会不断的调用系统的Explore.exe来打开WINDOWS的窗口。(好在哥们512M内存,差点被他搞挂了。哈哈。)想办法把他打开的所有窗口都关掉吧(估计你得花点时间).然后从新用OD载入程序。

下断点 bp WinExec 然后F9运行程序

7C86114D >  8BFF            MOV EDI,EDI                                           ; ntdll.7C930738

此时程序停在上面这句。我们看看堆栈显示的数据

0012F6CC   0055F134  /CALL 到 WinExec 来自 dump_2.0055F12F
0012F6D0   00FA542C  |CmdLine = "Explorer.exe"                    ; 注意这句是调用系统的Explorer.exe文件
0012F6D4   00000003  \ShowState = SW_SHOWMAXIMIZED
0012F6D8   0012F6E4  指向下一个 SEH 记录的指针
0012F6DC   0055F14C  SE处理程序

ALT+F9 执行到用户代码 此时已经打开了一个Explorer.exe窗口,关掉他。

0055F134  |.^\EB E1         \JMP SHORT dump_2.0055F117                            ;  我们停在这句上

向上看代码

0055F0F9  |.  55            PUSH EBP
0055F0FA  |.  68 4CF15500   PUSH dump_2.0055F14C
0055F0FF  |.  64:FF32       PUSH DWORD PTR FS:[EDX]
0055F102  |.  64:8922       MOV DWORD PTR FS:[EDX],ESP
0055F105  |.  6A 00         PUSH 0                                                ; /pFileSizeHigh = NULL
0055F107  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]                          ; |
0055F10A  |.  50            PUSH EAX                                              ; |hFile
0055F10B  |.  E8 D477EAFF   CALL <JMP.&kernel32.GetFileSize>                      ; \GetFileSize
0055F110      3D A8421200   CMP EAX,1242A8
0055F115  |.  7E 1F         JLE SHORT dump_2.0055F136
0055F117  |>  6A 03         /PUSH 3
0055F119  |.  B8 B8F45500   |MOV EAX,dump_2.0055F4B8                              ;  ASCII "048229125055114025094102049210040021027068051099091168132234034161018208011"
0055F11E  |.  8D55 E8       |LEA EDX,DWORD PTR SS:[EBP-18]
0055F121  |.  E8 9625EFFF   |CALL dump_2.004516BC
0055F126  |.  8B45 E8       |MOV EAX,DWORD PTR SS:[EBP-18]
0055F129  |.  E8 124FEAFF   |CALL dump_2.00404040
0055F12E  |.  50            |PUSH EAX                                             ; |CmdLine
0055F12F  |.  E8 4079EAFF   |CALL <JMP.&kernel32.WinExec>                         ; \WinExec
0055F134  |.^ EB E1         \JMP SHORT dump_2.0055F117                            ;  我们停在这句上


0055F105  |.  6A 00         PUSH 0                                                ; /pFileSizeHigh = NULL
0055F107  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]                          ; |
0055F10A  |.  50            PUSH EAX                                              ; |hFile
0055F10B  |.  E8 D477EAFF   CALL <JMP.&kernel32.GetFileSize>                      ; \调用API GetFileSize 获得文件大小
0055F110      3D A8421200   CMP EAX,1242A8                                        ;  这里是跟未脱壳前的文件大小做比较,这里的1242A8是原来的文件尺寸,EAX里的22F000换算成十进制是2289664,刚好是我们脱壳后的文件尺寸 (2.18 MB (2,289,664 字节) 这里我们把 CMP EAX,1242A8 改成 CMP EAX,22F000 当然你也可以直接把下面这句 JLE SHORT dump_2.0055F136 改成 jmp 0055F136
0055F115  |.  7E 1F         JLE SHORT dump_2.0055F136
0055F117  |>  6A 03         /PUSH 3
0055F119  |.  B8 B8F45500   |MOV EAX,dump_2.0055F4B8                              ;  ASCII "048229125055114025094102049210040021027068051099091168132234034161018208011"
0055F11E  |.  8D55 E8       |LEA EDX,DWORD PTR SS:[EBP-18]
0055F121  |.  E8 9625EFFF   |CALL dump_2.004516BC
0055F126  |.  8B45 E8       |MOV EAX,DWORD PTR SS:[EBP-18]
0055F129  |.  E8 124FEAFF   |CALL dump_2.00404040
0055F12E  |.  50            |PUSH EAX                                             ; |CmdLine
0055F12F  |.  E8 4079EAFF   |CALL <JMP.&kernel32.WinExec>                         ; \WinExec
0055F134  |.^ EB E1         \JMP SHORT dump_2.0055F117                            ;  我们停在这句上
0055F136  |>  33C0          XOR EAX,EAX

破解到这一步大家可以正常打开程序,但千万不要运行只有注册功能才能用的功能,因为到现在为止软件并没有完全破解,现在运行注册后才有的功能软件会删除我们的注册表项,昨天就是因为这个害的我从做了一次系统。晕。

待续吧,从装系统中。。。。顺便问问大家,这个软件里好多类似ASCII "048229125055114025094102049210040021027068051099091168132234034161018208011"这样的代码,是不是RSA加密代码?作用是什么?我没搞清楚。