首页
社区
课程
招聘
[原创]Pdf密码破解算法逆向
发表于: 2013-4-20 16:46 18703

[原创]Pdf密码破解算法逆向

2013-4-20 16:46
18703

软件名称 PasswareKitBasic.exe
软件版本 Passware Kit 12 Demo 和 Passware Kit 11 Demo
下载地址 www.lostpassword.com

把pdf破解算法的逆向记录分享一下,有理解错误的地方还请大家指正

Pdf密码有两种user password、owner password

这里的算法是破解user password。owner password可以直接移除不用破解

该版本不能破解acrobat10.0(acrobat X)
该版本主要包含三个破解算法RC4-40  RC4-128  AES-128
用acrobat工具生成各种加密版本来做测试
让程序跑起来,在线程窗口可以有三个线程在破解,选择在CPU中打开可以断在算法里(一次断不到算法里可以多试几次)

PDF加密后的文件尾部(trailer)
trailer
<</Size 28/Encrypt 29 0 R>>
startxref
116
%%EOF

29 0 obj <</Length128
/Filter/Standard
/O(154747F335FB401F338AAA1310E11E63D6B9F7D0FCA78DD48ED834C9CB7AC976)
/P-1028
/R3
/U(02093CD04060F432EA87F6985AFFDD78676E5F66000000005900A00130C53F00)
/V 2>> endobj
从Adobe® Portable Document Format文档里可以找到:
/Length 密钥的长度
/Filter 生成密钥的方法,就是前面说的security handler
/O 是由用户口令和权限口令得到的,用来生成密钥和验证输入的权限口令
/P 访问权限的标志
/R 标准加密的(standard security handler)的版本
/U由用户口令生成,用来验证输入的用户口令或权限口令,是否要提醒用户输入密码
/V 可选,用来指明加密的算法。

/P访问权限标识详细
1-2                保留为0;
3                (版本2) 打印文档
                (版本3或者更高)打印文档(可能不是最高级别,取决于bit 12是否被设置)       
4                Modify the contents of the document by operations other than those controlled by bits 6, 9, and 11.
                通过控制bit 6、bit 9、bit11修改文档内容
5                (版本2)Copy or otherwise extract text and graphics from the document, including extracting text and graphics (in support of                         accessibility
                to users with disabilities or for other purposes).
                复制或提取文本和图形从文档,包括提取文本和图形(以支持可访问性受限用户或其他用途)。
                (版本3或者更高) Copy or otherwise extract text and graphics from the document by operations other than that controlled by bit10.
                通过控制bit 10 复制或提取文本和图形

6                Add or modify text annotations, fill in interactive form fields, and, if bit 4 is also set, create or modify interactive form fields                 (including signature fields).
                添加或修改文本注释,填写交互式表单字段;如果bit 4被设置,创建或修改交互式表单字段(包括签名字段).
7-8                保留  为1;
9                (版本3或者更高) Fill in existing interactive form fields (including
                signature fields), even if bit 6 is clear.       
                填充现有的交互表单字段(包括签名字段),即使 bit 6未设置.
10                (版本3或者更高) Extract text and graphics (in support of accessibility
                to users with disabilities or for other purposes).       
                提取文本和图形(用来支持受限用户的可访问性或其他用途)
11                (版本3或者更高) Assemble the document (insert, rotate, or delete
                pages and create bookmarks or thumbnail images), even if bit 4 is clear.
                组合文档(插入、旋转或删除页面和创建书签或缩略图)即使bit 4未设置
12                (版本3或者更高) Print the document to a representation from which a faithful digital copy of the PDF content could be                                 generated. When this bit is clear (and bit 3 is set), printing is limited to a low-level representation of the appearance, possibly of                 degraded quality. (See implementation note 25 in Appendix H.)
                打印标识。当该位未设置并且bit  3被设置,打印受限。
               
13-32                (版本3或更高)保留 必须为1;

RC4-128算法
Algorithm part1 Computing an encryption key

1.密码字符串为N字节长度,用以下字符串
  <28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08 2E 2E 00 B6 D0 68 3E 80 2F 0C A9 FE 64 53 69 7A >
中的32-N个填充至32个字节。如果用户密码为空就全部填充.
2.初始化MD5,并将步骤1的结果输入到MD5函数.
3.通过加密字典中的O进入MD5哈希函数.
4.将P条目作为一个4字节无符号整数的值传递给MD5函数.
5.将文档ID的第一个元素传递给MD5.
6.如果文档metadata没有被加密传递0xFFFFFFFF到MD5函数.
7.结束MD5.
8.连续做50次:从上一个MD5函数的输出的n bytes传递到给MD5函数。其中n由加密字典条目的 length决定(length/8).
9.从最终的MD5输出的前n bytes设置为RC4加密密钥。对于版本2来说,n始终为5,但对于版本3或更高版本来说,取决于加密字典中
  length的值(length/8).

