【文章标题】: abooMe的破解和算法分析
【文章作者】: jdxyw
【软件名称】: abooMe
【下载地址】: 自己搜索下载
【加壳方式】: 无
【编写语言】: C/C++
【使用工具】: peid OD
【操作平台】: XP
【作者声明】: 如果某位高手已经破过这个了,请告诉我,我把附件删了,给论坛省点空间
--------------------------------------------------------------------------------
【详细过程】
首先用peid查壳,无壳
点击运行,没有任何反应
运行OD,将crack载入 ctrl+N 查看调用函数,将断点断在GetDlgItemTextA上,输入用户名和序列号
004047D8 |> 8B4D 90 /MOV ECX,DWORD PTR SS:[EBP-70]
004047DB |. 83C1 01 |ADD ECX,1
004047DE |. 894D 90 |MOV DWORD PTR SS:[EBP-70],ECX
004047E1 |> 8B55 90 MOV EDX,DWORD PTR SS:[EBP-70]
004047E4 |. 3B55 8C |CMP EDX,DWORD PTR SS:[EBP-74] EDX是用来计数的,当为用户名长度的时候,跳出循环
004047E7 |. 7D 36 |JGE SHORT aboome2.0040481F
004047E9 |. 8B45 90 |MOV EAX,DWORD PTR SS:[EBP-70]
004047EC |. 0FBE8C05 18FF>|MOVSX ECX,BYTE PTR SS:[EBP+EAX-E8] 逐个取用户名字节到ECX
004047F4 |. 8B55 90 |MOV EDX,DWORD PTR SS:[EBP-70]
004047F7 |. 33C0 |XOR EAX,EAX
004047F9 |. 8A82 C1AC4100 |MOV AL,BYTE PTR DS:[EDX+41ACC1] 在内存中有个表,是固定的,是用来计算序列号的,按顺序取一个
字节到AL中
004047FF |. 0345 FC |ADD EAX,DWORD PTR SS:[EBP-4] 将计算所得,原先存入堆栈中的数值,加到EAX中
00404802 |. 03C1 |ADD EAX,ECX 将前面取出的用户名字节加到EAX中
00404804 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX 将计算所的,保存到前两步中用到的数值的保存地址中
00404807 |. 8B4D 90 |MOV ECX,DWORD PTR SS:[EBP-70]
0040480A |. 0FBE940D 18FF>|MOVSX EDX,BYTE PTR SS:[EBP+ECX-E8] 将这个循环用到的用户名字节取到EDX
00404812 |. 6BD2 0A |IMUL EDX,EDX,0A EDX=EDX*OAH
00404815 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4] 将先前计算所得取到EAX
00404818 |. 03C2 |ADD EAX,EDX EAX=EAX*EDX
0040481A |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX 将计算所得存入同一地址
0040481D |.^ EB B9 \JMP SHORT aboome2.004047D8
0040481F |> C745 90 00000>MOV DWORD PTR SS:[EBP-70],0
00404826 |. EB 09 JMP SHORT aboome2.00404831
00404828 |> 8B4D 90 /MOV ECX,DWORD PTR SS:[EBP-70]
0040482B |. 83C1 01 |ADD ECX,1
0040482E |. 894D 90 |MOV DWORD PTR SS:[EBP-70],ECX
00404831 |> 8B55 90 MOV EDX,DWORD PTR SS:[EBP-70] SS:[EBP-70]保存的是已经的循环次数
00404834 |. 3B55 8C |CMP EDX,DWORD PTR SS:[EBP-74] SS:[EBP-74]保存的是用户名长度
00404837 |. 7D 3D |JGE SHORT aboome2.00404876
00404839 |. 8B45 90 |MOV EAX,DWORD PTR SS:[EBP-70]
0040483C |. 33C9 |XOR ECX,ECX
0040483E |. 8A88 C0AC4100 |MOV CL,BYTE PTR DS:[EAX+41ACC0] 逐个取表中字节到CL中
00404844 |. 6BC9 0A |IMUL ECX,ECX,0A ECX=ECX*OAh
00404847 |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8] 取保存计算结果到EDX
0040484A |. 03D1 |ADD EDX,ECX EDX=EDX+ECX
0040484C |. 8955 F8 |MOV DWORD PTR SS:[EBP-8],EDX 将计算结果返回到保存处
0040484F |. 0FBE85 1AFFFF>|MOVSX EAX,BYTE PTR SS:[EBP-E6] 取用户名字节到EAX
00404856 |. 8B4D 90 |MOV ECX,DWORD PTR SS:[EBP-70]
00404859 |. 33D2 |XOR EDX,EDX
0040485B |. 8A91 C0AC4100 |MOV DL,BYTE PTR DS:[ECX+41ACC0] 取表中字节数到DL中
00404861 |. 0355 F8 |ADD EDX,DWORD PTR SS:[EBP-8] 将计算结果加到EDX上
00404864 |. 03D0 |ADD EDX,EAX 将EAX加到EDX上
00404866 |. 8955 F8 |MOV DWORD PTR SS:[EBP-8],EDX 将计算结果返回到保存处
00404869 |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8] 将计算结果取到EAX
0040486C |. 05 37130300 |ADD EAX,31337 将31337H加到eax上
00404871 |. 8945 F8 |MOV DWORD PTR SS:[EBP-8],EAX 将计算结果送到保存处
00404874 |.^ EB B2 \JMP SHORT aboome2.00404828
00404876 |> 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
00404879 |. 51 PUSH ECX
0040487A |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
0040487D |. 52 PUSH EDX
0040487E |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00404881 |. 50 PUSH EAX
00404882 |. 68 D0AC4100 PUSH aboome2.0041ACD0 ; ASCII "%X-aboo-me-%X%i-SCA"
00404887 |. 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
0040488A |. 51 PUSH ECX
0040488B |. E8 E90A0000 CALL aboome2.00405379 这个call是将前面计算的结果
格式化保存到"%X-aboo-me-%X%i-SCA"中,
这个就是序列号的形式
00404890 |. 83C4 14 ADD ESP,14
00404890 |. 83C4 14 ADD ESP,14
00404893 |. 6A 64 PUSH 64 ; /Count = 64 (100.)
00404895 |. 8D95 28FFFFFF LEA EDX,DWORD PTR SS:[EBP-D8] ; |
0040489B |. 52 PUSH EDX ; |Buffer
0040489C |. 68 ED030000 PUSH 3ED ; |ControlID = 3ED (1005.)
004048A1 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; |
004048A4 |. 50 PUSH EAX ; |hWnd
004048A5 |. FF15 E0204100 CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; \GetDlgItemTextA
004048AB |. 8D8D 28FFFFFF LEA ECX,DWORD PTR SS:[EBP-D8]
004048B1 |. 51 PUSH ECX ; /String2 假序列号
004048B2 |. 8D55 94 LEA EDX,DWORD PTR SS:[EBP-6C] ; |
004048B5 |. 52 PUSH EDX ; |String1 真序列号
004048B6 |. FF15 0C204100 CALL DWORD PTR DS:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA
004048BC |. 8985 14FFFFFF MOV DWORD PTR SS:[EBP-EC],EAX
004048C2 |. 83BD 14FFFFFF>CMP DWORD PTR SS:[EBP-EC],0
004048C9 |. 75 14 JNZ SHORT aboome2.004048DF
004048CB |. 68 E4AC4100 PUSH aboome2.0041ACE4 ; /Text = "Good Work! now make a keygen! "
004048D0 |. 68 ED030000 PUSH 3ED ; |ControlID = 3ED (1005.)
004048D5 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; |
004048D8 |. 50 PUSH EAX ; |hWnd
004048D9 |. FF15 DC204100 CALL DWORD PTR DS:[<&USER32.SetDlgItemTe>; \SetDlgItemTextA
004048DF |> E9 86000000 JMP aboome2.0040496A
算法分析
内存中的表
0041ACB9 13 13是表的第一项
0041ACC1 16 99 11 63 15 54 52 88
我的用户名是yutou 序列号 1A3A-ab00-me-F6FA91011625-SCA
在第一个循环中
设表为table 结果为A用户名为name
A += name[t] + table [t+1] + (name[t] * 0x0A);循环5次
在第二个循环中 结果为B
B += (table [t] * 0x0A) + name[2] + table [t] + 0x31337;循环五次
在序列号的形式中"%X-aboo-me-%X%i-SCA"
第一个%X就是A的十六进制表示 第二个%X是B的十六进制表示,%i是B的十进制的表示。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月18日 14:14:44
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课