好友
阅读权限30
听众
最后登录1970-1-1
|
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
本帖最后由 a070458 于 2013-12-14 10:30 编辑
-------------------------------------------------【文章简介】-------------------------------------------------
【文章标题】 【吾爱2013CM大赛题目】-- Crack Me-- RedAgl CM分析
【文章作者】 a070458
【作者邮箱】 无~
【作者主页】 无~
【软件名称】 2013CM
【软件大小】 433 KB (443,392 字节)
【下载地址】 http://www.52pojie.cn/thread-228420-1-1.html
【加壳方式】 无~
【保护方式】 无~
【编写语言】 VC
【使用工具】 OD
【操作平台】 XPSP3
【软件介绍】 52pojieCM大赛题目
【作者声明】 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
-------------------------------------------------【文章正文】-------------------------------------------------
大家好 ~ 我是a070458
今天看到 52pojie CM大赛 开赛了 果断前来参加
这次分析是 RedAgl 大牛 写的一个CM
小菜在这里就简单分析分析
有错误的地方请各位大牛指出!
题目要求1. 爆破,注册码均可 我这里就分析爆破 和追注册码 至于分析算法 就留给大家搞了
载入OD,例牌 先查找字符串吧 查找到的字符串不多
这里我对第一个字符串很感兴趣 果断跟进去
看到局部调用吧 我们就在局部调用的地址下断点
运行 输入a070458 123123 点一下按钮 果断断下了
大致看了看 004023D0 00402040 2个call 的地址的API函数 估计第一个是\提高自身权限吧 第二应该就是遍历进程找出指定的进程
在第二个CALL 得知 他使用的是LoadStringW加载字符串 果断用资源软件看看有什么字符串吧
我这里就用到Restorator查找看看 看图片
呵呵 发挥自己强大的脑补能力 我估计就是查找几个.exe尾的进程了 还有OllyDbg和debug字样 估计还检查调试器{:1_903:} 这里我没被ANTI 所以就不去了解了
继续来看软件 软件多处用到这样的代码去查找字符串的长度
[C++] 纯文本查看 复制代码 00401463 |. 8D51 01 lea edx,dword ptr ds:[ecx+0x1]
00401466 |> 8A01 /mov al,byte ptr ds:[ecx]
00401468 |. 41 |inc ecx
00401469 |. 84C0 |test al,al
0040146B |.^ 75 F9 \jnz short 2013CM~1.00401466
0040146D |. 2BCA sub ecx,edx
跟进关键call 继续分析
[C++] 纯文本查看 复制代码 00401B70 /$ 55 push ebp
00401B71 |. 8BEC mov ebp,esp
00401B73 |. 81EC 10010000 sub esp,0x110
00401B79 |. A1 00504000 mov eax,dword ptr ds:[0x405000]
00401B7E |. 33C5 xor eax,ebp
00401B80 |. 8945 FC mov [local.1],eax
00401B83 |. 68 04010000 push 0x104 ; /Count = 104 (260.)
00401B88 |. 8D85 F0FEFFFF lea eax,[local.68] ; |
00401B8E |. 50 push eax ; |Buffer
00401B8F |. FF35 78534000 push dword ptr ds:[0x405378] ; |hWnd = 00140512 (class='Edit',parent=003D02E6)
00401B95 |. FF15 60414000 call dword ptr ds:[<&USER32.GetWindowTex>;// \获取用户名
00401B9B |. 68 04010000 push 0x104 ; /n = 104 (260.)
00401BA0 |. 6A 00 push 0x0 ; |c = 00
00401BA2 |. 83F8 04 cmp eax,0x4 // ; |是否大于4
00401BA5 |. 7D 1C jge short 2013CM~1.00401BC3 // ; |所以用户名要大于4
00401BA7 |. FF35 D0534000 push dword ptr ds:[0x4053D0] ; |s = 00178188
00401BAD |. E8 D6150000 call <jmp.&MSVCR110.memset> ; \memset
00401BB2 |. 83C4 0C add esp,0xC
00401BB5 |. 8B4D FC mov ecx,[local.1]
00401BB8 |. 33CD xor ecx,ebp
00401BBA |. E8 570D0000 call 2013CM~1.00402916
00401BBF |. 8BE5 mov esp,ebp
00401BC1 |. 5D pop ebp
00401BC2 |. C3 retn
00401BC3 |> 8D85 F0FEFFFF lea eax,[local.68] ; |
00401BC9 |. 50 push eax ; |s
00401BCA |. E8 B9150000 call <jmp.&MSVCR110.memset> // ; \置0
00401BCF |. 83C4 0C add esp,0xC
00401BD2 |. 8D85 F0FEFFFF lea eax,[local.68]
00401BD8 |. 68 04010000 push 0x104 ; /Count = 104 (260.)
00401BDD |. 50 push eax ; |Buffer
00401BDE |. FF35 74534000 push dword ptr ds:[0x405374] ; |hWnd = 002E0456 (class='Edit',parent=003D02E6)
00401BE4 |. FF15 60414000 call dword ptr ds:[<&USER32.GetWindowTex>;// \取出假注册码
00401BEA |. 68 04010000 push 0x104 ; /n = 104 (260.)
00401BEF |. 6A 00 push 0x0 ; |c = 00
00401BF1 |. FF35 D4534000 push dword ptr ds:[0x4053D4] ; |s = 00178298
00401BF7 |. E8 8C150000 call <jmp.&MSVCR110.memset> ; \memset
00401BFC |. 8D8D F0FEFFFF lea ecx,[local.68]
00401C02 |. 83C4 0C add esp,0xC
00401C05 |. 8D51 01 lea edx,dword ptr ds:[ecx+0x1]
00401C08 |> 8A01 /mov al,byte ptr ds:[ecx]
00401C0A |. 41 |inc ecx
00401C0B |. 84C0 |test al,al
00401C0D |.^ 75 F9 \jnz short 2013CM~1.00401C08 //; 取出了假注册码的长度
00401C0F |. 2BCA sub ecx,edx
00401C11 |. 83F9 04 cmp ecx,0x4 ; // 也是要大于4
00401C14 |. 7C 29 jl short 2013CM~1.00401C3F
00401C16 |. 8D85 F0FEFFFF lea eax,[local.68]
00401C1C |. 50 push eax
00401C1D |. 68 04010000 push 0x104
00401C22 |. FF35 D4534000 push dword ptr ds:[0x4053D4]
00401C28 |. FF15 FC404000 call dword ptr ds:[<&MSVCR110.strcpy_s>] ; // 复制一份
00401C2E |. 83C4 0C add esp,0xC
00401C31 |. E8 FA0A0000 call 2013CM~1.00402730 // ; 算法call
00401C36 |. 85C0 test eax,eax // ; 这里就不分析里面了 貌似还有获取硬盘信息的
00401C38 |. 74 05 je short 2013CM~1.00401C3F
00401C3A |. E8 11000000 call 2013CM~1.00401C50 // ; 关键call 跟进!!!!!!!!!
00401C3F |> 8B4D FC mov ecx,[local.1]
00401C42 |. 33CD xor ecx,ebp
00401C44 |. E8 CD0C0000 call 2013CM~1.00402916
00401C49 |. 8BE5 mov esp,ebp
00401C4B |. 5D pop ebp
00401C4C \. C3 retn
算法call我就不分析了
继续跟进 00401C3A |. E8 11000000 call 2013CM~1.00401C50 // ; 关键call 跟进!!!!!!!!!
[C++] 纯文本查看 复制代码 00401C50 /$ 55 push ebp // ; 来到这里
00401C51 |. 8BEC mov ebp,esp
00401C53 |. 81EC 5C020000 sub esp,0x25C
00401C59 |. A1 00504000 mov eax,dword ptr ds:[0x405000]
00401C5E |. 33C5 xor eax,ebp
00401C60 |. 8945 FC mov [local.1],eax
00401C63 |. 53 push ebx
00401C64 |. 56 push esi
00401C65 |. 8B35 F8404000 mov esi,dword ptr ds:[<&MSVCR110.operato>; msvcr110.operator new
00401C6B |. 57 push edi
00401C6C |. 33C0 xor eax,eax
00401C6E |. 6A 0D push 0xD
00401C70 |. C785 BCFDFFFF>mov [local.145],0x0
00401C7A |. 8985 B8FDFFFF mov [local.146],eax
00401C80 |. FFD6 call esi ; <&MSVCR110.operator new>
00401C82 |. 6A 10 push 0x10
00401C84 |. 8985 B0FDFFFF mov [local.148],eax
00401C8A |. FFD6 call esi
00401C8C |. 6A 0C push 0xC
00401C8E |. 8BF8 mov edi,eax
00401C90 |. FFD6 call esi
00401C92 |. 6A 06 push 0x6
00401C94 |. 8985 A8FDFFFF mov [local.150],eax
00401C9A |. FFD6 call esi
00401C9C |. 6A 0C push 0xC
00401C9E |. 8985 B4FDFFFF mov [local.147],eax
00401CA4 |. FFD6 call esi
00401CA6 |. 6A 0C push 0xC
00401CA8 |. 8985 ACFDFFFF mov [local.149],eax
00401CAE |. FFD6 call esi
00401CB0 |. 6A 12 push 0x12
00401CB2 |. FFD6 call esi
00401CB4 |. 68 1C020000 push 0x21C ; /n = 21C (540.)
00401CB9 |. 8D85 DCFDFFFF lea eax,[local.137] ; |
00401CBF |. 6A 00 push 0x0 ; |c = 00
00401CC1 |. 50 push eax ; |s
00401CC2 |. C785 C0FDFFFF>mov [local.144],0x0 ; |
00401CCC |. C785 C4FDFFFF>mov [local.143],0x0 ; |
00401CD6 |. C785 C8FDFFFF>mov [local.142],0x0 ; |
00401CE0 |. C785 CCFDFFFF>mov [local.141],0x0 ; |
00401CEA |. C785 D0FDFFFF>mov [local.140],0x0 ; |
00401CF4 |. 66:C785 D4FDF>mov word ptr ss:[ebp-0x22C],0x0 ; |
00401CFD |. C685 D6FDFFFF>mov byte ptr ss:[ebp-0x22A],0x0 ; |
00401D04 |. C785 D7FDFFFF>mov dword ptr ss:[ebp-0x229],0x0 ; |
00401D0E |. C685 DBFDFFFF>mov byte ptr ss:[ebp-0x225],0x0 ; |
00401D15 |. E8 6E140000 call <jmp.&MSVCR110.memset> ; \memset
00401D1A |. A1 DC534000 mov eax,dword ptr ds:[0x4053DC] // ; 这里保存一个东西 下面用来打开进程
00401D1F |. 83C4 28 add esp,0x28
00401D22 |. 85C0 test eax,eax
00401D24 |. 75 0C jnz short 2013CM~1.00401D32 // ; 测试一下是否保存有指定进程的PID
00401D26 |. 3905 E0534000 cmp dword ptr ds:[0x4053E0],eax // ; 这里保存了kernel32基址
00401D2C |. 0F84 F6020000 je 2013CM~1.00402028
00401D32 |> 8B35 7C404000 mov esi,dword ptr ds:[<&KERNEL32.OpenPro>; kernel32.OpenProcess
00401D38 |. 50 push eax ; /ProcessId
00401D39 |. 6A 00 push 0x0 ; |Inheritable = FALSE
00401D3B |. 68 FFFF1F00 push 0x1FFFFF ; |Access = TERMINATE|CREATE_THREAD|VM_OPERATION|VM_READ|VM_WRITE|DUP_HANDLE|CREATE_PROCESS|SET_QUOTA|SET_INFORMATION|QUERY_INFORMATION|SYNCHRONIZE|STANDARD_RIGHTS_REQUIRED|F804
00401D40 |. FFD6 call esi // ; \打开进程
00401D42 |. 8BD8 mov ebx,eax
00401D44 |. 85DB test ebx,ebx
00401D46 |. 75 18 jnz short 2013CM~1.00401D60 //; 如果失败继续打开一次试试
00401D48 |. FF35 DC534000 push dword ptr ds:[0x4053DC] ; /ProcessId = 0x11DC
00401D4E |. 50 push eax ; |Inheritable
00401D4F |. 68 FF0F1F00 push 0x1F0FFF ; |Access = PROCESS_ALL_ACCESS
00401D54 |. FFD6 call esi ; \OpenProcess
00401D56 |. 8BD8 mov ebx,eax
00401D58 |. 85DB test ebx,ebx
00401D5A |. 0F84 67020000 je 2013CM~1.00401FC7
00401D60 |> A1 E0534000 mov eax,dword ptr ds:[0x4053E0]
00401D65 |. FF35 CC534000 push dword ptr ds:[0x4053CC]
00401D6B |. 8B35 FC404000 mov esi,dword ptr ds:[<&MSVCR110.strcpy_>; msvcr110.strcpy_s
00401D71 |. 8985 C8FDFFFF mov [local.142],eax
00401D77 |. A1 E4534000 mov eax,dword ptr ds:[0x4053E4]
00401D7C |. 8985 CCFDFFFF mov [local.141],eax
00401D82 |. 8D85 DCFDFFFF lea eax,[local.137]
00401D88 |. 68 04010000 push 0x104
00401D8D |. 50 push eax
00401D8E |. FFD6 call esi ; <&MSVCR110.strcpy_s>
00401D90 |. 8D8D DCFDFFFF lea ecx,[local.137]
00401D96 |. 83C4 0C add esp,0xC
00401D99 |. 8D51 01 lea edx,dword ptr ds:[ecx+0x1]
00401D9C |. 8D6424 00 lea esp,dword ptr ss:[esp]
00401DA0 |> 8A01 /mov al,byte ptr ds:[ecx] // ; 这里取出的字符串就是刚才用户名+假注册码
00401DA2 |. 41 |inc ecx // ; 再通过算法call 生成出来的
00401DA3 |. 84C0 |test al,al
00401DA5 |.^ 75 F9 \jnz short 2013CM~1.00401DA0
00401DA7 |. FF35 D4534000 push dword ptr ds:[0x4053D4]
00401DAD |. 8D85 E0FEFFFF lea eax,[local.72]
00401DB3 |. 2BCA sub ecx,edx // ; 求出了长度
00401DB5 |. 68 04010000 push 0x104
00401DBA |. 50 push eax
00401DBB |. 898D C0FDFFFF mov [local.144],ecx
00401DC1 |. FFD6 call esi // ; 拷贝一份
00401DC3 |. 8D8D E0FEFFFF lea ecx,[local.72]
00401DC9 |. 83C4 0C add esp,0xC
00401DCC |. 8D51 01 lea edx,dword ptr ds:[ecx+0x1]
00401DCF |. 90 nop
00401DD0 |> 8A01 /mov al,byte ptr ds:[ecx] // ; 取出了假码
00401DD2 |. 41 |inc ecx
00401DD3 |. 84C0 |test al,al
00401DD5 |.^ 75 F9 \jnz short 2013CM~1.00401DD0
00401DD7 |. 8B35 58414000 mov esi,dword ptr ds:[<&USER32.LoadStrin>; user32.LoadStringA
00401DDD |. 6A 0D push 0xD ; /Count = D (13.)
00401DDF |. FFB5 B0FDFFFF push [local.148] ; |Buffer
00401DE5 |. 2BCA sub ecx,edx ; |
00401DE7 |. 68 52200000 push 0x2052 ; |RsrcID = STRING "Kernel32.dll"
00401DEC |. FF35 B0534000 push dword ptr ds:[0x4053B0] ; |hInst = 00400000
00401DF2 |. 898D C4FDFFFF mov [local.143],ecx ; |
00401DF8 |. FFD6 call esi ; \LoadStringA
00401DFA |. FFB5 B0FDFFFF push [local.148] ; /pModule
00401E00 |. FF15 78404000 call dword ptr ds:[<&KERNEL32.GetModuleH>; \GetModuleHandleA
00401E06 |. 6A 10 push 0x10
00401E08 |. 57 push edi
00401E09 |. 68 55200000 push 0x2055
00401E0E |. FF35 B0534000 push dword ptr ds:[0x4053B0] ; 2013CM~1.00400000
00401E14 |. 3B85 C8FDFFFF cmp eax,[local.142]
00401E1A |. 74 06 je short 2013CM~1.00401E22
00401E1C |. 8985 C8FDFFFF mov [local.142],eax
00401E22 |> FFD6 call esi
00401E24 |. 57 push edi ; /ProcNameOrOrdinal
00401E25 |. FFB5 C8FDFFFF push [local.142] ; |hModule
00401E2B |. FF15 74404000 call dword ptr ds:[<&KERNEL32.GetProcAdd>;//\获取了GetProcessAddress的地址
00401E31 |. 8BBD A8FDFFFF mov edi,[local.150]
00401E37 |. 6A 0C push 0xC
00401E39 |. 57 push edi
00401E3A |. 68 56200000 push 0x2056
00401E3F |. FF35 B0534000 push dword ptr ds:[0x4053B0] ; 2013CM~1.00400000
00401E45 |. 8945 F4 mov [local.3],eax
00401E48 |. FFD6 call esi // ; 取出MessageBoxA
00401E4A |. 57 push edi
00401E4B |. 8B3D FC404000 mov edi,dword ptr ds:[<&MSVCR110.strcpy_>; msvcr110.strcpy_s
00401E51 |. 8D85 D0FDFFFF lea eax,[local.140]
00401E57 |. 6A 0C push 0xC
00401E59 |. 50 push eax
00401E5A |. FFD7 call edi // ; 复制一份字符串; <&MSVCR110.strcpy_s>
00401E5C |. 83C4 0C add esp,0xC
00401E5F |. 6A 06 push 0x6
00401E61 |. FFB5 B4FDFFFF push [local.147]
00401E67 |. 68 57200000 push 0x2057
00401E6C |. FF35 B0534000 push dword ptr ds:[0x4053B0] ; 2013CM~1.00400000
00401E72 |. FFD6 call esi
00401E74 |. FFB5 B4FDFFFF push [local.147]
00401E7A |. 8D45 E4 lea eax,[local.7]
00401E7D |. 6A 06 push 0x6
00401E7F |. 50 push eax
00401E80 |. FFD7 call edi
00401E82 |. 83C4 0C add esp,0xC
00401E85 |. 6A 0C push 0xC
00401E87 |. FFB5 ACFDFFFF push [local.149]
00401E8D |. 68 58200000 push 0x2058
00401E92 |. FF35 B0534000 push dword ptr ds:[0x4053B0] ; 2013CM~1.00400000
00401E98 |. FFD6 call esi
00401E9A |. FFB5 ACFDFFFF push [local.149]
00401EA0 |. 8D45 EA lea eax,dword ptr ss:[ebp-0x16]
00401EA3 |. 6A 0C push 0xC
00401EA5 |. 50 push eax
00401EA6 |. FFD7 call edi
00401EA8 |. 8B35 44404000 mov esi,dword ptr ds:[<&KERNEL32.Virtual>; kernel32.VirtualAllocEx
00401EAE |. 83C4 0C add esp,0xC
00401EB1 |. 6A 04 push 0x4 ; /flProtect = 0x4
00401EB3 |. 68 00300000 push 0x3000 ; |flAllocationType = 3000 (12288.)
00401EB8 |. 68 00100000 push 0x1000 ; |dwSize = 1000 (4096.)
00401EBD |. 6A 00 push 0x0 ; |lpAddress = NULL
00401EBF |. 53 push ebx ; |hProcess
00401EC0 |. FFD6 call esi ; \VirtualAllocEx
他先打开了进程 mov eax,dword ptr ds:[0x4053DC] ; 这里保存一个东西 下面用来打开进程 可以对这个进程右键 查找所有调用 然后自己跟一下 就会发现是刚才找进程保存的 我这里保存的是ctfmon.exe的pid
然后获取了GetProcessAddress的地址 然后对ctfmon.exe申请内存了 用来干啥? 自然想到直接去调试另一个进程
继续开另一个OD 附加0x4053DC保存的PID的进程 我这里是11dc 附加成功F9让他运行起来
继续回到主程序跟踪
[C++] 纯文本查看 复制代码 00401EC2 |. 8BF8 mov edi,eax
00401EC4 |. 89BD BCFDFFFF mov [local.145],edi
00401ECA |. 85FF test edi,edi
00401ECC |. 0F84 F5000000 je 2013CM~1.00401FC7
00401ED2 |. 6A 00 push 0x0 ; /pBytesWritten = NULL
00401ED4 |. 68 38020000 push 0x238 ; |写入的长度
00401ED9 |. 8D85 C0FDFFFF lea eax,[local.144] ; |
00401EDF |. 50 push eax // ; |写入数据的地址
00401EE0 |. 57 push edi // ; |目标进程的地址
00401EE1 |. 53 push ebx // ; |目标进程的hProcess
00401EE2 |. FF15 18404000 call dword ptr ds:[<&KERNEL32.WriteProce>//; \对第一申请的内存写入数据
00401EE8 |. 85C0 test eax,eax
单步F8 步过WriteProcessMenory 我们进去另一个进程看看他写入什么数据 我这里是00ac0000
00AC0000 0C 00 00 00 06 00 00 00 00 00 80 7C 00 00 D1 77 ......... |
免费评分
-
查看全部评分
|