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加密代码?作用是什么?我没搞清楚。
posted @ 2012-07-15 21:27  adodo1  Views(153)  Comments(0Edit  收藏  举报