【破解作者】 lee
【作者邮箱】 cracker_lee@126.com
【使用工具】 OD,PEID,IDA,DEDE
【破解平台】 WinXP
【软件名称】 移盘检索精灵 2.2
【软件简介】 您是否碰到过这样的情况:手头拥有一批存有资料(如软件)的CD光盘、软磁盘、或其它移动存储设备,却常常因想不起你需要的某个软件或文件究竟存在于哪一个移动存储盘而不得不一一将它们放入电脑,逐一查看?
使用“移盘检索精灵”,您可以在您的计算机本地磁盘上为您的每一个移动盘创建一个本地快照,这样,当您查找资料、 查阅你的任何一张移动存储设备上的内容时,你无需再取出这些移动盘,一一寻找,而只需直接查阅它们的快照这可行了!
【软件大小】 997 KB
【加壳方式】 无
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
----------------------------------------------------------------------
【破解内容】
peid查知道该软件无壳Delphi编写,先用DEDE分析,然后OD载入:
004D67DC /. 55 push ebp
004D67DD |. 8BEC mov ebp,esp
004D67DF |. 33C9 xor ecx,ecx
004D67E1 |. 51 push ecx
004D67E2 |. 51 push ecx
004D67E3 |. 51 push ecx
004D67E4 |. 51 push ecx
004D67E5 |. 51 push ecx
004D67E6 |. 51 push ecx
004D67E7 |. 51 push ecx
004D67E8 |. 51 push ecx
004D67E9 |. 53 push ebx
004D67EA |. 8BD8 mov ebx,eax
004D67EC |. 33C0 xor eax,eax
004D67EE |. 55 push ebp
004D67EF |. 68 E6694D00 push CDSnapsh.004D69E6
004D67F4 |. 64:FF30 push dword ptr fs:[eax]
004D67F7 |. 64:8920 mov dword ptr fs:[eax],esp
004D67FA |. 8D55 FC lea edx,dword ptr ss:[ebp-4]
004D67FD |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D6803 |. E8 B88CF9FF call CDSnapsh.0046F4C0 ; GetText
004D6808 |. 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 取到位数
004D680B |. E8 B4DDF2FF call CDSnapsh.004045C4
004D6810 |. 83F8 08 cmp eax,8
004D6813 |. 74 3F je short CDSnapsh.004D6854 ; 判断是否为8位,如果是的话,就跳到后面执行,否则提示注册失败错误。
004D6815 |. 6A 10 push 10
004D6817 |. 8D55 F8 lea edx,dword ptr ss:[ebp-8]
004D681A |. A1 94104E00 mov eax,dword ptr ds:[4E1094]
004D681F |. 8B00 mov eax,dword ptr ds:[eax]
004D6821 |. E8 6A87FBFF call CDSnapsh.0048EF90
004D6826 |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004D6829 |. E8 96DFF2FF call CDSnapsh.004047C4
004D682E |. 50 push eax
004D682F |. 68 F4694D00 push CDSnapsh.004D69F4
004D6834 |. 8BC3 mov eax,ebx
004D6836 |. E8 81F5F9FF call CDSnapsh.00475DBC
004D683B |. 50 push eax ; |hOwner
004D683C |. E8 A70BF3FF call <jmp.&user32.MessageBoxA> ; \这里会提示注册码错误
004D6841 |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D6847 |. 8B10 mov edx,dword ptr ds:[eax]
004D6849 |. FF92 C40000>call dword ptr ds:[edx+C4]
004D684F |. E9 4A010000 jmp CDSnapsh.004D699E
004D6854 |> 8D55 F4 lea edx,dword ptr ss:[ebp-C]
004D6857 |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D685D |. E8 5E8CF9FF call CDSnapsh.0046F4C0 ; GetText(TControl):TCaption;
004D6862 |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
004D6865 |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D686A |. 8B00 mov eax,dword ptr ds:[eax]
004D686C |. E8 3F480000 call CDSnapsh.004DB0B0 ; 关键CALL
004D6871 |. 84C0 test al,al
004D6873 |. 0F84 EB0000>je CDSnapsh.004D6964
004D6879 |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D687E |. 8B00 mov eax,dword ptr ds:[eax]
004D6880 |. 8B80 4C0300>mov eax,dword ptr ds:[eax+34C]
004D6886 |. E8 999CFEFF call CDSnapsh.004C0524 ; * Reference to: DB.TDataSet.Close(TDataSet);
004D688B |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D6890 |. 8B00 mov eax,dword ptr ds:[eax]
004D6892 |. 8B80 4C0300>mov eax,dword ptr ds:[eax+34C]
004D6898 |. E8 9BE2FFFF call CDSnapsh.004D4B38
004D689D |. 8B10 mov edx,dword ptr ds:[eax]
004D689F |. FF52 44 call dword ptr ds:[edx+44]
004D68A2 |. 68 0C6A4D00 push CDSnapsh.004D6A0C ; ASCII "Insert into Config(REGCODE) Values('"
004D68A7 |. 8D55 EC lea edx,dword ptr ss:[ebp-14]
004D68AA |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D68B0 |. E8 0B8CF9FF call CDSnapsh.0046F4C0
004D68B5 |. FF75 EC push dword ptr ss:[ebp-14]
004D68B8 |. 68 3C6A4D00 push CDSnapsh.004D6A3C ; ASCII "')"
004D68BD |. 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004D68C0 |. BA 03000000 mov edx,3
004D68C5 |. E8 BADDF2FF call CDSnapsh.00404684 ; * Reference to: System.@LStrCatN;
004D68CA |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]
004D68CD |. 50 push eax
004D68CE |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D68D3 |. 8B00 mov eax,dword ptr ds:[eax]
004D68D5 |. 8B80 4C0300>mov eax,dword ptr ds:[eax+34C]
004D68DB |. E8 58E2FFFF call CDSnapsh.004D4B38 ; SQL
004D68E0 |. 5A pop edx
004D68E1 |. 8B08 mov ecx,dword ptr ds:[eax]
004D68E3 |. FF51 38 call dword ptr ds:[ecx+38]
004D68E6 |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D68EB |. 8B00 mov eax,dword ptr ds:[eax]
004D68ED |. 8B80 4C0300>mov eax,dword ptr ds:[eax+34C]
004D68F3 |. E8 68E1FFFF call CDSnapsh.004D4A60 ; EXESQL
004D68F8 |. 8D55 E8 lea edx,dword ptr ss:[ebp-18]
004D68FB |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D6901 |. E8 BA8BF9FF call CDSnapsh.0046F4C0 ; * Reference to: Controls.TControl.GetText(TControl):TCaption;
004D6906 |. 8B55 E8 mov edx,dword ptr ss:[ebp-18]
004D6909 |. A1 300D4E00 mov eax,dword ptr ds:[4E0D30]
004D690E |. E8 45DAF2FF call CDSnapsh.00404358 ; * Reference to: System.@LStrAsg(void;void;void;void);
004D6913 |. 6A 40 push 40
004D6915 |. 8D55 E4 lea edx,dword ptr ss:[ebp-1C]
004D6918 |. A1 94104E00 mov eax,dword ptr ds:[4E1094]
004D691D |. 8B00 mov eax,dword ptr ds:[eax]
004D691F |. E8 6C86FBFF call CDSnapsh.0048EF90 ; * Reference to: Forms.TApplication.GetTitle(TApplication):AnsiString;
004D6924 |. 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
004D6927 |. E8 98DEF2FF call CDSnapsh.004047C4 ; * Reference to: System.@LStrToPChar(String):PAnsiChar;
004D692C |. 50 push eax
004D692D |. 68 406A4D00 push CDSnapsh.004D6A40
004D6932 |. 8BC3 mov eax,ebx
004D6934 |. E8 83F4F9FF call CDSnapsh.00475DBC
004D6939 |. 50 push eax ; |hOwner
004D693A |. E8 A90AF3FF call <jmp.&user32.MessageBoxA> ; \MessageBoxA注册成功
004D693F |. A1 28124E00 mov eax,dword ptr ds:[4E1228]
004D6944 |. C600 01 mov byte ptr ds:[eax],1
004D6947 |. A1 440F4E00 mov eax,dword ptr ds:[4E0F44]
004D694C |. 8B00 mov eax,dword ptr ds:[eax]
004D694E |. 8B80 940300>mov eax,dword ptr ds:[eax+394]
004D6954 |. 33D2 xor edx,edx
004D6956 |. E8 858AF9FF call CDSnapsh.0046F3E0
004D695B |. 8BC3 mov eax,ebx
004D695D |. E8 6253FBFF call CDSnapsh.0048BCC4
004D6962 |. EB 3A jmp short CDSnapsh.004D699E
004D6964 |> 6A 10 push 10
004D6966 |. 8D55 E0 lea edx,dword ptr ss:[ebp-20]
004D6969 |. A1 94104E00 mov eax,dword ptr ds:[4E1094]
004D696E |. 8B00 mov eax,dword ptr ds:[eax]
004D6970 |. E8 1B86FBFF call CDSnapsh.0048EF90 ; * Reference to: Forms.TApplication.GetTitle(TApplication):AnsiString;
004D6975 |. 8B45 E0 mov eax,dword ptr ss:[ebp-20]
004D6978 |. E8 47DEF2FF call CDSnapsh.004047C4 ; * Reference to: System.@LStrToPChar(String):PAnsiChar;
004D697D |. 50 push eax
004D697E |. 68 F4694D00 push CDSnapsh.004D69F4
004D6983 |. 8BC3 mov eax,ebx
004D6985 |. E8 32F4F9FF call CDSnapsh.00475DBC
004D698A |. 50 push eax ; |hOwner
004D698B |. E8 580AF3FF call <jmp.&user32.MessageBoxA> ; \MessageBoxA注册失败
004D6990 |. 8B83 740300>mov eax,dword ptr ds:[ebx+374]
004D6996 |. 8B10 mov edx,dword ptr ds:[eax]
004D6998 |. FF92 C40000>call dword ptr ds:[edx+C4]
-----------------------------------------------------------
关键CALL如下:
首先从后面向前找,发现返回值EAX是由EBX传来的,而当中会有一个比较用来决定是否将EBX清零。
004DB0B0 $ 55 push ebp
004DB0B1 . 8BEC mov ebp,esp
004DB0B3 . 33C9 xor ecx,ecx
004DB0B5 . 51 push ecx
004DB0B6 . 51 push ecx
004DB0B7 . 51 push ecx
004DB0B8 . 51 push ecx
004DB0B9 . 51 push ecx
004DB0BA . 51 push ecx
004DB0BB . 53 push ebx
004DB0BC . 56 push esi
004DB0BD . 57 push edi
004DB0BE . 8955 FC mov dword ptr ss:[ebp-4],edx
004DB0C1 . 8BD8 mov ebx,eax
004DB0C3 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004DB0C6 . E8 E996F2FF call CDSnapsh.004047B4 ; * Reference to: System.@LStrAddRef(void;void):Pointer;
004DB0CB . 33C0 xor eax,eax
004DB0CD . 55 push ebp
004DB0CE . 68 DDB14D00 push CDSnapsh.004DB1DD
004DB0D3 . 64:FF30 push dword ptr fs:[eax]
004DB0D6 . 64:8920 mov dword ptr fs:[eax],esp
004DB0D9 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004DB0DC . E8 E394F2FF call CDSnapsh.004045C4 ; @LStrLen(String):Integer;
004DB0E1 . 83F8 05 cmp eax,5 ; 首先取到假注册码的长度,不能小于5位否则就
004DB0E4 . 7D 07 jge short CDSnapsh.004DB0ED
004DB0E6 . 33DB xor ebx,ebx
004DB0E8 . E9 D5000000 jmp CDSnapsh.004DB1C2
004DB0ED > 33D2 xor edx,edx
004DB0EF . 55 push ebp
004DB0F0 . 68 AAB14D00 push CDSnapsh.004DB1AA
004DB0F5 . 64:FF32 push dword ptr fs:[edx] ; TRY
004DB0F8 . 64:8922 mov dword ptr fs:[edx],esp
004DB0FB . 8D45 F8 lea eax,dword ptr ss:[ebp-8]
004DB0FE . 50 push eax
004DB0FF . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004DB102 . E8 BD94F2FF call CDSnapsh.004045C4 ; * Reference to: System.@LStrLen(String):Integer;
004DB107 . 8BC8 mov ecx,eax ; 取假注册码的长度
004DB109 . 83E9 04 sub ecx,4 ; 长度减去四
004DB10C . BA 03000000 mov edx,3
004DB111 . 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 将假注册码在放入EAX
004DB114 . E8 0B97F2FF call CDSnapsh.00404824 ; * Reference to: System.@LStrCopy;
004DB119 . 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 取假注册码当中四个
004DB11C . E8 0FDFF2FF call CDSnapsh.00409030 ; StrToInt(AnsiString):Integer;
004DB121 . 8BF0 mov esi,eax ; 转为整数16C6
004DB123 . 8D45 F4 lea eax,dword ptr ss:[ebp-C]
004DB126 . 50 push eax
004DB127 . 8B83 140400>mov eax,dword ptr ds:[ebx+414] ; 机器码
004DB12D . B9 08000000 mov ecx,8
004DB132 . BA 05000000 mov edx,5
004DB137 . E8 E896F2FF call CDSnapsh.00404824 ; * Reference to: System.@LStrCopy;
004DB13C . 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 取机器码到后5位
004DB13F . E8 ECDEF2FF call CDSnapsh.00409030 ; StrToInt(AnsiString):Integer;
004DB144 . 8BD8 mov ebx,eax ; 整数为556E
004DB146 . B9 4BC70700 mov ecx,7C74B ; 取到常数7C74B
004DB14B . 8BD6 mov edx,esi
004DB14D . 8BC3 mov eax,ebx
004DB14F . E8 B0FEFFFF call CDSnapsh.004DB004 ; 这个CALL用来计算~~~~~~~~~~~~~~~~~~~~~~~~
004DB154 . 52 push edx
004DB155 . 50 push eax
004DB156 . 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004DB159 . 50 push eax
004DB15A . 8D45 EC lea eax,dword ptr ss:[ebp-14]
004DB15D . E8 0EFFFFFF call CDSnapsh.004DB070 ; 这个CALL后
004DB162 . 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 1109277295,整形转为字符结果为12F218
004DB165 . E8 5A94F2FF call CDSnapsh.004045C4 ; @LStrLen(String):Integer;
004DB16A . 83E8 03 sub eax,3 ; 取上面的长度10,然后减去3,等于7
004DB16D . 50 push eax ; 用于后面从第7位开始截取
004DB16E . 8D45 E8 lea eax,dword ptr ss:[ebp-18]
004DB171 . E8 FAFEFFFF call CDSnapsh.004DB070 ; GetVolumInforma
004DB176 . 8B45 E8 mov eax,dword ptr ss:[ebp-18]
004DB179 . B9 04000000 mov ecx,4
004DB17E . 5A pop edx
004DB17F . E8 A096F2FF call CDSnapsh.00404824 ; * Reference to: System.@LStrCopy;
004DB184 . 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 取后面的四位7295
004DB187 . E8 A4DEF2FF call CDSnapsh.00409030 ; StrToInt(AnsiString):Integer;
004DB18C . 99 cdq ; 返回为1C7F
004DB18D . 3B5424 04 cmp edx,dword ptr ss:[esp+4]
004DB191 . 75 03 jnz short CDSnapsh.004DB196
004DB193 . 3B0424 cmp eax,dword ptr ss:[esp] ; 关键比较,用上面计算的注册码与GetVolumInforma的后四位值比较
004DB196 > 5A pop edx ; 如果不相等会导致EBX=0,而返回值EAX是由EBX传过去
004DB197 . 58 pop eax
004DB198 75 04 jnz short CDSnapsh.004DB19E ; 关键比较
004DB19A . B3 01 mov bl,1
004DB19C . EB 02 jmp short CDSnapsh.004DB1A0
004DB19E > 33DB xor ebx,ebx ; 注意这里,如果前面不相等,会到这里将EBX清零
004DB1A0 > 33C0 xor eax,eax
004DB1A2 . 5A pop edx
004DB1A3 . 59 pop ecx
004DB1A4 . 59 pop ecx
004DB1A5 . 64:8910 mov dword ptr fs:[eax],edx
004DB1A8 . EB 18 jmp short CDSnapsh.004DB1C2 ; 这里要跳下去
004DB1AA .^ E9 F188F2FF jmp CDSnapsh.00403AA0 ; 这个里面是异常处理
004DB1AF 01 db 01
004DB1B0 00 db 00
004DB1B1 00 db 00
004DB1B2 00 db 00
004DB1B3 . 4C7C4000 dd CDSnapsh.00407C4C
004DB1B7 . BBB14D00 dd CDSnapsh.004DB1BB
004DB1BB . 33DB xor ebx,ebx
004DB1BD . E8 DE8BF2FF call CDSnapsh.00403DA0
004DB1C2 > 33C0 xor eax,eax
004DB1C4 . 5A pop edx
004DB1C5 . 59 pop ecx
004DB1C6 . 59 pop ecx
004DB1C7 . 64:8910 mov dword ptr fs:[eax],edx
004DB1CA . 68 E4B14D00 push CDSnapsh.004DB1E4
004DB1CF > 8D45 E8 lea eax,dword ptr ss:[ebp-18]
004DB1D2 . BA 06000000 mov edx,6
004DB1D7 . E8 4C91F2FF call CDSnapsh.00404328 ; @LStrArrayClr(void;void;Integer);
004DB1DC . C3 retn
004DB1DD .^ E9 468AF2FF jmp CDSnapsh.00403C28
004DB1E2 .^ EB EB jmp short CDSnapsh.004DB1CF
004DB1E4 . 8BC3 mov eax,ebx ; 返回值由EBX传来
004DB1E6 . 5F pop edi
004DB1E7 . 5E pop esi
004DB1E8 . 5B pop ebx
004DB1E9 . 8BE5 mov esp,ebp
004DB1EB . 5D pop ebp
004DB1EC . C3 retn
------------------------------------------------------------------
004DB14F call CDSnapsh.004DB004如下:
首先传进来的三个参数为:
假注册码的中间四位(固定为8位)、机器码的后面5位和常数7C74B
004DB004 /$ 53 push ebx
004DB005 |. 56 push esi
004DB006 |. 57 push edi
004DB007 |. 83C4 F8 add esp,-8
004DB00A |. 8BD9 mov ebx,ecx ; 常数保存到EBX
004DB00C |. 8BFA mov edi,edx ; 假注册码的值放入EDI
004DB00E |. 8BF0 mov esi,eax ; 机器码放入ESI
004DB010 |. 83FF 01 cmp edi,1
004DB013 |. 76 3C jbe short CDSnapsh.004DB051 ; 小于等于1才结束第一个CALL
004DB015 |. 8BC3 mov eax,ebx
004DB017 |. 33D2 xor edx,edx
004DB019 |. 52 push edx
004DB01A |. 50 push eax
004DB01B |. 8BC6 mov eax,esi
004DB01D |. 33D2 xor edx,edx
004DB01F |. F7F3 div ebx ; 机器码除常数
004DB021 |. 8BC2 mov eax,edx ; EDX放余数,EAX放商
004DB023 |. 33D2 xor edx,edx
004DB025 |. 52 push edx
004DB026 |. 50 push eax
004DB027 |. 8BC3 mov eax,ebx
004DB029 |. 33D2 xor edx,edx
004DB02B |. 52 push edx
004DB02C |. 50 push eax
004DB02D |. 8BD7 mov edx,edi
004DB02F |. 4A dec edx
004DB030 |. 8BCB mov ecx,ebx ; 减一16C5
004DB032 |. 8BC6 mov eax,esi
004DB034 |. E8 CBFFFFFF call CDSnapsh.004DB004 ; 第一个CALL执行完毕
004DB039 |. E8 0AA4F2FF call CDSnapsh.00405448 ; * Reference to: System.@_llmod;用机器码/常数=X1
004DB03E |. E8 65A3F2FF call CDSnapsh.004053A8 ; EAX回改变.@_llmul; X1*机器码=X2
004DB043 |. E8 00A4F2FF call CDSnapsh.00405448 ; * Reference to: System.@_llmod; X2/常数=X3
004DB048 |. 890424 mov dword ptr ss:[esp],eax
004DB04B |. 895424 04 mov dword ptr ss:[esp+4],edx
004DB04F |. EB 11 jmp short CDSnapsh.004DB062
004DB051 |> 8BC6 mov eax,esi
004DB053 |. 33D2 xor edx,edx
004DB055 |. F7F3 div ebx
004DB057 |. 8BC2 mov eax,edx
004DB059 |. 33D2 xor edx,edx
004DB05B |. 890424 mov dword ptr ss:[esp],eax
004DB05E |. 895424 04 mov dword ptr ss:[esp+4],edx
004DB062 |> 8B0424 mov eax,dword ptr ss:[esp]
004DB065 |. 8B5424 04 mov edx,dword ptr ss:[esp+4]
004DB069 |. 59 pop ecx
004DB06A |. 5A pop edx
004DB06B |. 5F pop edi
004DB06C |. 5E pop esi
004DB06D |. 5B pop ebx
004DB06E \. C3 retn X3为返回值
-------------------------------------------------------------------
总结一下:
系统首先回检测输入的长度是否是8位,
然后取假注册码的中间4位并转化为对应的整数,假设=EDX
在取机器码的最后5位并转化为对应的整数,假设=EAX
在取到常数7C74B,假设=ECX
接下来进行下面的运算://返回值为EAX
for(;EDX>=1;EDX--)
{EAX=EAX/ECX;}
EAX=EAX/ECX;//因为前面的判断条件是等于1
for(;EDX>=1;EDX--)//作者通过堆栈实现的。
{
EAX=EAX%ECX;
EAX=EAX*(机器码);
EAX=EAX%ECX;
}
接下来通过GetVolumInforma取到10位数,取后面的4位并转化为对应的整数,假设为TEMP
if(EAX!=TEMP)
回将EBX清零
else
将EBX低位置1
最后将EBX传给EAX,用来判断是否成功!!!
----------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)