【目标】ADSL密码终结者脱壳+自效验+追码
【工具】OD1.10+PEID
【下载地址】
http://down.qiannao.com/space/file/323186/share/2011/8/25/adsl.rar/.page
【简要说明】第一次写东西 如有什么不足之处,请多指教
【详细过程】
----------------------------脱壳---------------------------
使用PEID查壳发现使用的是ASPack2.12壳 用OD载入 在0051D002处使用ESP定律下硬件访问断点 F9之后来到 0051D3B0
0051D3B0 /75 08 jnz short adsl.0051D3BA
0051D3B2 |B8 01000000 mov eax,1
0051D3B7 |C2 0C00 retn 0C
0051D3BA \68 CCDC4E00 push adsl.004EDCCC
0051D3BF C3 retn 传说中的光明之巅
0051D3C0 8B85 26040000 mov eax,dword ptr ss:[ebp+426]
来到004EDCCC 看入口点这个程序应该是Delphi程序
先别急着关掉 后面有用
--------------------------自效验---------------------------
打开脱壳后的文件发现程序无法运行看来是遇到自效验了 同时载入两个EXE 单步跟踪到如下位置
004EDDC9 . 8B15 0C304F00 mov edx,dword ptr ds:[4F300C]
004EDDCF . 8B52 04 mov edx,dword ptr ds:[edx+4]
004EDDD2 . E8 6169F1FF call dump.00404738
004EDDD7 . 74 0A je short dump.004EDDE3 关键跳修改为jmp就可以了
004EDDD9 . E8 965FF1FF call dump.00403D74
004EDDDE . E9 82000000 jmp dump.004EDE65
004EDDE3 > 33C0 xor eax,eax
004EDDE5 . 5A pop edx
004EDDE6 . 59 pop ecx
-----------------------------追码---------------------------
好 脱壳 自效验解决之后开始进入追码
首先我们看一下错误的注册信息
“请填入有效的注册码”
由于MessageBoxA断点下不下来 所以我们查找ASCII 列表的最下面有我们需要的东西
双击“请填入有效的注册码”我们来到004ECEBC 我们直接在段首下断点004ECE8B
F9运行 随便输入点东西我们来到
004ECE8B . 53 push ebx
段首
004ECE8C . 8BD8 mov ebx,eax
004ECE8E . 33C0 xor eax,eax
004ECE90 . 55 push ebp
004ECE91 . 68 2ED04E00 push dump1.004ED02E
004ECE96 . 64:FF30 push dword ptr fs:[eax]
004ECE99 . 64:8920 mov dword ptr fs:[eax],esp
004ECE9C . 8D55 F4 lea edx,dword ptr ss:[ebp-C]
004ECE9F . 8B83 0C030000 mov eax,dword ptr ds:[ebx+30C]
004ECEA5 . E8 1A70F7FF call dump1.00463EC4
取得注册码长度
004ECEAA . 8B45 F4 mov eax,dword ptr ss:[ebp-C]
取得注册码
004ECEAD . E8 3A77F1FF call dump1.004045EC
004ECEB2 . 83F8 10 cmp eax,10
长度是否等于16
004ECEB5 . 74 14 je short dump1.004ECECB
等于则跳,不等则挂
004ECEB7 . E8 9407F2FF call dump1.0040D650
004ECEBC . B8 44D04E00 mov eax,dump1.004ED044
004ECEC1 . E8 9EA2F4FF call dump1.00437164
004ECEC6 . E9 38010000 jmp dump1.004ED003
跳转后来到
004ECECB > \33C9 xor ecx,ecx
004ECECD . B2 01 mov dl,1
004ECECF . A1 CCBB4100 mov eax,dword ptr ds:[41BBCC]
004ECED4 . E8 4740F3FF call dump1.00420F20
004ECED9 . 8945 FC mov dword ptr ss:[ebp-4],eax
004ECEDC . 8D55 EC lea edx,dword ptr ss:[ebp-14]
004ECEDF . A1 E4114F00 mov eax,dword ptr ds:[4F11E4]
004ECEE4 . 8B00 mov eax,dword ptr ds:[eax]
004ECEE6 . E8 5172F9FF call dump1.0048413C
取得程序运行目录
004ECEEB . 8B45 EC mov eax,dword ptr ss:[ebp-14]
004ECEEE . 8D55 F0 lea edx,dword ptr ss:[ebp-10]
004ECEF1 . E8 0EC6F1FF call dump1.00409504
004ECEF6 . 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004ECEF9 . BA 60D04E00 mov edx,dump1.004ED060 ; ASCII "licence.dat"
004ECEFE . E8 F176F1FF call dump1.004045F4
载入程序运行目录的DAT
004ECF03 . 8B45 F0 mov eax,dword ptr ss:[ebp-10]
004ECF06 . E8 69C5F1FF call dump1.00409474
004ECF0B . 84C0 test al,al
判断文件是否存在 存在为1 不存在为0
004ECF0D . 75 40 jnz short dump1.004ECF4F
存在则跳 不存在则创建 我们自己创建一个
创建之后来到
004ECF4F > \6A 42 push 42
004ECF51 . 8D55 DC lea edx,dword ptr ss:[ebp-24]
004ECF54 . A1 E4114F00 mov eax,dword ptr ds:[4F11E4]
004ECF59 . 8B00 mov eax,dword ptr ds:[eax]
004ECF5B . E8 DC71F9FF call dump1.0048413C
004ECF60 . 8B45 DC mov eax,dword ptr ss:[ebp-24]
004ECF63 . 8D55 E0 lea edx,dword ptr ss:[ebp-20]
004ECF66 . E8 99C5F1FF call dump1.00409504
004ECF6B . 8D45 E0 lea eax,dword ptr ss:[ebp-20]
004ECF6E . BA 60D04E00 mov edx,dump1.004ED060 ; ASCII "licence.dat"
004ECF73 . E8 7C76F1FF call dump1.004045F4
读取licence.dat
004ECF78 . 8B4D E0 mov ecx,dword ptr ss:[ebp-20] ; |
004ECF7B . B2 01 mov dl,1 ; |
004ECF7D . A1 60BA4100 mov eax,dword ptr ds:[41BA60] ; |
004ECF82 . E8 693BF3FF call dump1.00420AF0 ; \dump1.00420AF0
004ECF87 . 8945 F8 mov dword ptr ss:[ebp-8],eax
004ECF8A > 33C0 xor eax,eax
004ECF8C . 55 push ebp
004ECF8D . 68 EDCF4E00 push dump1.004ECFED
004ECF92 . 64:FF30 push dword ptr fs:[eax]
004ECF95 . 64:8920 mov dword ptr fs:[eax],esp
004ECF98 . 8D55 D8 lea edx,dword ptr ss:[ebp-28]
004ECF9B . 8B83 0C030000 mov eax,dword ptr ds:[ebx+30C]
004ECFA1 . E8 1E6FF7FF call dump1.00463EC4
取出licence.dat文件内容
004ECFA6 . 8B55 D8 mov edx,dword ptr ss:[ebp-28]
004ECFA9 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004ECFAC . E8 8340F3FF call dump1.00421034
004ECFB1 . 6A 00 push 0
004ECFB3 . 6A 00 push 0
004ECFB5 . 8B55 FC mov edx,dword ptr ss:[ebp-4]
004ECFB8 . 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004ECFBB . E8 B438F3FF call dump1.00420874
004ECFC0 . E8 8B06F2FF call dump1.0040D650
004ECFC5 . B8 74D04E00 mov eax,dump1.004ED074
004ECFCA . E8 95A1F4FF call dump1.00437164
提示说需要重新运行程序来验证注册码
004ECFCF . 33C0 xor eax,eax
004ECFD1 . 5A pop edx
004ECFD2 . 59 pop ecx
004ECFD3 . 59 pop ecx
现在我们发现这个程序需要重新运行才能够验证注册码,也就是说在下一次打开程序的时候才开始验证注册码,我们现在找不到他的注册算法,所以我们在重新看一下ASCII 在“注册码已经保存,请重新打开程序以验证注册码是否有效”下面我们发现 有一个OPEN指令 ,我感觉可能是从这里开始验证注册码 我们双击第一个licence.dat 来到004ED48D
004ED464 . 55 push ebp
004ED465 . 68 F7D54E00 push dump1.004ED5F7
004ED46A . 64:FF30 push dword ptr fs:[eax]
004ED46D . 64:8920 mov dword ptr fs:[eax],esp
004ED470 . 8D55 DC lea edx,dword ptr ss:[ebp-24]
004ED473 . A1 E4114F00 mov eax,dword ptr ds:[4F11E4]
004ED478 . 8B00 mov eax,dword ptr ds:[eax]
004ED47A . E8 BD6CF9FF call dump1.0048413C
004ED47F . 8B45 DC mov eax,dword ptr ss:[ebp-24]
004ED482 . 8D55 E0 lea edx,dword ptr ss:[ebp-20]
004ED485 . E8 7AC0F1FF call dump1.00409504
取得程序运行目录
004ED48A . 8D45 E0 lea eax,dword ptr ss:[ebp-20]
004ED48D . BA 10D64E00 mov edx,dump1.004ED610 ; ASCII "licence.dat"
004ED492 . E8 5D71F1FF call dump1.004045F4
载入DAT
004ED497 . 8B45 E0 mov eax,dword ptr ss:[ebp-20]
004ED49A . E8 D5BFF1FF call dump1.00409474
004ED49F . 84C0 test al,al
判断文件是否存在
004ED4A1 . 75 09 jnz short dump1.004ED4AC
存在则跳 不存在则不跳
跳转来到
004ED4AC > \8D55 CC lea edx,dword ptr ss:[ebp-34]
慢慢往下跟来到
004ED589 . 6A 00 push 0
004ED58B . 6A 00 push 0
004ED58D . 8B55 F8 mov edx,dword ptr ss:[ebp-8]
004ED590 . 8B45 F4 mov eax,dword ptr ss:[ebp-C]
004ED593 . E8 DC32F3FF call dump1.00420874
004ED598 . 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
这里可以直接取出正确的注册码
004ED59B . 8B55 F4 mov edx,dword ptr ss:[ebp-C]
004ED59E . 8B52 04 mov edx,dword ptr ds:[edx+4]
取出licence.dat里的注册码
004ED5A1 . E8 9271F1FF call dump1.00404738
对两个注册码进行比较
004ED5A6 . 0F9445 FF sete byte ptr ss:[ebp-1]
004ED5AA . 33C0 xor eax,eax
由于我的能力实在是有限 刚学逆向调试1个星期看这些代码我就已经很累了 写的比较乱 请多包涵
希望版主大大给个邀请码
[课程]Linux pwn 探索篇!