[转]SourceFormatX 2.56相关破解分析--疯子哥德
    哥德疯了
   用户中心 您的位置:笔架山信息平台>> 笔客秀>> 疯子哥德>> [转]SourceFormatX 2.56相关破解分析--疯子哥德
日历
<< << 2008 十一月 >> >>
1
2345678
9101112131415
16171819202122
23242526272829
30
个人资料
游客已登陆 (0)未知
笔行证 888888
昵称 hacder 
笔贝 Score1
加为好友 发送短信
栏目分类
最新日志
最新评论
统计信息
  • 访问计数:1584659
    本文:464 今天:2 本月 464
  • 加为好友 发送短信

  [转]SourceFormatX 2.56相关破解分析
2007-11-08 晴
出处或者来源:看雪软件安全论坛

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

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

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

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

程序入口
005D4900 &gt; /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 &gt; 8BFF MOV EDI,EDI ; ntdll.7C930738
77D504EC 55 PUSH EBP
77D504ED 8BEC MOV EBP,ESP
77D504EF 833D BC04D777 0&gt;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:[&lt;&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 &lt;JMP.&user32.MessageBoxA> ; \MessageBoxA
005723FE |. E8 A516E9FF CALL dump_1_.00403AA8 ; 我们停在这句
00572403 |&gt; 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 &lt;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 &gt; 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 &lt;JMP.&kernel32.GetFileSize> ; \GetFileSize
0055F110 3D A8421200 CMP EAX,1242A8
0055F115 |. 7E 1F JLE SHORT dump_2.0055F136
0055F117 |&gt; 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 &lt;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 &lt;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 |&gt; 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 &lt;JMP.&kernel32.WinExec> ; \WinExec
0055F134 |.^ EB E1 \JMP SHORT dump_2.0055F117 ; 我们停在这句上
0055F136 |&gt; 33C0 XOR EAX,EAX

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

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



以下是21楼兄弟backer的分析

--------------------------------------------------------------------------------
【软件名称】: SourceFormatX 2.56

【使用工具】: Fi,Ollydbg,ImportREC

【破解平台】: Win2K Server

【软件简介】: SourceFormatX 是一个强大的源代码自动格式化,缩进,排版,美化工具。
它可以格式化 C, C++、Java、C#、Object Pascal、PHP、ASP、JSP、VB、
VB.NET、VBScript、JavaScript 和 HTML Components源代码。
它还可以将源代码输出为语法高亮显示的 HTML 或 RTF 文件。

【软件大小】: 731 KB

【编写语言】: Borland Delphi 5

【加壳方式】: PECompact 1.68 - 1.84

【保护方式】: 文件验证(License.dat)。

破解行为会激活恶意代码,
主要是删注册表的HKEY_CLASSES_ROOT整个分支。
删注册表是用RegDeleteValueA 。

作者把关键代码做成一个DLL,
将DLL文件的16进制码加密后生成一个注册文件,
密匙产生函数的参数是主程序加壳后的HASH码和机器信息。

已注册用户验证注册码时,先验证有没有文件,
没有文件则自然受限制的功能无法使用。

如果有注册文件,解密后即生成一个小临时文件。
如果主程序被脱壳或者被修改(爆破),自然Hash值密码不符,
解密出来的肯定都是垃圾码,没有一点用处。

只有没有被修改的主程序才能正确地解码,
而且当然只有解密正确的文件才是一个真正的DLL文件,
才能被GetProcAddress函数找到欲调用的关键函数地址。
这样只有注册用户能正常使用了。

【破解建议】: 安装 VMware ,否则, 作者很生气, 后果很严重 :)

【软件下载】: http://wh.onlinedown.net:88/down/sourceformatx256cn.exe

/***********************************脱壳**************************************/
; 跟踪到00625556处
00625556 C2 0400 retn 4

; 此处就是OEP,记得脱壳后重建输入表,我用的是ImportREC
00573258 55 push ebp

/********************************去掉OD检查***********************************/

; 调用检查OD的函数
0057330F E8 002EFEFF call SourceFo.00556114
...
...
; 将这里的 机器码 74(jz) 修改为 EB(jmp)
0055614C 74 23 jz short upSource.00556171

; 调用检查OD的函数
005774EA E8 CDB4FFFF call SourceFo.005729BC
; 将这里的 机器码 74(jz) 修改为 EB(jmp)
005729F2 74 42 je short SourceFo.00572A36

; 将这里的 机器码 74(jz) 修改为 EB(jmp)
0055F076 74 42 je short SourceFo.0055F0BA

/*****************************去掉文件修改检查********************************/

; 检查执行程序是否被修改
005774F4 E8 97B1FFFF call SourceFo.00572690
; 将这里的 机器码 74(jz) 修改为 EB(jmp)
005723AC 74 55 je short SourceFo.00572403

;
0044EA65 E8 A69BFFFF call SourceFo.00448610
0044861D 74 17 je short SourceFo.00448636

/*******************************去掉DeDe检查**********************************/

