技术含量不高,需要的来看看
随手拈来Sdemo加密录像密码
Sdemo由于生成文件可直接运行、压缩率高、可记录屏幕任何动作和鼠标点击过程等优点而在视频教学中被广泛采用。特别是一些黑客站点,随处可见Sdemo或其修改版制作的动画教程。其中有些是被加了密码的,今天我们就看看如何不知道密码的情况下也能观看动画甚至解密出密码。
如果输入错误密码,录像文件会弹出对话框,提示“PassWord Wrong!”。用Peid发现生成的录像是无壳的,直接Ollydbg载入录像文件后下断点Bp MessageBoxA运行后输入一个错误的密码即可中断在关键位置,观看此时的右下角堆栈区域,如图1。
很容易看出这个MessageBoxA返回地址是00402054处,那么调用地址就是0040204F,Ctrl+G过去看看。附近代码是这样的:
00401FE9 /. 55 PUSH EBP
00401FEA |. 8BEC MOV EBP,ESP
00401FEC |. 83EC 68 SUB ESP,68
00401FEF |. 56 PUSH ESI
00401FF0 |. 8BF1 MOV ESI,ECX
00401FF2 |. 83BE 94000000>CMP DWORD PTR DS:[ESI+94],0
00401FF9 |. 74 5B JE SHORT test1.00402056
00401FFB |. 6A 01 PUSH 1
00401FFD |. E8 80900000 CALL <JMP.&MFC42.#6334_?UpdateData@CWnd@>
00402002 |. 8D45 98 LEA EAX,DWORD PTR SS:[EBP-68]
00402005 |. 68 AC504100 PUSH test1.004150AC ; /src = "Clayman"
0040200A |. 50 PUSH EAX ; |dest
0040200B |. E8 3A940000 CALL <JMP.&MSVCRT.strcpy> ; \strcpy
00402010 |. 8D46 60 LEA EAX,DWORD PTR DS:[ESI+60]
00402013 |. 50 PUSH EAX ; /src
00402014 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] ; |
00402017 |. 50 PUSH EAX ; |dest
00402018 |. E8 2D940000 CALL <JMP.&MSVCRT.strcpy> ; \strcpy
0040201D |. 8D45 98 LEA EAX,DWORD PTR SS:[EBP-68]
00402020 |. 50 PUSH EAX
00402021 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34]
00402024 |. 50 PUSH EAX
00402025 |. E8 24FEFFFF CALL test1.00401E4E
;解密出原始密码
0040202A |. FFB6 A4000000 PUSH DWORD PTR DS:[ESI+A4] ; /s2
00402030 |. 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] ; |
00402033 |. 50 PUSH EAX ; |s1
00402034 |. FF15 E0234100 CALL DWORD PTR DS:[<&MSVCRT._stricmp>] ; \_stricmp
;密码比较
0040203A |. 83C4 20 ADD ESP,20
0040203D |. 85C0 TEST EAX,EAX
0040203F |. 74 15 JE SHORT test1.00402056
;密码正确就跳走,不对就报错
00402041 |. 6A 40 PUSH 40
00402043 |. 68 A4504100 PUSH test1.004150A4 ; ASCII "Player"
00402048 |. 68 94504100 PUSH test1.00415094 ; ASCII "Password Wrong!"
0040204D |. 8BCE MOV ECX,ESI
0040204F |. E8 28900000 CALL <JMP.&MFC42.#4224_?MessageBoxA@CWnd>
整个解密和判断也就这么一个过程,判断逻辑过于简单,既可以在stricmp比较时看到明文也可以直接爆破0040203F处的跳转来破解密码的限制。既然如此容易那就在00402025处顺便F7步入看看它的解密过程吧。
对比两个不同的加密录像分析可知是由三个固定字符串"FZRHK01WGTPQSAVC"、"Clayman"和"Guest"字符及其长度对一个可变的字符串循环取模及移位进行解密的,这个可变字符串因不同密码而异。用Winhex打开可在偏移0x261A1处找到此加密后字符串,在不同的文件中偏移位置是相同的,0x261A0处为00则表示无密码,为01表示有密码。解密代码较长,在这里不详细贴出,可对照给出的C代码阅读解密过程:
#include "windows.h"
main()
{
char s1[]="Clayman";//固定代码
char s2[]="CW1AACKAP0ZAGKK";//文件0x261A1处加密后字符
char s3[]="FZRHK01WGTPQSAVC";//固定字符
char s4[]="Guest";//固定字符
int s2len=strlen(s2);
int i,j,k,l,m,n,x,y,z,al,dl,dl1,cl,count,count1,oy;
for(i=0;s3[i]!=s2[0]&&i<16;i++);
printf("i is %d\n",i);
if(i<16)
{
j=15-i;
k=strlen(s1);
l=k%7;
if(l==0)
{
l=5;
}
printf("l is %d\n",l);
m=j%l;
n=(char)s4[m];
printf("n is %c\n",n);
x=n%0x10;
printf("x is %d\n",x);
printf("s3[x] is %c\ns2[1] is %c\n",s3[x],s2[1]);
if((char)s3[x]==(char)s2[1])
{
y=(s2len-0x3)>>0x1;
printf("y is %d\n",y);
for(z=0;z<y;z++)
{
for(count=0;((char)s3[count]!=(char)s2[3+2*z])&&count<16;count++);
if(count<16)
{
/*00401F2E |. 2BC6 |SUB EAX,ESI
00401F30 |. 6A 10 |PUSH 10
00401F32 |. 03C7 |ADD EAX,EDI
00401F34 |. 59 |POP ECX
00401F35 |. 99 |CDQ
00401F36 |. F7F9 |IDIV ECX
00401F38 |. 8855 0F |MOV BYTE PTR SS:[EBP+F],DL*/
count-=j;
count+=0x3E80;
dl=count%0x10;
}
else
{
dl=0;
}
/*00401F41 |> \8A0B |MOV CL,BYTE PTR DS:[EBX]
00401F43 |. 33C0 |XOR EAX,EAX */
cl= (char)s2[2+2*z];
for(count1=0;((char)s3[count1]!=cl)&&count1<16;count1++);
if(count1<16)
{
/*00401F58 |. 2BC6 |SUB EAX,ESI
00401F5A |. 6A 10 |PUSH 10
00401F5C |. 03C7 |ADD EAX,EDI
00401F5E |. 59 |POP ECX
00401F5F |. 99 |CDQ
00401F60 |. F7F9 |IDIV ECX
*/
count1-=j;
count1+=0x3E80;
dl1=count1%0x10;
}
else
{
dl1=0;
}
al=dl1<<4;
al+=dl;
s2[z]=al;
j+=dl1;
}
printf("password is:");
for(oy=0;oy<y;oy++)
{
printf("%c",s2[oy]);
}
}
}
}
图2
图2是运行后截图,附件给出相关文件和代码,并附上一个编译后的GUI程序。来试试吧,你可以做出更漂亮的密码查找工具!
代码:
MyUnde.rar
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法