【文章标题】: 解密试分析
【文章作者】: 北极狐狸
【作者邮箱】: [email]eug3@163.com[/email]
【作者主页】: nothing
【作者QQ号】: 87201014
【软件名称】: 应答此贴(
http://bbs.pediy.com/showthread.php?t=55973 )
【软件大小】: 1.81M
【下载地址】: 求助应答
【加壳方式】: nothing
【保护方式】: nothing
【编写语言】: Borland Delphi 4.0 - 5.0
【使用工具】: PeID v0.95,OllyDbg v1.10
【操作平台】: winxp
【软件介绍】: 双色球中奖
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
单步执行找到算法计算处
我看这个算法的时候没有用什么流行的方法!由于大多都不会!
下面的是算法的主要内容!
0048AF2D |> /8B4D EC /mov ecx, dword ptr [ebp-14] ;计数器 0~15 (注册号是16位的)
0048AF30 |. |BA 09000000 |mov edx, 9 ;这个数字是用来计算的(在下面我称它为a).. 下面雷同
0048AF35 |. |8B45 F4 |mov eax, dword ptr [ebp-C] ;这是个也是用于计算的(在下面我称它为b)...{二进制16}
0048AF38 |. |E8 73F6FFFF |call 0048A5B0 ;这里应该跟进的....
0048AF3D |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E] ;这里用到机器码,安计算出的数字选泽相对应得数
;比如:
;call 中计算出是2 选择机器码中第2个为计算结果
;以下前三个call计算雷同!
0048AF41 |. |8845 E7 |mov byte ptr [ebp-19], al
0048AF44 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF47 |. |BA 05000000 |mov edx, 5
0048AF4C |. |8B45 F4 |mov eax, dword ptr [ebp-C]
0048AF4F |. |E8 5CF6FFFF |call 0048A5B0
0048AF54 |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E]
0048AF58 |. |8845 E6 |mov byte ptr [ebp-1A], al
0048AF5B |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF5E |. |BA 02000000 |mov edx, 2
0048AF63 |. |8B45 F4 |mov eax, dword ptr [ebp-C]
0048AF66 |. |E8 45F6FFFF |call 0048A5B0
0048AF6B |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E]
0048AF6F |. |8845 E5 |mov byte ptr [ebp-1B], al
0048AF72 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF75 |. |BA 08000000 |mov edx, 8
0048AF7A |. |8B45 F0 |mov eax, dword ptr [ebp-10] ;此值为19(二进制)
0048AF7D |. |E8 2EF6FFFF |call 0048A5B0 ;以下两call的计算结果是在密码表中选对应的结果
0048AF82 |. |BA 50B04800 |mov edx, 0048B050 密码表地址 0048B050~0048B063
0048AF87 |. |8A4402 FF |mov al, byte ptr [edx+eax-1]
0048AF8B |. |8845 E4 |mov byte ptr [ebp-1C], al
0048AF8E |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF91 |. |BA 01000000 |mov edx, 1
0048AF96 |. |8B45 F0 |mov eax, dword ptr [ebp-10]
0048AF99 |. |E8 12F6FFFF |call 0048A5B0
0048AF9E |. |BA 50B04800 |mov edx, 0048B050
0048AFA3 |. |8A4402 FF |mov al, byte ptr [edx+eax-1]
0048AFA7 |. |8845 E3 |mov byte ptr [ebp-1D], al --------------
0048AFAA |. |33C0 |xor eax, eax |
0048AFAC |. |8A45 E4 |mov al, byte ptr [ebp-1C] |
0048AFAF |. |33D2 |xor edx, edx |
0048AFB1 |. |8A55 E7 |mov dl, byte ptr [ebp-19]
0048AFB4 |. |F7EA |imul edx
0048AFB6 |. |33D2 |xor edx, edx
0048AFB8 |. |8A55 E6 |mov dl, byte ptr [ebp-1A]
0048AFBB |. |33C9 |xor ecx, ecx ; 这之间的计算是{[ebp-1C]*[ebp-19]+[ebp-1A]*[ebp-1D]+[ebp-1B]}/10的余数
0048AFBD |. |8A4D E3 |mov cl, byte ptr [ebp-1D]
0048AFC0 |. |0FAFD1 |imul edx, ecx ; 这边的计算时把机器码的字符换成ASCII码!
0048AFC3 |. |03C2 |add eax, edx
0048AFC5 |. |33D2 |xor edx, edx
0048AFC7 |. |8A55 E5 |mov dl, byte ptr [ebp-1B] |
0048AFCA |. |03C2 |add eax, edx |
0048AFCC |. |B9 0A000000 |mov ecx, 0A |
0048AFD1 |. |33D2 |xor edx, edx |
0048AFD3 |. |F7F1 |div ecx -----------------
0048AFD5 |. |8955 E8 |mov dword ptr [ebp-18], edx
0048AFD8 |. |8B45 E8 |mov eax, dword ptr [ebp-18]
0048AFDB |. |E8 00F6FFFF |call 0048A5E0
0048AFE0 |. |8B55 F8 |mov edx, dword ptr [ebp-8]
0048AFE3 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AFE6 |. |88440A 01 |mov byte ptr [edx+ecx+1], al
0048AFEA |. |FF45 EC |inc dword ptr [ebp-14]
0048AFED |. |837D EC 10 |cmp dword ptr [ebp-14], 10
0048AFF1 |.^\0F85 36FFFFFF \jnz 0048AF2D
-----------------------------------------------------------------------
下面是跟进的内容
0048A5B0 /$ 55 push ebp
0048A5B1 |. 8BEC mov ebp, esp
0048A5B3 |. 83C4 F0 add esp, -10
0048A5B6 |. 894D F4 mov dword ptr [ebp-C], ecx
0048A5B9 |. 8955 F8 mov dword ptr [ebp-8], edx
0048A5BC |. 8945 FC mov dword ptr [ebp-4], eax
0048A5BF |. 8B45 F8 mov eax, dword ptr [ebp-8]
0048A5C2 |. 0345 F4 add eax, dword ptr [ebp-C]
0048A5C5 |. 99 cdq
0048A5C6 |. F77D FC idiv dword ptr [ebp-4]
0048A5C9 |. 8955 F0 mov dword ptr [ebp-10], edx
0048A5CC |. 837D F0 00 cmp dword ptr [ebp-10], 0
0048A5D0 |. 75 06 jnz short 0048A5D8
0048A5D2 |. 8B45 FC mov eax, dword ptr [ebp-4]
0048A5D5 |. 8945 F0 mov dword ptr [ebp-10], eax
0048A5D8 |> 8B45 F0 mov eax, dword ptr [ebp-10]
0048A5DB |. 8BE5 mov esp, ebp
0048A5DD |. 5D pop ebp
0048A5DE \. C3 retn
这个计算没有什么大用处!
主要是把 (a+计数器值)/b的余数作为结果返回
--------------------------------------------------------------------------
复制下面的代码放入 文本文件中后缀名改为vbs 双击执行.为注册机
--------------------------------------------------------------------------
db=array(211,162,186,192,203,171,201,171,199,242,214,208,189,177,180,243,202,166,32,0)
dim strar(16)
dim temp(16)
str1=inputbox("输入机器码"," 双色球中奖 ------计算器")
for i = 0 to 15
strar(i)=left(str1,1)
str1=right(str1,len(str1)-1)
next
for i = 0 to 15
a=(9+i) mod 16
if a=0 then
a=16
end if
b=(5+i) mod 16
if b=0 then
b=16
end if
c=(2+i) mod 16
if c=0 then
c=16
end if
d=(8+i) mod 19
if d=0 then
d=19
end if
e=(1+i) mod 19
if e=0 then
e=19
end if
an= p(strar(a-1))
bn= p(strar(b-1))
cn= p(strar(c-1))
dn=db(d-1)
en=db(e-1)
temp(i)=(dn*an+bn*en+cn) mod 10
temps=temps & temp(i)
next
i=inputbox("注册码"," 双色球中奖 ------计算器", temps)
Public function p(s)
select case s
case 0
p=asc("0")
case 1
p=asc("1")
case 2
p=asc("2")
case 3
p=asc("3")
case 4
p=asc("4")
case 5
p=asc("5")
case 6
p=asc("6")
case 7
p=asc("7")
case 8
p=asc("8")
case 9
p=asc("9")
end select
end function
--------------------------------------------------------------------------------
【经验总结】
仔细慢慢分析,连蒙代猜!就可以读懂代码了!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)