【文章标题】: 加密解密习题练习破文
【文章作者】: kanghtta
【作者邮箱】: kanghtta@hotmail.com
【作者主页】: http://kanghtta.cublog.cn
【作者QQ号】: 18381291
【软件名称】: echap515
【软件大小】: 193kb
【下载地址】: 光盘下载
【加壳方式】: 无
【编写语言】: delphi3.0
【使用工具】: peid OllyICE
【操作平台】: Windows XP
【软件介绍】: Name/Serial 中
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
大家好,今天周末,以后打算每星期练一个。看到看雪很多挂章的,好想要哦!所以,努力学习!嘿嘿。。。
今天做的是加密解密补充习题的515,难度中;
首先,还是运行以下程序,随便输入些字符,OK它,MessageBox出来了:Wrong Serial Number!
今天用一用OD的字串参考吧,前两个练习虽然也想用,但由于是汇编写的,程序比较小,所以上下滚动就找了关键,
后来想想,这对我熟悉OD的环境不太好吧,还是正规点。废话不说了,用PEID收集的信息也差不多了。OD载入。
1,
在反汇编窗口中: 右键--〉查找--〉所有参考文本字串
在文本字串参考窗口中:右键-->查找文本 在弹出的文本框里输入:Wrong (注意区分大小写)
找到一处:Wrong Serial Number! 在此文本上右键---〉反汇编窗口中跟随
代码如下:
00427BA3 |. /7D 1E jge short 00427BC3
00427BA5 |> |6A 00 push 0
00427BA7 |. |68 087C4200 push 00427C08 ; ASCII "ERROR"
00427BAC |. |68 107C4200 push 00427C10 ; ASCII "Wrong Serial Number !"
00427BB1 |. |A1 44974200 mov eax, dword ptr [429744]
00427BB6 |. |E8 411EFFFF call 004199FC
00427BBB |. |50 push eax ; |hOwner
00427BBC |. |E8 4FD9FDFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA 注册失败
00427BC1 |. |EB 1C jmp short 00427BDF
00427BC3 |> \6A 00 push 0
00427BC5 |. 68 287C4200 push 00427C28 ; ASCII "Success"
00427BCA |. 68 307C4200 push 00427C30 ; ASCII "Congratulation ! You've Did It.",CR,"Mail Us : ekhmail@egroups.com"
00427BCF |. A1 44974200 mov eax, dword ptr [429744]
00427BD4 |. E8 231EFFFF call 004199FC
00427BD9 |. 50 push eax ; |hOwner
00427BDA |. E8 31D9FDFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA 注册成功
下面我们看看这两个消息框从那里跳过来的:
00427B44 /. 55 push ebp
00427B45 |. 8BEC mov ebp, esp 保存ebp 指针,传输esp给ebp用于堆栈操作
00427B47 |. 6A 00 push 0
00427B49 |. 6A 00 push 0
00427B4B |. 53 push ebx
00427B4C |. 8BD8 mov ebx, eax
00427B4E |. 33C0 xor eax, eax
00427B50 |. 55 push ebp
00427B51 |. 68 FA7B4200 push 00427BFA
00427B56 |. 64:FF30 push dword ptr fs:[eax]
00427B59 |. 64:8920 mov dword ptr fs:[eax], esp
00427B5C |. 8D55 FC lea edx, dword ptr [ebp-4]
00427B5F |. 8B83 DC010000 mov eax, dword ptr [ebx+1DC]
00427B65 |. E8 26E2FEFF call 00415D90
00427B6A |. 8B45 FC mov eax, dword ptr [ebp-4] 将你输入的用户名传给eax,这里是:cracker
00427B6D |. E8 3EBCFDFF call 004037B0 初步断定为关键,F7跟进
004037B0 /$ 85C0 test eax, eax 测试eax是否为空
004037B2 |. 74 03 je short 004037B7 如果空则跳转
004037B4 |. 8B40 FC mov eax, dword ptr [eax-4] 用户名字符数送eax
004037B7 \> C3 retn 返回
00427B72 |. 48 dec eax eax 减一
00427B73 |. 7C 30 jl short 00427BA5 这里跳转则完蛋
00427B75 |. 8D55 FC lea edx, dword ptr [ebp-4]
00427B78 |. 8B83 EC010000 mov eax, dword ptr [ebx+1EC]
00427B7E |. E8 0DE2FEFF call 00415D90 F7跟进
00427B83 |. 8B45 FC mov eax, dword ptr [ebp-4] 注册码送eax
00427B86 |. 50 push eax
00427B87 |. 8D55 F8 lea edx, dword ptr [ebp-8]
00427B8A |. 8B83 DC010000 mov eax, dword ptr [ebx+1DC]
00427B90 |. E8 FBE1FEFF call 00415D90
00427B95 |. 8B45 F8 mov eax, dword ptr [ebp-8] 用户名送eax
00427B98 |. 5A pop edx 注册码送edx
00427B99 |. E8 82FEFFFF call 00427A20 注册码在此生成。 关键 F7跟进 代码如下
00427A20 /$ 55 push ebp
00427A21 |. 8BEC mov ebp, esp
00427A23 |. 83C4 F0 add esp, -10 堆栈操作,预留0x10个堆栈
00427A26 |. 53 push ebx
00427A27 |. 56 push esi
00427A28 |. 33C9 xor ecx, ecx
00427A2A |. 894D F0 mov dword ptr [ebp-10], ecx
00427A2D |. 894D F4 mov dword ptr [ebp-C], ecx
00427A30 |. 8955 F8 mov dword ptr [ebp-8], edx edx为注册码
00427A33 |. 8945 FC mov dword ptr [ebp-4], eax eax用户名
00427A36 |. 8B45 FC mov eax, dword ptr [ebp-4]
00427A39 |. E8 26BFFDFF call 00403964 测试用户名是否为空
00427A3E |. 8B45 F8 mov eax, dword ptr [ebp-8]
00427A41 |. E8 1EBFFDFF call 00403964 测试注册码是否为空
00427A46 |. 33C0 xor eax, eax
00427A48 |. 55 push ebp
00427A49 |. 68 2A7B4200 push 00427B2A
00427A4E |. 64:FF30 push dword ptr fs:[eax]
00427A51 |. 64:8920 mov dword ptr fs:[eax], esp
00427A54 |. 33DB xor ebx, ebx
00427A56 |. 8B45 FC mov eax, dword ptr [ebp-4]
00427A59 |. E8 52BDFDFF call 004037B0
00427A5E |. 8BF0 mov esi, eax
00427A60 |. 85F6 test esi, esi
00427A62 |. 7E 3C jle short 00427AA0
00427A64 |. B8 01000000 mov eax, 1
00427A69 |> 8BD0 /mov edx, eax
00427A6B |. 8B4D FC |mov ecx, dword ptr [ebp-4] 将用户名送ecx
00427A6E |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] 将用户名从左到右按字节取出放ecx运算
00427A73 |. 03D9 |add ebx, ecx ebx 初值为0
00427A75 |. 71 05 |jno short 00427A7C 如果不溢出就跳
00427A77 |. E8 B4AFFDFF |call 00402A30
00427A7C |> C1E3 08 |shl ebx, 8 ebx逻辑左移8位
00427A7F |. 8B0D 80884200 |mov ecx, dword ptr [428880] ; echap515.004279FC 将字串地址东ecx
ds:[00428880]=004279FC (echap515.004279FC), ASCII "LANNYDIBANDINGINANAKEKHYANGNGENTOT"
ecx=00000063
00427A85 |. 0FB65411 FF |movzx edx, byte ptr [ecx+edx-1] 依次取上面的ADSCII字串的一字节: 首次为L
00427A8A |. 0BDA |or ebx, edx 或运算
00427A8C |. 85DB |test ebx, ebx 测试ebx是否为0
00427A8E |. 7D 0C |jge short 00427A9C 如果大于等于则跳
00427A90 |. 6BD3 FF |imul edx, ebx, -1
00427A93 |. 71 05 |jno short 00427A9A
00427A95 |. E8 96AFFDFF |call 00402A30
00427A9A |> 8BDA |mov ebx, edx
00427A9C |> 40 |inc eax eax+1以便取下一字符
00427A9D |. 4E |dec esi 堆栈指针减1
00427A9E |.^ 75 C9 \jnz short 00427A69
00427AA0 |> 81F3 78563412 xor ebx, 12345678 ebx的值和12345678异或运算 运算前ebx的值:1DBEB649
00427AA6 |. 8D55 F0 lea edx, dword ptr [ebp-10]
00427AA9 |. 8BC3 mov eax, ebx ebx 0F8AE031
00427AAB |. E8 44E9FDFF call 004063F4 F7跟进
004063F4 /$ 83C4 F8 add esp, -8
004063F7 |. 6A 00 push 0 ; /Arg1 = 00000000
004063F9 |. 894424 04 mov dword ptr [esp+4], eax ; | 0F8AE031送入堆栈
004063FD |. C64424 08 00 mov byte ptr [esp+8], 0 ; |
00406402 |. 8D4C24 04 lea ecx, dword ptr [esp+4] ; |
00406406 |. 8BC2 mov eax, edx ; |
00406408 |. BA 20644000 mov edx, 00406420 ; |ASCII "%d"
0040640D |. E8 42080000 call 00406C54 ; \echap515.00406C54
00406412 |. 59 pop ecx
00406413 |. 5A pop edx
00406414 \. C3 retn 转换为D%
堆栈地址=0012E94A, (ASCII "260759601")
edx=00001001
跳转来自 00406CC1
00427AB0 |. 8B45 F0 mov eax, dword ptr [ebp-10] 将转换后得的数据送eax
00427AB3 |. E8 F8BCFDFF call 004037B0
00427AB8 |. 8BF0 mov esi, eax
00427ABA |. 85F6 test esi, esi
00427ABC |. 7E 38 jle short 00427AF6
00427ABE |> 8BC3 /mov eax, ebx 0F8AE031 送eax
00427AC0 |. B9 0A000000 |mov ecx, 0A 0A送ecx
00427AC5 |. 99 |cdq 双字节转换为四字EDX: EAX
00427AC6 |. F7F9 |idiv ecx edx:eax/ecx 的商存Eax中, 余数存EDX中
00427AC8 |. 6215 3C7B4200 |bound edx, qword ptr [427B3C]
00427ACE |. 8A92 84884200 |mov dl, byte ptr [edx+428884] ;00428885 41 4E 4E 59 35 36 34 36 35 32 31 00 8D 40 00 D4 ANNY5646521.岪.送dl
00427AD4 |. 8D45 F0 |lea eax, dword ptr [ebp-10]
00427AD7 |. E8 FCBBFDFF |call 004036D8
00427ADC |. 8B55 F0 |mov edx, dword ptr [ebp-10]
00427ADF |. 8D45 F4 |lea eax, dword ptr [ebp-C]
00427AE2 |. E8 D1BCFDFF |call 004037B8
00427AE7 |. 8BC3 |mov eax, ebx
00427AE9 |. B9 0A000000 |mov ecx, 0A 同上
00427AEE |. 99 |cdq
00427AEF |. F7F9 |idiv ecx
00427AF1 |. 8BD8 |mov ebx, eax
00427AF3 |. 4E |dec esi
00427AF4 |.^ 75 C8 \jnz short 00427ABE
00427AF6 |> 8B45 F4 mov eax, dword ptr [ebp-C]
堆栈 ss:[0012F984]=00D259A8, (ASCII "AL6554L6N") 经过计算得到的注册码,到此此程序应该被破
eax=00000000
跳转来自 00427ABC
00427AF9 |. 8B55 F8 mov edx, dword ptr [ebp-8]
00427AFC |. E8 BFBDFDFF call 004038C0
00427B01 |. 75 07 jnz short 00427B0A
00427B03 |. BB 4E61BC00 mov ebx, 0BC614E
00427B08 |. EB 05 jmp short 00427B0F
00427B0A |> BB 91D61200 mov ebx, 12D691
00427B0F |> 33C0 xor eax, eax
00427B11 |. 5A pop edx
00427B12 |. 59 pop ecx
00427B13 |. 59 pop ecx
00427B14 |. 64:8910 mov dword ptr fs:[eax], edx
00427B17 |. 68 317B4200 push 00427B31
00427B1C |> 8D45 F0 lea eax, dword ptr [ebp-10]
00427B1F |. BA 04000000 mov edx, 4
00427B24 |. E8 2FBAFDFF call 00403558
00427B29 \. C3 retn
00427B9E |. 3D 4E61BC00 cmp eax, 0BC614E 比较,如果大于等于则注册成功,否则失败
00427BA3 |. 7D 1E jge short 00427BC3
00427BA5 |> 6A 00 push 0
00427BA7 |. 68 087C4200 push 00427C08 ; ASCII "ERROR"
00427BAC |. 68 107C4200 push 00427C10 ; ASCII "Wrong Serial Number !"
00427BB1 |. A1 44974200 mov eax, dword ptr [429744]
00427BB6 |. E8 411EFFFF call 004199FC
00427BBB |. 50 push eax ; |hOwner
00427BBC |. E8 4FD9FDFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00427BC1 |. EB 1C jmp short 00427BDF
00427BC3 |> 6A 00 push 0
00427BC5 |. 68 287C4200 push 00427C28 ; ASCII "Success"
00427BCA |. 68 307C4200 push 00427C30 ; ASCII "Congratulation ! You've Did It.",CR,"Mail Us : ekhmail@egroups.com"
00427BCF |. A1 44974200 mov eax, dword ptr [429744]
00427BD4 |. E8 231EFFFF call 004199FC
00427BD9 |. 50 push eax ; |hOwner
00427BDA |. E8 31D9FDFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00427BDF |> 33C0 xor eax, eax
00427BE1 |. 5A pop edx
00427BE2 |. 59 pop ecx
00427BE3 |. 59 pop ecx
00427BE4 |. 64:8910 mov dword ptr fs:[eax], edx
00427BE7 |. 68 017C4200 push 00427C01
00427BEC |> 8D45 F8 lea eax, dword ptr [ebp-8]
00427BEF |. BA 02000000 mov edx, 2
00427BF4 |. E8 5FB9FDFF call 00403558
00427BF9 \. C3 retn
在00427B44处F2 设断点: F9运行:
用户名输入:cracker
注册号输入:kanghtta
程序在00427B44处被断下,下面我们返回上面分析这段代码。
我们输入的用户名为: cracker
注册码为: AL6554L6N
堆栈 ss:[0012F984]=00D259A8, (ASCII "AL6554L6N")
eax=00000000
跳转来自 00427ABC
我们输入用户名为:kanghtta
注册码为:6A56LYYY5
堆栈 ss:[0012F984]=00D2599C, (ASCII "6A56LYYY5")
eax=00000000
跳转来自 00427ABC
在00427B99处下断点 ,F7跟进,F4运行到00427AF6 |> \8B45 F4 mov eax, dword ptr [ebp-C] 后
在信息窗口就能看到由机器算出的注册码.由于时间有限,这个算法,等以后有时间分析出在写出来.先到这吧:
以后随便输入用户名,, 例如,输入 用户名: GoodNight 按上述方法找到注册码:5L4A5YN6AA
堆栈 ss:[0012F984]=00D2599C, (ASCII "5L4A5YN6AA")
eax=00000000
跳转来自 00427ABC
哈哈,有点投机取巧,但由于刚开始学习,只要找到注册码就可以了吧! 该和大家说晚安了,
注:由于刚开始学习算法分析,对这个题目的算法多多少少还有些地方不明白,但时间有限,明天还有软件工程呢!
所以,我会抽时间多努力分析分析,希望我能尽快写出第一个注册机;
--------------------------------------------------------------------------------
【经验总结】
在分析算法的时候,由于很多函数调用都是 Call call 等等, 还是对我分析过程造成干扰,同时,通过这篇文章,也知
道,其实找到关键不难,但对关键点进行分析,也就是算法分析,才是破解的难点.
也不知道这样说对不对,但能够用计算机解决的问题,抽象度在高 ,也有解法.
希望自己能在这星期内分析好这篇文章的算法,并尝试着写写注册机,毕竟感觉这样得出的注册码,不算真正的掌握算法.
望看雪的大哥们莫取笑,小弟不过菜鸟一只,也刚刚开始练习破文.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年03月30日 下午 10:10:50
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!