a070458 发表于 2013-12-13 22:39

【吾爱2013CM大赛解答】-- Crack Me-- RedAgl 【CM分析】

本帖最后由 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查找看看看图片


呵呵发挥自己强大的脑补能力{:1_918:} 我估计就是查找几个.exe尾的进程了还有ollydbg和debug字样 估计还检查调试器{:1_903:} 这里我没被ANTI   所以就不去了解了   
继续来看软件   软件多处用到这样的代码去查找字符串的长度
00401463|.8D51 01       lea edx,dword ptr ds:
00401466|>8A01          /mov al,byte ptr ds:
00401468|.41            |inc ecx
00401469|.84C0          |test al,al
0040146B|.^ 75 F9         \jnz short 2013CM~1.00401466
0040146D|.2BCA          sub ecx,edx
跟进关键call 继续分析
00401B70/$55            push ebp
00401B71|.8BEC          mov ebp,esp
00401B73|.81EC 10010000 sub esp,0x110
00401B79|.A1 00504000   mov eax,dword ptr ds:
00401B7E|.33C5          xor eax,ebp
00401B80|.8945 FC       mov ,eax
00401B83|.68 04010000   push 0x104                               ; /Count = 104 (260.)
00401B88|.8D85 F0FEFFFF lea eax,                     ; |
00401B8E|.50            push eax                                 ; |Buffer
00401B8F|.FF35 78534000 push dword ptr ds:             ; |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:             ; |s = 00178188
00401BAD|.E8 D6150000   call <jmp.&MSVCR110.memset>            ; \memset
00401BB2|.83C4 0C       add esp,0xC
00401BB5|.8B4D FC       mov ecx,
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,                     ; |
00401BC9|.50            push eax                                 ; |s
00401BCA|.E8 B9150000   call <jmp.&MSVCR110.memset>         //   ; \置0
00401BCF|.83C4 0C       add esp,0xC
00401BD2|.8D85 F0FEFFFF lea eax,
00401BD8|.68 04010000   push 0x104                               ; /Count = 104 (260.)
00401BDD|.50            push eax                                 ; |Buffer
00401BDE|.FF35 74534000 push dword ptr ds:             ; |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:             ; |s = 00178298
00401BF7|.E8 8C150000   call <jmp.&MSVCR110.memset>            ; \memset
00401BFC|.8D8D F0FEFFFF lea ecx,
00401C02|.83C4 0C       add esp,0xC
00401C05|.8D51 01       lea edx,dword ptr ds:
00401C08|>8A01          /mov al,byte ptr ds:
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,
00401C1C|.50            push eax
00401C1D|.68 04010000   push 0x104
00401C22|.FF35 D4534000 push dword ptr ds:
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,
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 跟进!!!!!!!!!
00401C50/$55            push ebp                            //   ;来到这里
00401C51|.8BEC          mov ebp,esp
00401C53|.81EC 5C020000 sub esp,0x25C
00401C59|.A1 00504000   mov eax,dword ptr ds:
00401C5E|.33C5          xor eax,ebp
00401C60|.8945 FC       mov ,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 ,0x0
00401C7A|.8985 B8FDFFFF mov ,eax
00401C80|.FFD6          call esi                                 ;<&MSVCR110.operator new>
00401C82|.6A 10         push 0x10
00401C84|.8985 B0FDFFFF mov ,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 ,eax
00401C9A|.FFD6          call esi
00401C9C|.6A 0C         push 0xC
00401C9E|.8985 B4FDFFFF mov ,eax
00401CA4|.FFD6          call esi
00401CA6|.6A 0C         push 0xC
00401CA8|.8985 ACFDFFFF mov ,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,                      ; |
00401CBF|.6A 00         push 0x0                                 ; |c = 00
00401CC1|.50            push eax                                 ; |s
00401CC2|.C785 C0FDFFFF>mov ,0x0                      ; |
00401CCC|.C785 C4FDFFFF>mov ,0x0                      ; |
00401CD6|.C785 C8FDFFFF>mov ,0x0                      ; |
00401CE0|.C785 CCFDFFFF>mov ,0x0                      ; |
00401CEA|.C785 D0FDFFFF>mov ,0x0                      ; |
00401CF4|.66:C785 D4FDF>mov word ptr ss:,0x0          ; |
00401CFD|.C685 D6FDFFFF>mov byte ptr ss:,0x0          ; |
00401D04|.C785 D7FDFFFF>mov dword ptr ss:,0x0         ; |
00401D0E|.C685 DBFDFFFF>mov byte ptr ss:,0x0          ; |
00401D15|.E8 6E140000   call <jmp.&MSVCR110.memset>            ; \memset
00401D1A|.A1 DC534000   mov eax,dword ptr ds:      //;这里保存一个东西 下面用来打开进程
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:,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:             ; /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:
00401D65|.FF35 CC534000 push dword ptr ds:
00401D6B|.8B35 FC404000 mov esi,dword ptr ds:[<&MSVCR110.strcpy_>;msvcr110.strcpy_s
00401D71|.8985 C8FDFFFF mov ,eax
00401D77|.A1 E4534000   mov eax,dword ptr ds:
00401D7C|.8985 CCFDFFFF mov ,eax
00401D82|.8D85 DCFDFFFF lea eax,
00401D88|.68 04010000   push 0x104
00401D8D|.50            push eax
00401D8E|.FFD6          call esi                                 ;<&MSVCR110.strcpy_s>
00401D90|.8D8D DCFDFFFF lea ecx,
00401D96|.83C4 0C       add esp,0xC
00401D99|.8D51 01       lea edx,dword ptr ds:
00401D9C|.8D6424 00   lea esp,dword ptr ss:
00401DA0|>8A01          /mov al,byte ptr ds:               // ;这里取出的字符串就是刚才用户名+假注册码
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:
00401DAD|.8D85 E0FEFFFF lea eax,
00401DB3|.2BCA          sub ecx,edx                           //   ;求出了长度
00401DB5|.68 04010000   push 0x104
00401DBA|.50            push eax
00401DBB|.898D C0FDFFFF mov ,ecx
00401DC1|.FFD6          call esi                              // ;拷贝一份
00401DC3|.8D8D E0FEFFFF lea ecx,
00401DC9|.83C4 0C       add esp,0xC
00401DCC|.8D51 01       lea edx,dword ptr ds:
00401DCF|.90            nop
00401DD0|>8A01          /mov al,byte ptr ds:            //    ;取出了假码
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                          ; |Buffer
00401DE5|.2BCA          sub ecx,edx                              ; |
00401DE7|.68 52200000   push 0x2052                              ; |RsrcID = STRING "Kernel32.dll"
00401DEC|.FF35 B0534000 push dword ptr ds:             ; |hInst = 00400000
00401DF2|.898D C4FDFFFF mov ,ecx                      ; |
00401DF8|.FFD6          call esi                                 ; \LoadStringA
00401DFA|.FFB5 B0FDFFFF push                          ; /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:             ;2013CM~1.00400000
00401E14|.3B85 C8FDFFFF cmp eax,
00401E1A|.74 06         je short 2013CM~1.00401E22
00401E1C|.8985 C8FDFFFF mov ,eax
00401E22|>FFD6          call esi
00401E24|.57            push edi                                 ; /ProcNameOrOrdinal
00401E25|.FFB5 C8FDFFFF push                          ; |hModule
00401E2B|.FF15 74404000 call dword ptr ds:[<&KERNEL32.GetProcAdd>;//\获取了GetProcessAddress的地址
00401E31|.8BBD A8FDFFFF mov edi,
00401E37|.6A 0C         push 0xC
00401E39|.57            push edi
00401E3A|.68 56200000   push 0x2056
00401E3F|.FF35 B0534000 push dword ptr ds:             ;2013CM~1.00400000
00401E45|.8945 F4       mov ,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,
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
00401E67|.68 57200000   push 0x2057
00401E6C|.FF35 B0534000 push dword ptr ds:             ;2013CM~1.00400000
00401E72|.FFD6          call esi
00401E74|.FFB5 B4FDFFFF push
00401E7A|.8D45 E4       lea eax,
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
00401E8D|.68 58200000   push 0x2058
00401E92|.FF35 B0534000 push dword ptr ds:             ;2013CM~1.00400000
00401E98|.FFD6          call esi
00401E9A|.FFB5 ACFDFFFF push
00401EA0|.8D45 EA       lea eax,dword ptr ss:
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:          ;这里保存一个东西 下面用来打开进程 可以对这个进程右键 查找所有调用 然后自己跟一下 就会发现是刚才找进程保存的 我这里保存的是ctfmon.exe的pid   
然后获取了GetProcessAddress的地址 然后对ctfmon.exe申请内存了用来干啥? 自然想到直接去调试另一个进程   
继续开另一个OD   附加0x4053DC保存的PID的进程 我这里是11dc 附加成功F9让他运行起来
继续回到主程序跟踪
00401EC2|.8BF8          mov edi,eax
00401EC4|.89BD BCFDFFFF mov ,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,                      ; |
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

00AC00000C 00 00 00 06 00 00 00 00 00 80 7C 00 00 D1 77.........

a070458 发表于 2013-12-13 22:42

本帖最后由 a070458 于 2013-12-13 23:05 编辑


又是发挥强大的脑部能力的时候了 0C就是"32F757272533"(算法call算出来的)的字符串长度吧06就是"123123"假码的长度了吧
MessageBoxA不用我多说了吧
继续跟主程序


继续用上面的方法00401F52|.FF15 18404000 call dword ptr ds:[<&KERNEL32.WriteProce>; \又是写入了 我这里是00ad0000
步过后 去另一个进程看看

应该是代码吧.....
00401FBD|.FF15 24404000 call dword ptr ds:[<&KERNEL32.CreateRemo>; \创建远程线程 来到这里他创建远程线程了 这里看看他线程的进入地址我这么是00ad0000 果断去另一个进程对该地址下F2断点
运行主程序 然后看看另一个进程的OD果断断下来了 继续分析

对传过来的正注册码再xor一次
00AD0039    5F            pop edi 运行到这里看堆栈是正确的注册码>O8>=0426612
00AD000800AD003E2处改为jmp就能爆破了 但是现在在的是另一个进程 他的代码是通过主进程写入的 所以主进程一定有保存他的地方吧
复制CALL的代码 去主程序搜索一下

果断找到了对应00402358 0040238E   改JMP保存
试试爆破和正确注册码   
至此分析完毕


马斯维尔 发表于 2013-12-13 22:50

a070458 发表于 2013-12-13 22:42 static/image/common/back.gif
尾部被吞掉了

希望大牛此楼补全。。。好文章!

xjun 发表于 2013-12-13 22:50

表示膜拜!

brack 发表于 2013-12-13 22:51

大牛..厉害.

1007475557 发表于 2013-12-13 22:55

没看懂,算了

L4Nce 发表于 2013-12-13 23:13

本帖最后由 L4Nce 于 2013-12-13 23:20 编辑

远程线程注入shellcode的explorer,可以这么玩,下openprocess,call kernel32.CreateRemoteThread,发现打开explorer的时候断CreateRemoteThread再开一个od加载explorer根据参数获取线程地址下f2两个od都f9就可以在explorer里面断下,里面就几个小跳,就OK
还最重要的是膜拜大大,这么认真分析不加威望?

Rookietp 发表于 2013-12-14 00:40

{:1_906:}霸气侧漏啊,师傅!

zhigaows 发表于 2013-12-14 00:45

膜拜大牛。。。

vipcrack 发表于 2013-12-14 00:51

本帖最后由 vipcrack 于 2013-12-14 01:02 编辑

004026B0 |> /0FBE040A /movsx eax, byte ptr ; 用户名HEX累加
004026B4 |. |03F8 |add edi, eax
004026B6 |. |0FBE440A 01 |movsx eax, byte ptr
004026BB |. |83C1 02 |add ecx, 0x2
004026BE |. |03D8 |add ebx, eax
004026C0 |. |3BCE |cmp ecx, esi
004026C2 |.^\7C EC \jl short 004026B0
004026C4 |. 8BB5 E8FEFFFF mov esi, dword ptr
004026CA |> 3BCE cmp ecx, esi
004026CC |. 7D 0A jge short 004026D8
004026CE |. 0FBE040A movsx eax, byte ptr
004026D2 |. 8985 F0FEFFFF mov dword ptr , eax
004026D8 |> 8B8D F0FEFFFF mov ecx, dword ptr
004026DE |. 6A 0A push 0xA
004026E0 |. 68 04010000 push 0x104
004026E5 |. 8D85 F8FEFFFF lea eax, dword ptr
004026EB |. 50 push eax
004026EC |. 81C1 DD070000 add ecx, 0x7DD
004026F2 |. 8D043B lea eax, dword ptr
004026F5 |. 03C1 add eax, ecx ; HEX累加和 +7DD
004026F7 |. 6BC0 34 imul eax, eax, 0x34 ; 967*43
004026FA |. 50 push eax ; eax=0001E8EC 转换成10进制就是新处理后的用户名后面的数字。
004026FB |. FF15 04414000 call dword ptr [<&MSVCR110._itoa_s>] ; msvcr110._itoa_s








00402787 |. 68 04010000 push 0x104 ; /取C盘的硬盘序列号
0040278C |. 8D85 D8F6FFFF lea eax, dword ptr ; |
00402792 |. 50 push eax ; |pFileSystemNameBuffer
00402793 |. 8D85 CCF6FFFF lea eax, dword ptr ; |
00402799 |. 50 push eax ; |pFileSystemFlags
0040279A |. 8D85 D0F6FFFF lea eax, dword ptr ; |
004027A0 |. 50 push eax ; |pMaxFilenameLength
004027A1 |. 8D85 D4F6FFFF lea eax, dword ptr ; |
004027A7 |. 50 push eax ; |pVolumeSerialNumber
004027A8 |. 68 04010000 push 0x104 ; |MaxVolumeNameSize = 104 (260.)
004027AD |. 8D85 E0F8FFFF lea eax, dword ptr ; |
004027B3 |. 50 push eax ; |VolumeNameBuffer
004027B4 |. 6A 00 push 0x0 ; |RootPathName = NULL
004027B6 |. C785 D0F6FFFF FF000000 mov dword ptr , 0xFF ; |
004027C0 |. FF15 58404000 call dword ptr [<&KERNEL32.GetVolumeI>; \GetVolumeInformationW
004027C6 |. 33C9 xor ecx, ecx
004027C8 |. 85F6 test esi, esi
004027CA |. 7E 11 jle short 004027DD
004027CC |. 8B15 D0534000 mov edx, dword ptr ; ds:=00168A68, (ASCII "abcd125164")
004027D2 |> 0FBE040A /movsx eax, byte ptr
004027D6 |. 41 |inc ecx
004027D7 |. 03F8 |add edi, eax
004027D9 |. 3BCE |cmp ecx, esi
004027DB |.^ 7C F5 \jl short 004027D2
004027DD |> 8B35 04414000 mov esi, dword ptr [<&MSVCR110._itoa>; HEX累加和 2BD
004027E3 |. 6A 0A push 0xA
004027E5 |. 68 04010000 push 0x104
004027EA |. 8D85 F0FCFFFF lea eax, dword ptr
004027F0 |. 50 push eax
004027F1 |. FFB5 D4F6FFFF push dword ptr ; 硬盘序列号 ss:=80806311 有符号数-2139069679,注册码后半段





得到的HEX是注册码的前半段,然后获取C盘的序列号,转换成带符号的10进制数字,连接到后面就是注册码.



页: [1]
查看完整版本: 【吾爱2013CM大赛解答】-- Crack Me-- RedAgl 【CM分析】