继续新手零基础入门逆向破解实例分析,本次分析的软件也是一个简单的crackme,难度为一颗星。输入正确的用户名和密码后,下方会显示一张美女的图片。这次没有注册按钮。先不管它。我们直接开OllyDBG.EXE把程序拖到OD里。 同样和前面一样,查看内存快捷 ALT+M,选择程序的CODE段右键,反汇编窗口中查看,在反汇编窗口后,继续右键选搜索字符串后面看到有个 恭喜恭喜 注册成功。 双击查看反汇编代码00457FB8 /. 55 push ebp00457FB9 |. 8BEC mov ebp,esp00457FBB |. B9 04000000 mov ecx,0x400457FC0 |> 6A 00 /push 0x000457FC2 |. 6A 00 |push 0x000457FC4 |. 49 |dec ecx00457FC5 |.^ 75 F9 \jnz short CKme.00457FC000457FC7 |. 51 push ecx00457FC8 |. 53 push ebx00457FC9 |. 56 push esi00457FCA |. 8BF0 mov esi,eax00457FCC |. 33C0 xor eax,eax00457FCE |. 55 push ebp00457FCF |. 68 FD804500 push CKme.004580FD00457FD4 |. 64:FF30 push dword ptr fs:[eax]00457FD7 |. 64:8920 mov dword ptr fs:[eax],esp
找到段首进行下断,回到程序上,随便输入个用户名和注册码。因为没有注册按钮,就随便点一点看有没反应。结果在点击说显示图上的框上,它断到了我个下的断点位置。非常好,我们直接F8往下走,跑一遍大概了解下,看看有没跳转是直接到恭喜恭喜这个位置的。结果还真有个跳转到注册位置0045803B |. /75 76 jnz short CKme.004580B30045803D |. |33DB xor ebx,ebx0045803F |> |8D55 E4 /lea edx,[local.7]00458042 |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]00458048 |. |E8 FBB2FCFF |call CKme.004233480045804D |. |8B45 E4 |mov eax,[local.7]00458050 |. |E8 27BBFAFF |call CKme.00403B7C00458055 |. |83C0 03 |add eax,0x300458058 |. |8D55 E8 |lea edx,[local.6]0045805B |. |E8 A4FAFAFF |call CKme.00407B0400458060 |. |FF75 E8 |push [local.6]00458063 |. |8D55 E0 |lea edx,[local.8]00458066 |. |8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]0045806C |. |E8 D7B2FCFF |call CKme.0042334800458071 |. |FF75 E0 |push [local.8]00458074 |. |8D55 DC |lea edx,[local.9]00458077 |. |8BC3 |mov eax,ebx00458079 |. |E8 86FAFAFF |call CKme.00407B040045807E |. |FF75 DC |push [local.9]00458081 |. |8D45 FC |lea eax,[local.1]00458084 |. |BA 03000000 |mov edx,0x300458089 |. |E8 AEBBFAFF |call CKme.00403C3C0045808E |. |43 |inc ebx0045808F |. |83FB 13 |cmp ebx,0x1300458092 |.^|75 AB \jnz short CKme.0045803F00458094 |. |33D2 xor edx,edx00458096 |. |8B86 F0020000 mov eax,dword ptr ds:[esi+0x2F0]0045809C |. |E8 BFB1FCFF call CKme.00423260004580A1 |. |A1 20B84500 mov eax,dword ptr ds:[0x45B820]004580A6 |. |83C0 70 add eax,0x70004580A9 |. |BA 14814500 mov edx,CKme.00458114 ; 恭喜恭喜!注册成功004580AE |. |E8 9DB8FAFF call CKme.00403950004580B3 |> \33C0 xor eax,eax ; CKme.0045802B
看到这个跳转直接跳过就没了,那么不让它跳我们看看会不会是直接注册成功。在寄存器窗口,找到Z标志,双击它让它变成1此时JNZ就变成灰色,不跳转了。继续F8,这里还有个0x13次的循环0045808E |. 43 |inc ebx0045808F |. 83FB 13 |cmp ebx,0x13
我们在循环外面一条代码下断点F2,在F9跳过它。在次F9运行起来。发现软件真注册成功,大美女也显示出来了0045803B |. /75 76 jnz short CKme.004580B3
在把修改的数据保存成新的EXE程序,软件就直接破解了。也不用输入用户名注册码,直接显示。=============但并未结束======================直接修改是非常简单,但我们重要的是分析它的注册码生成算法。继续吧! 用OD重新加载软件,运行起来输入假的用户名和注册码,点击图片框断下来后。继续分析,我们发现它有两个循环,但循环出来的数值没什么鸟用。和注册码没一点关系。但决定那个跳转的关键条件代码00458031 |. 81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
这里和0X85比较,那么这【ESI+0X30C]的值 从哪里来就成了关键。要找到这个赋值的位置。 这里我就采用最笨的方法,直接地毯式搜索。由于软件功能不多,那就在反汇编窗口中向上翻,找到每个函数的开头下断。当然要自行看,如果功能代码很少的估计就不是,选 那种代码长的函数头下断。 输入入用户名后,在注册码位置输入一个字符,OD就断下来了。F8往下走,发现有个字符:
ds:[00471C90]=00475828, (ASCII "黑头Sun Bird11dseloffc-012-OKit0365")
这个会不会是真正的注册码?继续往下走,发现这也有前面我们点图片断下的循环一样的。没去细看,感觉没什么用。倒是这里值 得注意:
00457D2C |. 8B45 E0 mov eax,[local.8]00457D2F |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318]00457D35 |. E8 52BFFAFF call CKme.00403C8C00457D3A |. 75 0A jnz short CKme.00457D46
寄存器中出现了字符对比,一个是我们输入的注册码一个是软件生成的。
00457D3C |. C783 0C030000>mov dword ptr ds:[ebx+0x30C],0x3E00457D46 |> 8B83 0C030000 mov eax,dword ptr ds:[ebx+0x30C]
的值从哪来?刚好就是这句了。如果它不跳转就是给它赋值0X3E了否则为0.这里我们把标志Z改为1,不让它跳,让它赋值。赋值后F9运行,没有出现图片。 那么在次单击图片框,又断下来来到我们跳转那关键位置看到这个地址的值给到了3E,但还是不对。所以图片无法显示。重新运行软件,输入我们在内存中找到那个字符,结果发现赋值3E的条件满足了。但并未显示数据。因为它还不是0X85,继续往上看。00457EF5 |. 83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E00457EFC |. 75 0A jnz short CKme.00457F0800457EFE |. C786 0C030000>mov dword ptr ds:[esi+0x30C],0x8500457F08 |> 33DB xor ebx,ebx00457F0A |> 8D55 E4 /lea edx,[local.7]00457F0D |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
这个神经软件,要在图片框多点几次就断到这个函数内。发现它有赋值0X85了。此时就对了。F9运行,虽然给了值 还是没显示,在次单击图片框。断下来,来到 不知道软件是代码问题还是作者故意为之。总结下软件大概流程:2、监控注册码框输入数据时断下,计算假注册码和真注册码比较,然后给个变量赋值。
(黑头Sun Bird)+11+(dseloffc-012-OK)+it0365
这个11上面函数经过分析是用户名的长度加5(
00457C66 |. 8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8]00457C6C |. 83C6 05 add esi,0x5
)
IT0365就是输入的用户名
直接组成了注册码。
我这方法比较笨,算法还是很简单的,就是绕了几圈。分析这个软件主要是学习破解逆向的思路。破解逆向重要的还是多动手练习,光看还是学不会的。
阅读原文:原文链接
该文章在 2025/12/10 18:26:57 编辑过