; 将这里的 机器码 74(jz) 修改为 EB(jmp)
005727F4 74 28 je short SourceFo.0057281E

0055641C 74 28 je short SourceFo.00556446

/*****************************去掉Filemon检查*********************************/

; 将这里的 机器码 74(jz) 修改为 EB(jmp)
005560C4 74 20 je short SourceFo.005560E6

/*****************************去掉Snacker检查*********************************/

; 将这里的 机器码 74(jz) 修改为 EB(jmp)
005560ED 74 20 je short SourceFo.0055610F

/*************************其他各类调试软件的驱动句柄检测**********************/
00573314 E8 632CFEFF call SourceFo.00555F7C

; 关键CALL, 以 eax 传递参数,
005774EF B8 54885700 mov eax,SourceFo.00578854 ; ASCII "License.dat"
005774F4 E8 97B1FFFF call SourceFo.00572690



/****************************执行文件尺寸检查*********************************/

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

; 将这里的 机器码 3D A8421200 修改为 3D 00E02200(00902200)
0055F110 |. 3D A8421200 cmp eax,1242A8
0055F115 |. 7E 1F jle short SourceFo.0055F136

// ???
0055EF71 75 1C jnz short SourceFo.0055EF8F


/******************************修理非法用户***********************************/
0055F117 |> /6A 03 /push 3
0055F119 |. |B8 B8F45500 |mov eax,SourceFo.0055F4B8 ; ASCII "048229125055114025094102049210040021027068051099091168132234034161018208011"
0055F11E |. |8D55 E8 |lea edx,dword ptr ss:[ebp-18]
0055F121 |. |E8 9625EFFF |call SourceFo.004516BC
0055F126 |. |8B45 E8 |mov eax,dword ptr ss:[ebp-18]
0055F129 |. |E8 124FEAFF |call SourceFo.00404040
0055F12E |. |50 |push eax ; |CmdLine
0055F12F |. |E8 4079EAFF |call <jmp.&kernel32.WinExec> ; \WinExec
0055F134 |.^\EB E1 \jmp short SourceFo.0055F117 ; 循环打开多个窗口







/****************************可疑*******************************/
00412F4D |. 807D FF 00 cmp byte ptr ss:[ebp-1],0
00412F51 |. 74 0F je short SourceFo.00412F62
00412F53 |. E8 5803FFFF call SourceFo.004032B0



0041A524 |. 8D45 D4 lea eax,dword ptr ss:[ebp-2C]
0041A527 |. 50 push eax ; /pSystemInfo
0041A528 |. E8 0FC4FEFF call <jmp.&kernel32.GetSystemInfo> ; \GetSystemInfo
0041A52D |. 8B55 FC mov edx,dword ptr ss:[ebp-4]
0041A530 |. 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
0041A533 |. 49 dec ecx
0041A534 |. 78 33 js short SourceFo.0041A569
0041A536 |. 8D45 D4 lea eax,dword ptr ss:[ebp-2C]
0041A539 |. 66:8378 20 03 cmp word ptr ds:[eax+20],3
0041A53E |. 74 10 je short SourceFo.0041A550


; ???
00412F21 |. 837B 04 00 cmp dword ptr ds:[ebx+4],0
00412F25 |. 7D 24 jge short SourceFo.00412F4B

; ???
00412F4D |. 807D FF 00 cmp byte ptr ss:[ebp-1],0
00412F51 |. 74 0F je short SOURCEFO.00412F62
00412F53 |. E8 5803FFFF call SOURCEFO.004032B0




; eax = "0123456789abcdeffedcba9876543210"
005096B0 |. 8D45 A4 lea eax,dword ptr ss:[ebp-5C]
005096B3 |. E8 3CFFFFFF call SourceFo.005095F4

; 将这里的 机器码 3D 508D0F00 修改为 3D 00902200
00564168 . 3D 508D0F00 cmp eax,0F8D50
0056416D . 0F8E F7000000 jle SourceFo.0056426A
00564173 . 33D2 xor edx,edx

; 将这里的 机器码 3D 5F890F00 修改为 3D 00902200
00567DFC . 3D 5F890F00 cmp eax,0F895F
00567E01 . 7E 13 jle short SOURCEFO.00567E16
00567E03 . E8 50DDFEFF call SOURCEFO.00555B58


; ??? 在打开文件License.dat之后多次调用
00412F53 |. E8 5803FFFF call SOURCEFO.004032B0
.
# posted by hacder @ 2007-11-08 11:22:39 评论(0)




地址:


   青木男娃 
2007-12-10 23:30:34
看得头晕脑胀.
 


   一竖先生 
2007-11-09 01:38:04
.
 


 
笔 名:
*
评 论:
最多1000字。当前字数:0
*
联系方式:

             

 
copyriht© beaplat.com All Rights Reserved 笔架山信息平台
Powered by 笔架山信息平台技术研发小组 henry
本站版权归笔架山信息平台所有,未经书面授权禁止使用