PS:高手飘过吧!看了浪费你们的时间。
在分析一个数据库软件时,发现他的存储过程是加密的,烦呀。
急,于是在网上找了一个解密工具,
找到了,高兴中,要注册?一看是在线免费注册,又高兴了一把。
然后发觉,免费注册的网页跟本就打不开。
看来,又要自己动手了。
=======================================
SQL SERVER 存储过程解密工具 v6.0
软件描述:
专门针对SQL SERVER2000存储过程的一款解密软件
未注册限制:
只能解密1000个字符,要解密1000以上的,需要注册;
软件采用的是免费注册的方式,可是注册网页己经无法再打开了。
急用,没办法就。。。。。。。。。。。。。。。
老办法先查是否有壳,,,呵UPX壳,,,用 UPXSHELL 解压吧,
然后w32sm 反编译一下,查找 注册码不正确提示 的位置
很容易发现: 0048E1C1 je 0059E220 这一句, 跳就注册成功,不跳就注册失败。
现在用 OD 载入
直接转到 0048E1C1 这个地址,然后往上看看,将断点断在此段代码的开始位置 0048E17D
0048E17D |. 55 push ebp
0048E17E |. 68 0EE34800 push 0048E30E
0048E183 |. 64:FF30 push dword ptr fs:[eax]
0048E186 |. 64:8920 mov dword ptr fs:[eax], esp
0048E189 |. 8D55 FC lea edx, dword ptr [ebp-4]
0048E18C |. 8B83 64030000 mov eax, dword ptr [ebx+364]
0048E192 |. E8 61F0FAFF call 0043D1F8 ; 读出假注册码
0048E197 |. 8B45 FC mov eax, dword ptr [ebp-4]
0048E19A |. 50 push eax
0048E19B |. 8D55 F4 lea edx, dword ptr [ebp-C]
0048E19E |. 8B83 60030000 mov eax, dword ptr [ebx+360]
0048E1A4 |. E8 4FF0FAFF call 0043D1F8
0048E1A9 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0048E1AC |. 8D4D F8 lea ecx, dword ptr [ebp-8]
0048E1AF |. 66:BA BE07 mov dx, 7BE
0048E1B3 |. E8 78E0FFFF call 0048C230 ; F7跟进
0048E1B8 |. 8B55 F8 mov edx, dword ptr [ebp-8]
0048E1BB |. 58 pop eax
0048E1BC |. E8 4F67F7FF call 00404910
0048E1C1 |. 74 5D je short 0048E220 ; 跳就成功,不跳就弹出注册码不对;
------------------
0048E1B3 跟进到以下代码:
0048C230 /$ 55 push ebp
0048C231 |. 8BEC mov ebp, esp
0048C233 |. 83C4 F0 add esp, -10
0048C236 |. 53 push ebx
0048C237 |. 56 push esi
0048C238 |. 57 push edi
0048C239 |. 33DB xor ebx, ebx
0048C23B |. 895D F4 mov dword ptr [ebp-C], ebx
0048C23E |. 894D F8 mov dword ptr [ebp-8], ecx
0048C241 |. 8BF2 mov esi, edx
0048C243 |. 8945 FC mov dword ptr [ebp-4], eax
0048C246 |. 33C0 xor eax, eax
0048C248 |. 55 push ebp
0048C249 |. 68 D4C24800 push 0048C2D4
0048C24E |. 64:FF30 push dword ptr fs:[eax]
0048C251 |. 64:8920 mov dword ptr fs:[eax], esp
0048C254 |. 8B45 FC mov eax, dword ptr [ebp-4]
0048C257 |. E8 7085F7FF call 004047CC
0048C25C |. 8BD0 mov edx, eax
0048C25E |. 8D45 F4 lea eax, dword ptr [ebp-C]
0048C261 |. E8 EA88F7FF call 00404B50
0048C266 |. 8B45 FC mov eax, dword ptr [ebp-4]
0048C269 |. E8 5E85F7FF call 004047CC
0048C26E |. 84C0 test al, al
0048C270 |. 76 41 jbe short 0048C2B3
0048C272 |. 8845 F3 mov byte ptr [ebp-D], al
0048C275 |. B3 01 mov bl, 1
0048C277 |> 8D45 F4 /lea eax, dword ptr [ebp-C]
0048C27A |. E8 9D87F7FF |call 00404A1C
0048C27F |. 8BFB |mov edi, ebx
0048C281 |. 81E7 FF000000 |and edi, 0FF
0048C287 |. 8B55 FC |mov edx, dword ptr [ebp-4] ; 逐一取字符
0048C28A |. 8A543A FF |mov dl, byte ptr [edx+edi-1] ; 将ASCII码放入DL
0048C28E |. 0FB7CE |movzx ecx, si
0048C291 |. C1E9 08 |shr ecx, 8 ; ECX=ECX shr 8
0048C294 |. 32D1 |xor dl, cl ; DL = DL XOR CL
0048C296 |. 885438 FF |mov byte ptr [eax+edi-1], dl ; 将DL转换为字符
0048C29A |. 8B45 FC |mov eax, dword ptr [ebp-4]
0048C29D |. 0FB64438 FF |movzx eax, byte ptr [eax+edi-1] ; 取字符送入EAX
0048C2A2 |. 66:03F0 |add si, ax ; SI = SI + AX
0048C2A5 |. 66:83C6 32 |add si, 32 ; SI = SI + 32
0048C2A9 |. 66:83C6 32 |add si, 32 ; SI = SI + 32
0048C2AD |. 43 |inc ebx
0048C2AE |. FE4D F3 |dec byte ptr [ebp-D]
0048C2B1 |.^ 75 C4 \jnz short 0048C277
0048C2B3 |> 8B45 F8 mov eax, dword ptr [ebp-8]
算法描述如下:
SI = $7BE
逐一取机器码转成ASCII码到 DL 中
将 SI 送入 ECX中 即 ECX = SI
ECX = ECX shr 8
DL = DL XOR CL
DL 转换成 字符
======
生成新的 SI
取字符 放入 EAX 中
SI = SI + AX
SI = SI + $32
SI = SI + $32
DELPHI注册机源代码如下:
function GenCode(const sCode:string):string;
var
SI,DL,CL,AL:Dword;
ss:string;
i:Integer;
begin
SI := $7BE; //初始值
DL := $0;
CL := $0;
AL := $0;
SS:='';
for i :=1 to length(sCode) do begin
DL := Ord(sCode[i]);
CL := SI ;
CL := CL shr 8;
DL := DL XOR CL;
SS := SS + chr(DL);
AL := ord(sCode[i]);
SI := SI + AL;
SI := SI + $32;
SI := SI + $32;
end;
Result := SS;
end;
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界