【文章标题】: BMP图片魔法师 2.55 分析
【文章作者】: the0crat
【作者邮箱】: the0crat.cn_at_gmail.com
【作者主页】: http://the0crat.blogcn.com
【生产日期】: 20070208
【软件名称】: BMP图片魔法师 2.55
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【保护方式】: 注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD+Dede
【作者声明】: 本文仅供研究学习,本人对因这篇文章而导致的一切后果,不承担任何法律责任。本文中的不足之处请各位多多指教
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
--------------------------------------------------------------------------------
【详细过程】
又是ASPack 2.12的壳,看来比较照顾我们,很快脱了
输入注册信息以后,程序关闭,在004C2CB4下断,重新运行,断在这里
004C2CB4 /. 55 push ebp
004C2CB5 |. 8BEC mov ebp, esp
004C2CB7 |. 33C9 xor ecx, ecx
004C2CB9 |. 51 push ecx
004C2CBA |. 51 push ecx
004C2CBB |. 51 push ecx
004C2CBC |. 51 push ecx
004C2CBD |. 53 push ebx
004C2CBE |. 56 push esi
004C2CBF |. 8BF0 mov esi, eax
004C2CC1 |. 33C0 xor eax, eax
004C2CC3 |. 55 push ebp
004C2CC4 |. 68 D32D4C00 push 004C2DD3
004C2CC9 |. 64:FF30 push dword ptr fs:[eax]
004C2CCC |. 64:8920 mov dword ptr fs:[eax], esp
004C2CCF |. C605 34914C00>mov byte ptr [4C9134], 0
004C2CD6 |. B2 01 mov dl, 1
004C2CD8 |. A1 14624700 mov eax, dword ptr [476214]
004C2CDD |. E8 3236FBFF call 00476314
004C2CE2 |. 8BD8 mov ebx, eax
004C2CE4 |. BA 01000080 mov edx, 80000001
004C2CE9 |. 8BC3 mov eax, ebx
004C2CEB |. E8 C436FBFF call 004763B4
004C2CF0 |. B1 01 mov cl, 1
004C2CF2 |. BA E82D4C00 mov edx, 004C2DE8 ; ASCII "Software\BmpMan"
004C2CF7 |. 8BC3 mov eax, ebx
004C2CF9 |. E8 1A37FBFF call 00476418
004C2CFE |. 8D4D FC lea ecx, dword ptr [ebp-4]
004C2D01 |. BA 002E4C00 mov edx, 004C2E00 ; ASCII "RegUser"
004C2D06 |. 8BC3 mov eax, ebx
004C2D08 |. E8 D338FBFF call 004765E0 ; 取用户名
004C2D0D |. 8B55 FC mov edx, dword ptr [ebp-4]
004C2D10 |. B8 38914C00 mov eax, 004C9138
004C2D15 |. E8 5A18F4FF call 00404574
004C2D1A |. 8D4D F8 lea ecx, dword ptr [ebp-8]
004C2D1D |. BA 102E4C00 mov edx, 004C2E10 ; regno
004C2D22 |. 8BC3 mov eax, ebx
004C2D24 |. E8 B738FBFF call 004765E0 ; 取注册码
004C2D29 |. 8B45 F8 mov eax, dword ptr [ebp-8]
004C2D2C |. 50 push eax
004C2D2D |. 8D4D F4 lea ecx, dword ptr [ebp-C]
004C2D30 |. BA 202E4C00 mov edx, 004C2E20 ; ASCII "bmpmanChina"
004C2D35 |. A1 38914C00 mov eax, dword ptr [4C9138]
004C2D3A |. E8 B5DEFFFF call 004C0BF4 ; 跟入
004C0BF4 /$ 55 push ebp
004C0BF5 |. 8BEC mov ebp, esp
004C0BF7 |. 83C4 D0 add esp, -30
004C0BFA |. 53 push ebx
004C0BFB |. 56 push esi
004C0BFC |. 57 push edi
004C0BFD |. 33DB xor ebx, ebx
004C0BFF |. 895D D0 mov dword ptr [ebp-30], ebx
004C0C02 |. 895D D4 mov dword ptr [ebp-2C], ebx
004C0C05 |. 8BF9 mov edi, ecx
004C0C07 |. 8955 F8 mov dword ptr [ebp-8], edx
004C0C0A |. 8945 FC mov dword ptr [ebp-4], eax
004C0C0D |. 8B45 FC mov eax, dword ptr [ebp-4]
004C0C10 |. E8 AB3DF4FF call 004049C0
004C0C15 |. 8B45 F8 mov eax, dword ptr [ebp-8]
004C0C18 |. E8 A33DF4FF call 004049C0
004C0C1D |. 33C0 xor eax, eax
004C0C1F |. 55 push ebp
004C0C20 |. 68 100D4C00 push 004C0D10
004C0C25 |. 64:FF30 push dword ptr fs:[eax]
004C0C28 |. 64:8920 mov dword ptr fs:[eax], esp
004C0C2B |. 8BC7 mov eax, edi
004C0C2D |. E8 EE38F4FF call 00404520
004C0C32 |. 8D55 E0 lea edx, dword ptr [ebp-20]
004C0C35 |. 8B45 F8 mov eax, dword ptr [ebp-8]
004C0C38 |. E8 23FFFFFF call 004C0B60
004C0C3D |. B2 01 mov dl, 1
004C0C3F |. 8D45 E0 lea eax, dword ptr [ebp-20]
004C0C42 |. E8 29F2FFFF call 004BFE70
004C0C47 |. C745 D8 01000>mov dword ptr [ebp-28], 1
004C0C4E |. 8B45 FC mov eax, dword ptr [ebp-4]
004C0C51 |. E8 823BF4FF call 004047D8
004C0C56 |. 8945 DC mov dword ptr [ebp-24], eax
004C0C59 |> 8D45 D4 /lea eax, dword ptr [ebp-2C]
004C0C5C |. 50 |push eax
004C0C5D |. B9 08000000 |mov ecx, 8
004C0C62 |. 8B55 D8 |mov edx, dword ptr [ebp-28]
004C0C65 |. 8B45 FC |mov eax, dword ptr [ebp-4]
004C0C68 |. E8 C33DF4FF |call 00404A30
004C0C6D |. 8D45 F0 |lea eax, dword ptr [ebp-10]
004C0C70 |. 33C9 |xor ecx, ecx
004C0C72 |. BA 08000000 |mov edx, 8
004C0C77 |. E8 A022F4FF |call 00402F1C
004C0C7C |. 8B45 D4 |mov eax, dword ptr [ebp-2C]
004C0C7F |. E8 543BF4FF |call 004047D8
004C0C84 |. 50 |push eax
004C0C85 |. 8D45 D4 |lea eax, dword ptr [ebp-2C]
004C0C88 |. E8 9B3DF4FF |call 00404A28
004C0C8D |. 8D55 F0 |lea edx, dword ptr [ebp-10]
004C0C90 |. 59 |pop ecx
004C0C91 |. E8 5A1CF4FF |call 004028F0 ; 用户名的ascii
004C0C96 |. 8D55 E8 |lea edx, dword ptr [ebp-18]
004C0C99 |. 8D45 F0 |lea eax, dword ptr [ebp-10]
004C0C9C |. E8 A3F4FFFF |call 004C0144 ; DES
004C0CA1 |. BE 08000000 |mov esi, 8
004C0CA6 |. 8D5D E8 |lea ebx, dword ptr [ebp-18]
004C0CA9 |> 8D4D D0 |/lea ecx, dword ptr [ebp-30] ; /*
; 转换成字符串并连接起来
004C0CAC |. 33C0 ||xor eax, eax
004C0CAE |. 8A03 ||mov al, byte ptr [ebx]
004C0CB0 |. BA 02000000 ||mov edx, 2
004C0CB5 |. E8 527FF4FF ||call 00408C0C
004C0CBA |. 8B55 D0 ||mov edx, dword ptr [ebp-30]
004C0CBD |. 8BC7 ||mov eax, edi
004C0CBF |. E8 1C3BF4FF ||call 004047E0
004C0CC4 |. 43 ||inc ebx
004C0CC5 |. 4E ||dec esi
004C0CC6 |.^ 75 E1 |\jnz short 004C0CA9 ; */
004C0CC8 |. 8345 D8 08 |add dword ptr [ebp-28], 8
004C0CCC |. 8B45 DC |mov eax, dword ptr [ebp-24]
004C0CCF |. 83C0 07 |add eax, 7
004C0CD2 |. 85C0 |test eax, eax
004C0CD4 |. 79 03 |jns short 004C0CD9
004C0CD6 |. 83C0 07 |add eax, 7
004C0CD9 |> C1F8 03 |sar eax, 3
004C0CDC |. C1E0 03 |shl eax, 3
004C0CDF |. 3B45 D8 |cmp eax, dword ptr [ebp-28]
004C0CE2 |.^ 0F8D 71FFFFFF \jge 004C0C59
004C0CE8 |. 33C0 xor eax, eax
004C0CEA |. 5A pop edx
004C0CEB |. 59 pop ecx
004C0CEC |. 59 pop ecx
004C0CED |. 64:8910 mov dword ptr fs:[eax], edx
004C0CF0 |. 68 170D4C00 push 004C0D17
004C0CF5 |> 8D45 D0 lea eax, dword ptr [ebp-30]
004C0CF8 |. BA 02000000 mov edx, 2
004C0CFD |. E8 4238F4FF call 00404544
004C0D02 |. 8D45 F8 lea eax, dword ptr [ebp-8]
004C0D05 |. BA 02000000 mov edx, 2
004C0D0A |. E8 3538F4FF call 00404544
004C0D0F \. C3 retn
返回到刚才这里
004C2D3F |. 8B55 F4 mov edx, dword ptr [ebp-C] ; 这里就是明文的注册码了~
004C2D42 |. 58 pop eax
004C2D43 |. E8 D41BF4FF call 0040491C ; 对比
004C2D48 |. 75 07 jnz short 004C2D51 ; 跳跑则失败
算法单调,本来这软件不值得写什么算法分析的,但是在www.newhua.com上下的这个捆绑了一堆其他软件,太肮脏了,不把它内脏掏空了太对不起我的电脑了~废话不多说,go on
[算法总结]
注册码=char(DES(plain_text=ascii(用户名),key="bmpmanChina"))
用户名:the0crat
注册码:1CDED943BC85439B
[对这个软件实现过程的分析]
至于为什么能在bmp中插入一个不小的文件,方法不止一个。
我们知道"copy src.bmp/b+file.txt/b dst.bmp/b"能在一个bmp文件的末尾插入文件的数据,并且用看图软件察看时没有区别,不过用文本编辑器察看时能看到很明显的插入的数据,特别是增加了文件的长度,就像最低级的exe捆绑器那样,很不爽
这个软件不同的是不是在末尾添加,而是将bmp头部的一些不必要的数据替换成所捆绑的文件的数据,并且稍加转换了一下
简单来说,bmp头部有一块区域,就如同我们能利用pe的结构的特点将所需代码放在pe头部从而减小文件体积一样(推荐阅读watercloud老早的一篇文章:<<手工打造微型Win32可执行文件>>_at_http://www.xfocus.net/articles/200302/482.html),所以这里不废话了,看一下bmp的文件结构就能知道其中的道理了
简单来看看他将需要隐藏的文件插入bmp文件的流程
004C23DC . 55 push ebp
004C23DD . 8BEC mov ebp, esp
004C23DF . 33C9 xor ecx, ecx
004C23E1 . 51 push ecx
004C23E2 . 51 push ecx
004C23E3 . 51 push ecx
004C23E4 . 51 push ecx
004C23E5 . 51 push ecx
004C23E6 . 53 push ebx
004C23E7 . 56 push esi
004C23E8 . 57 push edi
004C23E9 . 8945 FC mov dword ptr [ebp-4], eax
004C23EC . 33C0 xor eax, eax
004C23EE . 55 push ebp
004C23EF . 68 C0264C00 push 004C26C0
004C23F4 . 64:FF30 push dword ptr fs:[eax]
004C23F7 . 64:8920 mov dword ptr fs:[eax], esp
004C23FA . 8D55 F8 lea edx, dword ptr [ebp-8]
004C23FD . 8B45 FC mov eax, dword ptr [ebp-4]
004C2400 . 8B80 A0030000 mov eax, dword ptr [eax+3A0]
004C2406 . E8 9DCAF7FF call 0043EEA8
004C240B . 837D F8 00 cmp dword ptr [ebp-8], 0
004C240F . 75 0F jnz short 004C2420
004C2411 . B8 D8264C00 mov eax, 004C26D8
004C2416 . E8 815CF7FF call 0043809C
004C241B . E9 85020000 jmp 004C26A5
004C2420 > 8D55 F4 lea edx, dword ptr [ebp-C]
004C2423 . 8B45 FC mov eax, dword ptr [ebp-4]
004C2426 . 8B80 9C030000 mov eax, dword ptr [eax+39C]
004C242C . E8 77CAF7FF call 0043EEA8
004C2431 . 837D F4 00 cmp dword ptr [ebp-C], 0
004C2435 . 75 0F jnz short 004C2446
004C2437 . B8 F8264C00 mov eax, 004C26F8 ; 请选择bmp格式的图片文件!!!
004C243C . E8 5B5CF7FF call 0043809C
004C2441 . E9 5F020000 jmp 004C26A5
004C2446 > 33C0 xor eax, eax
004C2448 . 55 push ebp
004C2449 . 68 9E264C00 push 004C269E
004C244E . 64:FF30 push dword ptr fs:[eax]
004C2451 . 64:8920 mov dword ptr fs:[eax], esp
004C2454 . 33C0 xor eax, eax
004C2456 . 55 push ebp
004C2457 . 68 FD254C00 push 004C25FD
004C245C . 64:FF30 push dword ptr fs:[eax]
004C245F . 64:8920 mov dword ptr fs:[eax], esp
004C2462 . B2 01 mov dl, 1
004C2464 . A1 B4F14B00 mov eax, dword ptr [4BF1B4]
004C2469 . E8 BACDFFFF call 004BF228
004C246E . 8BD8 mov ebx, eax
004C2470 . 8D55 F0 lea edx, dword ptr [ebp-10]
004C2473 . 8B45 FC mov eax, dword ptr [ebp-4]
004C2476 . 8B80 9C030000 mov eax, dword ptr [eax+39C]
004C247C . E8 27CAF7FF call 0043EEA8
004C2481 . 8B55 F0 mov edx, dword ptr [ebp-10]
004C2484 . 8BC3 mov eax, ebx
004C2486 . E8 EDCDFFFF call 004BF278
004C248B . 8D55 EC lea edx, dword ptr [ebp-14]
004C248E . 8B45 FC mov eax, dword ptr [ebp-4]
004C2491 . 8B80 A0030000 mov eax, dword ptr [eax+3A0]
004C2497 . E8 0CCAF7FF call 0043EEA8
004C249C . 8B55 EC mov edx, dword ptr [ebp-14]
004C249F . 8BC3 mov eax, ebx
004C24A1 . E8 1ECEFFFF call 004BF2C4
004C24A6 . 8BC3 mov eax, ebx
004C24A8 . E8 B3CEFFFF call 004BF360
004C24AD . 84C0 test al, al
004C24AF . 0F84 89000000 je 004C253E
004C24B5 . 6A 00 push 0 ; /Arg1 = 00000000
004C24B7 . 66:8B0D 14274>mov cx, word ptr [4C2714] ; |
004C24BE . B2 03 mov dl, 3 ; |
004C24C0 . B8 20274C00 mov eax, 004C2720 ; |此bmp文件中已有隐藏文件,要覆盖吗?
004C24C5 . E8 DA5AF7FF call 00437FA4 ; \BmpMan_.00437FA4
004C24CA . 83F8 07 cmp eax, 7
004C24CD . 75 6F jnz short 004C253E
004C24CF . 8B45 FC mov eax, dword ptr [ebp-4]
004C24D2 . 8B80 9C030000 mov eax, dword ptr [eax+39C]
004C24D8 . 33D2 xor edx, edx
004C24DA . E8 F9C9F7FF call 0043EED8
004C24DF . 8B45 FC mov eax, dword ptr [ebp-4]
004C24E2 . 8B80 A0030000 mov eax, dword ptr [eax+3A0]
004C24E8 . 33D2 xor edx, edx
004C24EA . E8 E9C9F7FF call 0043EED8
004C24EF . 8B45 FC mov eax, dword ptr [ebp-4]
004C24F2 . 8B80 08030000 mov eax, dword ptr [eax+308]
004C24F8 . 8B80 08020000 mov eax, dword ptr [eax+208]
004C24FE . 33D2 xor edx, edx
004C2500 . E8 FBA6FBFF call 0047CC00
004C2505 . 33D2 xor edx, edx
004C2507 . E8 50A6FBFF call 0047CB5C
004C250C . 8B45 FC mov eax, dword ptr [ebp-4]
004C250F . 8B80 08030000 mov eax, dword ptr [eax+308]
004C2515 . 8B80 08020000 mov eax, dword ptr [eax+208]
004C251B . BA 01000000 mov edx, 1
004C2520 . E8 DBA6FBFF call 0047CC00
004C2525 . 33D2 xor edx, edx
004C2527 . E8 30A6FBFF call 0047CB5C
004C252C . 33C0 xor eax, eax
004C252E . 5A pop edx
004C252F . 59 pop ecx
004C2530 . 59 pop ecx
004C2531 . 64:8910 mov dword ptr fs:[eax], edx
004C2534 . E8 D31AF4FF call 0040400C
004C2539 . E9 67010000 jmp 004C26A5
004C253E > BA 01000000 mov edx, 1
004C2543 . 8BC3 mov eax, ebx
004C2545 . E8 4ED6FFFF call 004BFB98
004C254A . 84C0 test al, al
004C254C . 75 2C jnz short 004C257A
004C254E . B8 4C274C00 mov eax, 004C274C ; 对不起,您要隐藏的文件太大了,您可先对其进行压缩,然后再进行隐藏操作!
004C2553 . E8 445BF7FF call 0043809C
004C2558 . 8B45 FC mov eax, dword ptr [ebp-4]
004C255B . 8B80 A0030000 mov eax, dword ptr [eax+3A0]
004C2561 . 33D2 xor edx, edx
004C2563 . E8 70C9F7FF call 0043EED8
004C2568 . 33C0 xor eax, eax
004C256A . 5A pop edx
004C256B . 59 pop ecx
004C256C . 59 pop ecx
004C256D . 64:8910 mov dword ptr fs:[eax], edx
004C2570 . E8 971AF4FF call 0040400C
004C2575 . E9 2B010000 jmp 004C26A5
004C257A > 833D 30914C00>cmp dword ptr [4C9130], 0 ; 比较是否有密码
004C2581 . 74 0D je short 004C2590
004C2583 . 8B15 30914C00 mov edx, dword ptr [4C9130]
004C2589 . 8BC3 mov eax, ebx
004C258B . E8 80CDFFFF call 004BF310 ; 保存密码
004C2590 > 8B45 FC mov eax, dword ptr [ebp-4]
004C2593 . 8B90 0C030000 mov edx, dword ptr [eax+30C]
004C2599 . 8BC3 mov eax, ebx
004C259B . E8 BCCDFFFF call 004BF35C
004C25A0 . 8B45 FC mov eax, dword ptr [ebp-4]
004C25A3 . 8B80 64030000 mov eax, dword ptr [eax+364]
004C25A9 . 80B8 60020000>cmp byte ptr [eax+260], 1
004C25B0 . 75 07 jnz short 004C25B9 ; 是否备份
004C25B2 . 8BC3 mov eax, ebx
004C25B4 . E8 2FD4FFFF call 004BF9E8
004C25B9 > 8BC3 mov eax, ebx
004C25BB . E8 F4D6FFFF call 004BFCB4 ; 将文件数据加入bmp文件中
004C25C0 . 8B45 FC mov eax, dword ptr [ebp-4]
004C25C3 . 8B80 68030000 mov eax, dword ptr [eax+368]
004C25C9 . 80B8 60020000>cmp byte ptr [eax+260], 1
004C25D0 . 75 07 jnz short 004C25D9
004C25D2 . 8BC3 mov eax, ebx
004C25D4 . E8 03D4FFFF call 004BF9DC
004C25D9 > 6A 40 push 40
004C25DB . 68 90274C00 push 004C2790 ; bmp图片魔法师
004C25E0 . 68 A0274C00 push 004C27A0 ; 隐藏成功!
004C25E5 . 8B45 FC mov eax, dword ptr [ebp-4]
004C25E8 . E8 4F30F8FF call 0044563C
004C25ED . 50 push eax ; |hOwner
004C25EE . E8 754DF4FF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
提取有密码的bmp文件,弹出输入密码框,输入试练码,跟入
004C2E64 . 55 push ebp
004C2E65 . 8BEC mov ebp, esp
004C2E67 . 33C9 xor ecx, ecx
004C2E69 . 51 push ecx
004C2E6A . 51 push ecx
004C2E6B . 51 push ecx
004C2E6C . 51 push ecx
004C2E6D . 51 push ecx
004C2E6E . 53 push ebx
004C2E6F . 56 push esi
004C2E70 . 57 push edi
004C2E71 . 8945 FC mov dword ptr [ebp-4], eax
004C2E74 . 33C0 xor eax, eax
004C2E76 . 55 push ebp
004C2E77 . 68 A5304C00 push 004C30A5
004C2E7C . 64:FF30 push dword ptr fs:[eax]
004C2E7F . 64:8920 mov dword ptr fs:[eax], esp
004C2E82 . B2 01 mov dl, 1
004C2E84 . A1 C0E64B00 mov eax, dword ptr [4BE6C0]
004C2E89 . E8 9AB8FFFF call 004BE728
004C2E8E . 8BD8 mov ebx, eax
004C2E90 . 8D55 F8 lea edx, dword ptr [ebp-8]
004C2E93 . 8B45 FC mov eax, dword ptr [ebp-4]
004C2E96 . 8B80 F4020000 mov eax, dword ptr [eax+2F4]
004C2E9C . E8 07C0F7FF call 0043EEA8
004C2EA1 . 8B55 F8 mov edx, dword ptr [ebp-8]
004C2EA4 . 8BC3 mov eax, ebx
004C2EA6 . E8 9DB8FFFF call 004BE748
004C2EAB . 8D55 F0 lea edx, dword ptr [ebp-10]
004C2EAE . 8B45 FC mov eax, dword ptr [ebp-4]
004C2EB1 . 8B80 88030000 mov eax, dword ptr [eax+388]
004C2EB7 . E8 ECBFF7FF call 0043EEA8
004C2EBC . 8B45 F0 mov eax, dword ptr [ebp-10]
004C2EBF . 8D55 F4 lea edx, dword ptr [ebp-C]
004C2EC2 . E8 C55AF4FF call 0040898C ; 取得输入密码
004C2EC7 . 8B45 F4 mov eax, dword ptr [ebp-C]
004C2ECA . 50 push eax
004C2ECB . 8D55 EC lea edx, dword ptr [ebp-14]
004C2ECE . 8BC3 mov eax, ebx
004C2ED0 . E8 47BAFFFF call 004BE91C ; 从文件中取得真密码
004C2ED5 . 8B55 EC mov edx, dword ptr [ebp-14]
004C2ED8 . 58 pop eax
004C2ED9 . E8 3E1AF4FF call 0040491C
004C2EDE . 0F85 79010000 jnz 004C305D ; 不相等则跳
这样加不加密码都一样了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!