首页
社区
课程
招聘
[原创]Sdemo加密录像密码解密
2008-4-15 15:36 6390

[原创]Sdemo加密录像密码解密

2008-4-15 15:36
6390
技术含量不高,需要的来看看

随手拈来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虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lovelyfrog 2008-4-15 15:55
2
0
太强了
雪    币: 334
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
honghan 2008-4-15 18:47
3
0
哈 这个easy
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寿星 2008-4-15 18:58
4
0
呵呵,不会啊
雪    币: 557
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
蚊香 3 2008-4-15 20:45
5
0
相对来说是属于比较简单的
游客
登录 | 注册 方可回帖
返回