【文章标题】: 一个Crackme注册机
【文章作者】: 只爱阿蒙
【作者邮箱】: youyong407@163.com
【作者主页】: n/a
【作者QQ号】: 64570303
【软件名称】: ncrackme.exe
【加壳方式】: 无壳
【保护方式】: 无壳
【编写语言】: vc
【使用工具】: OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
在命令行输入"bpx GetDlgItemTextA",来到以下这个位置:
00401245 |. 6A 10 push 10 ; /Count = 10 (16.)
00401247 |. 50 push eax ; |Buffer
00401248 |. 68 E8030000 push 3E8 ; |ControlID = 3E8 (1000.)
0040124D |. 51 push ecx ; |hWnd => 001001E4 (class='#32770',parent=000B0274)
0040124E |. 33DB xor ebx, ebx ; |
00401250 |. FFD6 call esi ; \GetDlgItemTextA
00401252 |. 83F8 03 cmp eax, 3 ; 用户名的长度>3
00401255 |. 73 0B jnb short 00401262 ; 小于3则失败
00401257 |. 5E pop esi
00401258 |. B8 01000000 mov eax, 1
0040125D |. 5B pop ebx
0040125E |. 83C4 30 add esp, 30
00401261 |. C3 retn
00401262 |> A1 BC564000 mov eax, dword ptr [4056BC]
00401267 |. 8D5424 28 lea edx, dword ptr [esp+28] ; 存储获取的注册码
0040126B |. 6A 10 push 10
0040126D |. 52 push edx
0040126E |. 68 E9030000 push 3E9
00401273 |. 50 push eax
00401274 |. FFD6 call esi ; 获取的注册码(GetDlgItemText)
00401276 |. 0FBE4424 08 movsx eax, byte ptr [esp+8] ; 将输入的用户名第一个字符移至eax
0040127B |. 0FBE4C24 09 movsx ecx, byte ptr [esp+9] ; 将输入的用户名第二个字符移至ecx
00401280 |. 99 cdq ; 将eax的符号位移至edx中
00401281 |. F7F9 idiv ecx ; eax = eax / ecx
00401283 |. 8BCA mov ecx, edx ; edx = eax % ecx
00401285 |. 83C8 FF or eax, FFFFFFFF ; eax == -1
00401288 |. 0FBE5424 0A movsx edx, byte ptr [esp+A] ; 将输入的用户名第三个字符移至edx
0040128D |. 0FAFCA imul ecx, edx ; ecx = ecx * edx
00401290 |. 41 inc ecx ; ecx = ecx + 1
00401291 |. 33D2 xor edx, edx ; edx = 0
00401293 |. F7F1 div ecx ; eax = -1 / ecx
00401295 |. 50 push eax ; 将eax入栈
00401296 |. E8 A5000000 call 00401340 ; 存储商eax
;********************************************************************************************
00401340 /$ 8B4424 04 mov eax, dword ptr [esp+4] ; 将栈中eax值赋给eax
00401344 |. A3 AC504000 mov dword ptr [4050AC], eax ; 存储eax的值存储于4050ac中
00401349 \. C3 retn
;********************************************************************************************
0040129B |. 83C4 04 add esp, 4 ;
0040129E |. 33F6 xor esi, esi ; esi = 0
004012A0 |> E8 A5000000 /call 0040134A
;********************************************************************************************
0040134A /$ A1 AC504000 mov eax, dword ptr [4050AC] ; 将储存在4050ac中值赋给eax
0040134F |. 69C0 FD430300 imul eax, eax, 343FD ; eax = eax * 343fd
00401355 |. 05 C39E2600 add eax, 269EC3 ; eax = eax + 269ec3
0040135A |. A3 AC504000 mov dword ptr [4050AC], eax ; 将eax值存储于4050ac中
0040135F |. C1F8 10 sar eax, 10 ; eax = eax / 200h
00401362 |. 25 FF7F0000 and eax, 7FFF ; eax = eax & 7FFF
00401367 \. C3 retn
;********************************************************************************************
004012A5 |. 99 |cdq ; 将eax符号位移至edx中
004012A6 |. B9 1A000000 |mov ecx, 1A ; ecx = 1Ah
004012AB |. F7F9 |idiv ecx ; ecx = eax / 1Ah
004012AD |. 80C2 41 |add dl, 41 ; edx = eax % 1Ah + 41h
004012B0 |. 885434 18 |mov byte ptr [esp+esi+18], dl ; dl值存储于[esp + esi + 18]处 (假码)
004012B4 |. 46 |inc esi ; esi = esi + 1
004012B5 |. 83FE 0F |cmp esi, 0F ; esi > 15?
004012B8 |.^ 72 E6 \jb short 004012A0 ; 跳至4012a0处
004012BA |. 57 push edi ; edi入栈
004012BB |. 8D7C24 0C lea edi, dword ptr [esp+C] ; edi = 输入的用户名地址
004012BF |. 83C9 FF or ecx, FFFFFFFF ; ecx = -1
004012C2 |. 33C0 xor eax, eax ; eax = 0
004012C4 |. 33F6 xor esi, esi ; esi = 0
004012C6 |. F2:AE repne scas byte ptr es:[edi] ; 查表
004012C8 |. F7D1 not ecx ; 计算输入的用户名的长度含最后0字符
004012CA |. 49 dec ecx ; ecx(用户名长度) = 长度-0字符
004012CB |. 74 59 je short 00401326 ; 跳出则注册失败
004012CD |> 8A4434 0C /mov al, byte ptr [esp+esi+C] ; al = [esp+esi+C]指向输入的用户名
004012D1 |. C0F8 05 |sar al, 5 ; al = al / 16
004012D4 |. 0FBEC0 |movsx eax, al ; al 填充eax中
004012D7 |. 8D1480 |lea edx, dword ptr [eax+eax*4] ; edx = 5eax
004012DA |. 8D04D0 |lea eax, dword ptr [eax+edx*8] ; eax = eax + 5eax * 8
004012DD |. 8D0440 |lea eax, dword ptr [eax+eax*2] ; eax = (eax+5eax*8)+(eax+5eax*8)*2
004012E0 |. 85C0 |test eax, eax ; 测试eax == 0?
004012E2 |. 7E 0A |jle short 004012EE ; 跳出则失败
004012E4 |. 8BF8 |mov edi, eax ; edi = eax
004012E6 |> E8 5F000000 |/call 0040134A ; 对eax进行处理(代码见上)edi次
004012EB |. 4F ||dec edi ; edi = edi -1
004012EC |.^ 75 F8 |\jnz short 004012E6 ; 循环
004012EE |> E8 57000000 |call 0040134A ; 处理eax
004012F3 |. 99 |cdq ; 将eax符号位移至edx中
004012F4 |. B9 1A000000 |mov ecx, 1A ; ecx = 1Ah
004012F9 |. 8D7C24 0C |lea edi, dword ptr [esp+C] ; edi = 输入用户名地址
004012FD |. F7F9 |idiv ecx ; edx = eax % ecx
004012FF |. 0FBE4C34 2C |movsx ecx, byte ptr [esp+esi+2C] ;
00401304 |. 80C2 41 |add dl, 41 ; dl = dl + 41h
00401307 |. 0FBEC2 |movsx eax, dl ; eax = dl
0040130A |. 2BC1 |sub eax, ecx ; eax = eax - ecx
0040130C |. 885434 1C |mov byte ptr [esp+esi+1C], dl ; [esp+esi+1c]储存假码的位置(现为真码)
00401310 |. 99 |cdq ; 将符号位移至edx中
00401311 |. 33C2 |xor eax, edx ; eax = eax ^ edx
00401313 |. 83C9 FF |or ecx, FFFFFFFF ; ecx = -1
00401316 |. 2BC2 |sub eax, edx ; eax = eax - edx
00401318 |. 03D8 |add ebx, eax ; ebx = ebx + eax
0040131A |. 33C0 |xor eax, eax ; eax = 0
0040131C |. 46 |inc esi ; esi++
0040131D |. F2:AE |repne scas byte ptr es:[edi] ;************************
0040131F |. F7D1 |not ecx ; 求输入用户名的长度
00401321 |. 49 |dec ecx ;************************
00401322 |. 3BF1 |cmp esi, ecx ; 判断是否达到用户名的长度
00401324 |.^ 72 A7 \jb short 004012CD ; 未达到则继续
00401326 |> 5F pop edi
00401327 |. 8BC3 mov eax, ebx
00401329 |. 5E pop esi
0040132A |. 5B pop ebx
0040132B |. 83C4 30 add esp, 30
0040132E \. C3 retn
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)