Algorithm part2  Computing the encryption dictionary’s U (user password) value (Revision 3 or greater)
1.按照Algorithm part1的方法,基于用户口令字符串生成全局加密密钥.
2.初始化MD5函数并将按照Algorithm part1步骤1生产的32位字符串输入该函数.
3.将文件ID数组中的第一个32位ID字符串传入MD5函数.
4.用第1步产生的密钥通过RC4算法来加密由步骤3输出的16位字符串.

0B272D84  49DD8B1A
0B272D88  B546154D
0B272D8C  059A4C1A
0B272D90  AB3D50CE


22 30 da 73 56 e1 48 74 e9 7f 75 49 db 8a a4 a7
5.做19次运算:用前一次的输出作为下一次的输入进行解码;密钥是由第1步产生的原始密钥的单个字节和循环数xor运算得到的.

0AFFD3B4  C7A7C82B  +颧
0AFFD3B8  1ED35085  匬?
0AFFD3BC  2F1EF1F4  赳_/
0AFFD3C0  28C6F209  .蚱(
3a fe 1a 3c 8b 61 45 b6 01 96 1b 06 c7 11 89 59

Passware Kit 11 Demo分析
填充后的数据
0AFFE084  BF289038
0AFFE088  754E5E4E
0AFFE08C  0064418A  Passware.0064418A
0AFFE090  FAFF564E
0AFFE094  2E2E0801
0AFFE098  68D0B600
0AFFE09C  0C2F803E
0AFFE0A0  5364FEA9
0AFFE0A4  2494D79E
0AFFE0A8  888F3421
0AFFE0AC  67719CB7
0AFFE0B0  9E49855C
0AFFE0B4  4B36B2F9
0AFFE0B8  9246127F
0AFFE0BC  CDAE7226
0AFFE0C0  5A206F65


0B017674  FFFFFBFC
0B017678  4E09775B
0B01767C  4CE72BD3
0B017680  4A9C5DA9
0B017684  E0B289D5
0B017688  00000080
0B01768C  00000000
0B017690  00000000
0B017694  00000000
0B017698  00000000
0B01769C  00000000
0B0176A0  00000000
0B0176A4  00000000
0B0176A8  00000000
0B0176AC  000002A0
0B0176B0  00000000


00A88CD6  |.  E8 253A0000   |call Passware.00A8C700                  ;  TTT3
00A8C73C  |.  E8 06600000   call Passware.00A92747                   ;  TTT2

00C62470  /$  55            push ebp                                 ;算法  得到加密后的16 bits
00C62471  |.  8BEC          mov ebp,esp
00C62473  |.  83EC 40       sub esp,0x40
00C62476  |.  53            push ebx
00C62477  |.  8B45 08       mov eax,[arg.1]
00C6247A  |.  8B48 0C       mov ecx,dword ptr ds:[eax+0xC]
00C6247D  |.  8B10          mov edx,dword ptr ds:[eax]
00C6247F  |.  56            push esi
00C62480  |.  8B70 04       mov esi,dword ptr ds:[eax+0x4]
00C62483  |.  57            push edi
00C62484  |.  8B78 08       mov edi,dword ptr ds:[eax+0x8]
00C62487  |.  8B45 0C       mov eax,[arg.2]

00A8D1EA  |> \8B08          mov ecx,dword ptr ds:[eax]
00A8D1EC  |.  310F          xor dword ptr ds:[edi],ecx
00A8D1EE  |.  8B50 04       mov edx,dword ptr ds:[eax+0x4]
00A8D1F1  |.  3157 04       xor dword ptr ds:[edi+0x4],edx
00A8D1F4  |.  8B48 08       mov ecx,dword ptr ds:[eax+0x8]
00A8D1F7  |.  314F 08       xor dword ptr ds:[edi+0x8],ecx
00A8D1FA  |.  8B50 0C       mov edx,dword ptr ds:[eax+0xC]
00A8D1FD  |.  3157 0C       xor dword ptr ds:[edi+0xC],edx

00A8E100  /$  89F8          mov eax,edi                               ;MD5算法
00A8E102  |.  8B0A          mov ecx,dword ptr ds:[edx]
00A8E104  |.  31F0          xor eax,esi
00A8E106  |.  81C1 78A46AD7 add ecx,0xD76AA478
00A8E10C  |.  21D8          and eax,ebx
00A8E10E  |.  01CD          add ebp,ecx
00A8E110  |.  31F8          xor eax,edi
00A8E112  |.  8B4A 04       mov ecx,dword ptr ds:[edx+0x4]
00A8E115  |.  01C5          add ebp,eax
00A8E117  |.  81C1 56B7C7E8 add ecx,0xE8C7B756
00A8E11D  |.  C1C5 07       rol ebp,0x7
00A8E120  |.  01CF          add edi,ecx
00A8E122  |.  89F0          mov eax,esi
00A8E124  |.  01DD          add ebp,ebx
00A8E126  |.  31D8          xor eax,ebx
00A8E128  |.  8B4A 08       mov ecx,dword ptr ds:[edx+0x8]
00A8E12B  |.  21E8          and eax,ebp
00A8E12D  |.  81C1 DB702024 add ecx,0x242070DB
00A8E133  |.  31F0          xor eax,esi

逆出来的算法代码(伪代码)

int JudgePdfPasswordRC4_128()
{
		int j=0;
		int rc4_count=0;
		UINT4  _State[4];
		UCHAR S[256];
		UINT state[4];

		UCHAR local_converStateEnd[16];
		memcpy(local_converStateEnd,converStateEnd,16);

		j=strlen(pdf_szZu);

		memcpy(CheckArea1,pdf_szZu,j);
		memcpy(CheckArea1+j,ConData,32-j);


		memcpy(_State,g_State,16);//取代reset();
		md5_transform_assembly(_State,CheckArea1);
		md5_transform_assembly(_State,CheckArea1 + 0x40);
		

		for(int md5_count = 0;md5_count != 50;++md5_count)//50次MD5算法
		{
			memcpy(CheckArea2,_State,16);
			memcpy(_State,g_State,16);//取代reset();
			CMD5::MD5Transform(_State,CheckArea2);
		}

		RC4_assemly(S, (const UCHAR*)_State, local_converStateEnd);
		for (rc4_count=0;rc4_count!=18;rc4_count++)//18次RC4算法
		{

			state[0]=_State[0]^cnt_X[rc4_count];
			state[1]=_State[1]^cnt_X[rc4_count];
			state[2]=_State[2]^cnt_X[rc4_count];
			state[3]=_State[3]^cnt_X[rc4_count];
			RC4_assemly(S, (const UCHAR*)state, local_converStateEnd);
		}

		state[0]=_State[0]^cnt_X[rc4_count];
		state[1]=_State[1]^cnt_X[rc4_count];
		state[2]=_State[2]^cnt_X[rc4_count];
		state[3]=_State[3]^cnt_X[rc4_count];
return RC4AndResult(S,m_lin,local_converStateEnd,sizeof(local_converStateEnd),(char*)state,16);
//第19次RC4算法并作判断
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (29)
雪    币: 269
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
标记下晚上慢慢看
2013-4-20 17:11
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
LZ真是这方面的行家啊,看着都晕的慌
2013-4-20 18:01
0
雪    币: 97697
活跃值: (200834)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
Thanks for share.
2013-4-20 18:20
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
楼上的回复真是百年不变啊
2013-4-20 18:26
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错呀,这方面比较少
2013-4-20 20:19
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
看的多 顶的少
2013-4-20 21:31
0
雪    币: 190
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
楼主牛逼啊,顶贴啊
2013-4-20 22:11
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
我来学习的:)
2013-4-21 00:05
0
雪    币: 172
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
牛逼人物啊。研究研究
2013-4-21 00:59
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
11
pdf难道不是公开的?应该有现成的文档吧?
好像adobe公司就有1.7的下载
http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/pdf_reference_1-7.pdf
上传的附件:
2013-4-21 08:05
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
12
这种文章坛里早就有了,楼主没发现吗?
2013-4-21 08:22
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
当初做的时候就参考了你写的那篇了
2013-4-21 13:59
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
这个应该是给第三方软件的加密标准吧,全是英文也木有看太懂
2013-4-21 14:01
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
15
我写的时候什么参考也找不到,两眼一摸黑。楼主能看懂我的文章,总算是找到知音了!
2013-4-21 20:39
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
2013-4-21 21:53
0
雪    币: 275
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
感觉很强大的样子,还得女里啊
2013-4-22 11:45
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
女里?在哪在哪?
2013-4-22 12:31
0
雪    币: 822
活跃值: (380)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
19
看一下pdf文档规范,找个开源代码就行了啊。没必要去逆向吧
2013-4-22 12:37
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
当时还不懂找开源,不过这个软件的速度真的很快啊
2013-4-22 13:43
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
21
都找开源,不练练手,怎么知道自己有多大能耐?等到遇到没有开源的,不就傻眼了!这个阶段还是必要的,多动动手还是有好处的。
2013-4-22 17:38
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
多谢天易大牛的支持,刚入门是要多练手啊
2013-4-22 19:53
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
能找资料的才是真高数。。。
膜拜负威望
2013-4-24 12:12
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
24
只要是人都会找资料
2013-4-25 22:18
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
很详细,学习了!
2013-4-27 16:05
0
游客
登录 | 注册 方可回帖
返回
//