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加密代码?作用是什么?我没搞清楚。