今天分析的软件也是一个crackme,和上面一篇软件大同小异。也是用户名和注册码形式的。直接打开Ollydbg把软件拖入F9运行。随便输入假注册码与用户名点注册后,根据错误提示搜索字符串。按下ALT+M打开内存窗口找到主软件内存段,选择PE头的下个段按回车返回反汇编窗口上图中,反汇编窗口看到有跳转到错误提示框的有好几个位置。可以根据跳转过来的地址都返回看看哪些是关键的位置都下个断。下断点选择汇编代码按下F2就在对应选择的位置下了CC断点了。 7个调用位置,我已经全下好了断点,返回软件上点击CHECK按钮。这里有个cmp esi,eax比较跳转到错误框了。获取了用户名和注册码的长度进行对比。软件要求用户名和注册码长度要一样。修改软件注册码! 修改注册码也为6位:123456,条件满足后,跳转变灰。继续F8往下分析。走到4011B1又跳转了,分析它在取用户名的字节和固定值比较。
JA:无符号大于则跳转
用户名的第三位数为0,ASCII码为:30,30小于41所以跳转了。004021D0 41 7A 5A 00 AzZ.
由这里可以判断的数字转成字母得出用户名只能是大小写字母。将用户名修改下继续分析。004011A4 . 83F8 00 cmp eax,0x0 ; Switch (cases 0..7A)004011A7 . 74 32 je short 13.004011DB004011A9 . BE FFFFFFFF mov esi,-0x1004011AE . 83F8 41 cmp eax,0x41004011B1 . 7C 67 jl short 13.0040121A004011B3 . 83F8 7A cmp eax,0x7A004011B6 . 77 62 ja short 13.0040121A004011B8 . 83F8 5A cmp eax,0x5A004011BB . 7C 03 jl short 13.004011C0004011BD . 83E8 20 sub eax,0x20 ; Cases 5A ('Z'),5B ('['),5C ('\'),5D (']'),5E ('^'),5F ('_'),60 ('`'),61 ('a'),62 ('b'),63 ('c'),64 ('d'),65 ('e'),66 ('f'),67 ('g'),68 ('h'),69 ('i'),6A ('j'),6B ('k'),6C ('l'),6D ('m')... of switch 004011A4004011C0 > 46 inc esi ; Cases 41 ('A'),42 ('B'),43 ('C'),44 ('D'),45 ('E'),46 ('F'),47 ('G'),48 ('H'),49 ('I'),4A ('J'),4B ('K'),4C ('L'),4D ('M'),4E ('N'),4F ('O'),50 ('P'),51 ('Q'),52 ('R'),53 ('S'),54 ('T')... of switch 004011A4004011C1 . 0FBE96 172040>movsx edx,byte ptr ds:[esi+0x402017]004011C8 . 3BC2 cmp eax,edx004011CA .^ 75 F4 jnz short 13.004011C0004011CC . 0FBE86 3C2040>movsx eax,byte ptr ds:[esi+0x40203C]004011D3 . 8981 94214000 mov dword ptr ds:[ecx+0x402194],eax004011D9 .^ EB C1 jmp short 13.0040119C004011DB > FF35 AF214000 push dword ptr ds:[0x4021AF] ; Case 0 of switch 004011A4004011E1 . 68 94214000 push 13.00402194 ; ASCII "8DFF0F7"004011E6 . 68 79214000 push 13.00402179 ; ASCII "12345678"004011EB . E8 54000000 call 13.00401244
0018FA38 00402194 ASCII "8DFF0F7"
这里出现的字符是不是正确的注册码呢? 这个程序和第12篇是类似的,根据用户名生成了注册码。
004011F0 . 83F8 01 cmp eax,0x1004011F3 .^ 0F84 DEFEFFFF je 13.004010D7
这个跳转到注册成功的位置。说明那个CALL就是真假码对比。输入得出的注册码,软件也注册完成。
注册码生成算法:
根据用户名的ASCII值在A表内找,找到后返回位置,在到B表内根据位置得出一个字符,循环得出注册码。
A数组内容:
00402010 41 31 4C 53 4B 32 44 4A 46 A1LSK2DJF00402020 34 48 47 50 33 51 57 4F 35 45 49 52 36 55 54 59 4HGP3QWO5EIR6UTY00402030 5A 38 4D 58 4E 37 43 42 56 39 Z8MXN7CBV9
B数组内容:
00402030 53 55 37 43 SU7C00402040 53 4A 4B 46 30 39 4E 43 53 44 4F 39 53 44 46 30 SJKF09NCSDO9SDF000402050 39 53 44 52 4C 56 4B 37 38 30 39 53 34 4E 46 9SDRLVK7809S4NF
具体注册机源码,有兴趣的可以自己编写。一个FOR循环取值就行了。
阅读原文:原文链接
该文章在 2025/12/26 11:50:48 编辑过