1 /*
2  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #pragma ident	"%Z%%M%	%I%	%E% SMI"
7 
8 /*
9  * This program is copyright Alec Muffett 1993. The author disclaims all
10  * responsibility or liability with respect to it's usage or its effect
11  * upon hardware or computer systems, and maintains copyright as set out
12  * in the "LICENCE" document which accompanies distributions of Crack v4.0
13  * and upwards.
14  */
15 
16 #include "packer.h"
17 
18 
19 static char *r_destructors[] = {
20 	":",			/* noop - must do this to test raw word. */
21 	"[",			/* trimming leading/trailing junk */
22 	"]",
23 	"[[",
24 	"]]",
25 	"[[[",
26 	"]]]",
27 
28 	"/?p@?p",		/* purging out punctuation/symbols/junk */
29 	"/?s@?s",
30 	"/?X@?X",
31 	/* attempt reverse engineering of password strings */
32 	"/$s$s",
33 	"/$s$s/0s0o",
34 	"/$s$s/0s0o/2s2a",
35 	"/$s$s/0s0o/2s2a/3s3e",
36 	"/$s$s/0s0o/2s2a/3s3e/5s5s",
37 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1i",
38 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1l",
39 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1i/4s4a",
40 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1i/4s4h",
41 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1l/4s4a",
42 	"/$s$s/0s0o/2s2a/3s3e/5s5s/1s1l/4s4h",
43 	"/$s$s/0s0o/2s2a/3s3e/5s5s/4s4a",
44 	"/$s$s/0s0o/2s2a/3s3e/5s5s/4s4h",
45 	"/$s$s/0s0o/2s2a/3s3e/5s5s/4s4a",
46 	"/$s$s/0s0o/2s2a/3s3e/5s5s/4s4h",
47 	"/$s$s/0s0o/2s2a/3s3e/1s1i",
48 	"/$s$s/0s0o/2s2a/3s3e/1s1l",
49 	"/$s$s/0s0o/2s2a/3s3e/1s1i/4s4a",
50 	"/$s$s/0s0o/2s2a/3s3e/1s1i/4s4h",
51 	"/$s$s/0s0o/2s2a/3s3e/1s1l/4s4a",
52 	"/$s$s/0s0o/2s2a/3s3e/1s1l/4s4h",
53 	"/$s$s/0s0o/2s2a/3s3e/4s4a",
54 	"/$s$s/0s0o/2s2a/3s3e/4s4h",
55 	"/$s$s/0s0o/2s2a/3s3e/4s4a",
56 	"/$s$s/0s0o/2s2a/3s3e/4s4h",
57 	"/$s$s/0s0o/2s2a/5s5s",
58 	"/$s$s/0s0o/2s2a/5s5s/1s1i",
59 	"/$s$s/0s0o/2s2a/5s5s/1s1l",
60 	"/$s$s/0s0o/2s2a/5s5s/1s1i/4s4a",
61 	"/$s$s/0s0o/2s2a/5s5s/1s1i/4s4h",
62 	"/$s$s/0s0o/2s2a/5s5s/1s1l/4s4a",
63 	"/$s$s/0s0o/2s2a/5s5s/1s1l/4s4h",
64 	"/$s$s/0s0o/2s2a/5s5s/4s4a",
65 	"/$s$s/0s0o/2s2a/5s5s/4s4h",
66 	"/$s$s/0s0o/2s2a/5s5s/4s4a",
67 	"/$s$s/0s0o/2s2a/5s5s/4s4h",
68 	"/$s$s/0s0o/2s2a/1s1i",
69 	"/$s$s/0s0o/2s2a/1s1l",
70 	"/$s$s/0s0o/2s2a/1s1i/4s4a",
71 	"/$s$s/0s0o/2s2a/1s1i/4s4h",
72 	"/$s$s/0s0o/2s2a/1s1l/4s4a",
73 	"/$s$s/0s0o/2s2a/1s1l/4s4h",
74 	"/$s$s/0s0o/2s2a/4s4a",
75 	"/$s$s/0s0o/2s2a/4s4h",
76 	"/$s$s/0s0o/2s2a/4s4a",
77 	"/$s$s/0s0o/2s2a/4s4h",
78 	"/$s$s/0s0o/3s3e",
79 	"/$s$s/0s0o/3s3e/5s5s",
80 	"/$s$s/0s0o/3s3e/5s5s/1s1i",
81 	"/$s$s/0s0o/3s3e/5s5s/1s1l",
82 	"/$s$s/0s0o/3s3e/5s5s/1s1i/4s4a",
83 	"/$s$s/0s0o/3s3e/5s5s/1s1i/4s4h",
84 	"/$s$s/0s0o/3s3e/5s5s/1s1l/4s4a",
85 	"/$s$s/0s0o/3s3e/5s5s/1s1l/4s4h",
86 	"/$s$s/0s0o/3s3e/5s5s/4s4a",
87 	"/$s$s/0s0o/3s3e/5s5s/4s4h",
88 	"/$s$s/0s0o/3s3e/5s5s/4s4a",
89 	"/$s$s/0s0o/3s3e/5s5s/4s4h",
90 	"/$s$s/0s0o/3s3e/1s1i",
91 	"/$s$s/0s0o/3s3e/1s1l",
92 	"/$s$s/0s0o/3s3e/1s1i/4s4a",
93 	"/$s$s/0s0o/3s3e/1s1i/4s4h",
94 	"/$s$s/0s0o/3s3e/1s1l/4s4a",
95 	"/$s$s/0s0o/3s3e/1s1l/4s4h",
96 	"/$s$s/0s0o/3s3e/4s4a",
97 	"/$s$s/0s0o/3s3e/4s4h",
98 	"/$s$s/0s0o/3s3e/4s4a",
99 	"/$s$s/0s0o/3s3e/4s4h",
100 	"/$s$s/0s0o/5s5s",
101 	"/$s$s/0s0o/5s5s/1s1i",
102 	"/$s$s/0s0o/5s5s/1s1l",
103 	"/$s$s/0s0o/5s5s/1s1i/4s4a",
104 	"/$s$s/0s0o/5s5s/1s1i/4s4h",
105 	"/$s$s/0s0o/5s5s/1s1l/4s4a",
106 	"/$s$s/0s0o/5s5s/1s1l/4s4h",
107 	"/$s$s/0s0o/5s5s/4s4a",
108 	"/$s$s/0s0o/5s5s/4s4h",
109 	"/$s$s/0s0o/5s5s/4s4a",
110 	"/$s$s/0s0o/5s5s/4s4h",
111 	"/$s$s/0s0o/1s1i",
112 	"/$s$s/0s0o/1s1l",
113 	"/$s$s/0s0o/1s1i/4s4a",
114 	"/$s$s/0s0o/1s1i/4s4h",
115 	"/$s$s/0s0o/1s1l/4s4a",
116 	"/$s$s/0s0o/1s1l/4s4h",
117 	"/$s$s/0s0o/4s4a",
118 	"/$s$s/0s0o/4s4h",
119 	"/$s$s/0s0o/4s4a",
120 	"/$s$s/0s0o/4s4h",
121 	"/$s$s/2s2a",
122 	"/$s$s/2s2a/3s3e",
123 	"/$s$s/2s2a/3s3e/5s5s",
124 	"/$s$s/2s2a/3s3e/5s5s/1s1i",
125 	"/$s$s/2s2a/3s3e/5s5s/1s1l",
126 	"/$s$s/2s2a/3s3e/5s5s/1s1i/4s4a",
127 	"/$s$s/2s2a/3s3e/5s5s/1s1i/4s4h",
128 	"/$s$s/2s2a/3s3e/5s5s/1s1l/4s4a",
129 	"/$s$s/2s2a/3s3e/5s5s/1s1l/4s4h",
130 	"/$s$s/2s2a/3s3e/5s5s/4s4a",
131 	"/$s$s/2s2a/3s3e/5s5s/4s4h",
132 	"/$s$s/2s2a/3s3e/5s5s/4s4a",
133 	"/$s$s/2s2a/3s3e/5s5s/4s4h",
134 	"/$s$s/2s2a/3s3e/1s1i",
135 	"/$s$s/2s2a/3s3e/1s1l",
136 	"/$s$s/2s2a/3s3e/1s1i/4s4a",
137 	"/$s$s/2s2a/3s3e/1s1i/4s4h",
138 	"/$s$s/2s2a/3s3e/1s1l/4s4a",
139 	"/$s$s/2s2a/3s3e/1s1l/4s4h",
140 	"/$s$s/2s2a/3s3e/4s4a",
141 	"/$s$s/2s2a/3s3e/4s4h",
142 	"/$s$s/2s2a/3s3e/4s4a",
143 	"/$s$s/2s2a/3s3e/4s4h",
144 	"/$s$s/2s2a/5s5s",
145 	"/$s$s/2s2a/5s5s/1s1i",
146 	"/$s$s/2s2a/5s5s/1s1l",
147 	"/$s$s/2s2a/5s5s/1s1i/4s4a",
148 	"/$s$s/2s2a/5s5s/1s1i/4s4h",
149 	"/$s$s/2s2a/5s5s/1s1l/4s4a",
150 	"/$s$s/2s2a/5s5s/1s1l/4s4h",
151 	"/$s$s/2s2a/5s5s/4s4a",
152 	"/$s$s/2s2a/5s5s/4s4h",
153 	"/$s$s/2s2a/5s5s/4s4a",
154 	"/$s$s/2s2a/5s5s/4s4h",
155 	"/$s$s/2s2a/1s1i",
156 	"/$s$s/2s2a/1s1l",
157 	"/$s$s/2s2a/1s1i/4s4a",
158 	"/$s$s/2s2a/1s1i/4s4h",
159 	"/$s$s/2s2a/1s1l/4s4a",
160 	"/$s$s/2s2a/1s1l/4s4h",
161 	"/$s$s/2s2a/4s4a",
162 	"/$s$s/2s2a/4s4h",
163 	"/$s$s/2s2a/4s4a",
164 	"/$s$s/2s2a/4s4h",
165 	"/$s$s/3s3e",
166 	"/$s$s/3s3e/5s5s",
167 	"/$s$s/3s3e/5s5s/1s1i",
168 	"/$s$s/3s3e/5s5s/1s1l",
169 	"/$s$s/3s3e/5s5s/1s1i/4s4a",
170 	"/$s$s/3s3e/5s5s/1s1i/4s4h",
171 	"/$s$s/3s3e/5s5s/1s1l/4s4a",
172 	"/$s$s/3s3e/5s5s/1s1l/4s4h",
173 	"/$s$s/3s3e/5s5s/4s4a",
174 	"/$s$s/3s3e/5s5s/4s4h",
175 	"/$s$s/3s3e/5s5s/4s4a",
176 	"/$s$s/3s3e/5s5s/4s4h",
177 	"/$s$s/3s3e/1s1i",
178 	"/$s$s/3s3e/1s1l",
179 	"/$s$s/3s3e/1s1i/4s4a",
180 	"/$s$s/3s3e/1s1i/4s4h",
181 	"/$s$s/3s3e/1s1l/4s4a",
182 	"/$s$s/3s3e/1s1l/4s4h",
183 	"/$s$s/3s3e/4s4a",
184 	"/$s$s/3s3e/4s4h",
185 	"/$s$s/3s3e/4s4a",
186 	"/$s$s/3s3e/4s4h",
187 	"/$s$s/5s5s",
188 	"/$s$s/5s5s/1s1i",
189 	"/$s$s/5s5s/1s1l",
190 	"/$s$s/5s5s/1s1i/4s4a",
191 	"/$s$s/5s5s/1s1i/4s4h",
192 	"/$s$s/5s5s/1s1l/4s4a",
193 	"/$s$s/5s5s/1s1l/4s4h",
194 	"/$s$s/5s5s/4s4a",
195 	"/$s$s/5s5s/4s4h",
196 	"/$s$s/5s5s/4s4a",
197 	"/$s$s/5s5s/4s4h",
198 	"/$s$s/1s1i",
199 	"/$s$s/1s1l",
200 	"/$s$s/1s1i/4s4a",
201 	"/$s$s/1s1i/4s4h",
202 	"/$s$s/1s1l/4s4a",
203 	"/$s$s/1s1l/4s4h",
204 	"/$s$s/4s4a",
205 	"/$s$s/4s4h",
206 	"/$s$s/4s4a",
207 	"/$s$s/4s4h",
208 	"/0s0o",
209 	"/0s0o/2s2a",
210 	"/0s0o/2s2a/3s3e",
211 	"/0s0o/2s2a/3s3e/5s5s",
212 	"/0s0o/2s2a/3s3e/5s5s/1s1i",
213 	"/0s0o/2s2a/3s3e/5s5s/1s1l",
214 	"/0s0o/2s2a/3s3e/5s5s/1s1i/4s4a",
215 	"/0s0o/2s2a/3s3e/5s5s/1s1i/4s4h",
216 	"/0s0o/2s2a/3s3e/5s5s/1s1l/4s4a",
217 	"/0s0o/2s2a/3s3e/5s5s/1s1l/4s4h",
218 	"/0s0o/2s2a/3s3e/5s5s/4s4a",
219 	"/0s0o/2s2a/3s3e/5s5s/4s4h",
220 	"/0s0o/2s2a/3s3e/5s5s/4s4a",
221 	"/0s0o/2s2a/3s3e/5s5s/4s4h",
222 	"/0s0o/2s2a/3s3e/1s1i",
223 	"/0s0o/2s2a/3s3e/1s1l",
224 	"/0s0o/2s2a/3s3e/1s1i/4s4a",
225 	"/0s0o/2s2a/3s3e/1s1i/4s4h",
226 	"/0s0o/2s2a/3s3e/1s1l/4s4a",
227 	"/0s0o/2s2a/3s3e/1s1l/4s4h",
228 	"/0s0o/2s2a/3s3e/4s4a",
229 	"/0s0o/2s2a/3s3e/4s4h",
230 	"/0s0o/2s2a/3s3e/4s4a",
231 	"/0s0o/2s2a/3s3e/4s4h",
232 	"/0s0o/2s2a/5s5s",
233 	"/0s0o/2s2a/5s5s/1s1i",
234 	"/0s0o/2s2a/5s5s/1s1l",
235 	"/0s0o/2s2a/5s5s/1s1i/4s4a",
236 	"/0s0o/2s2a/5s5s/1s1i/4s4h",
237 	"/0s0o/2s2a/5s5s/1s1l/4s4a",
238 	"/0s0o/2s2a/5s5s/1s1l/4s4h",
239 	"/0s0o/2s2a/5s5s/4s4a",
240 	"/0s0o/2s2a/5s5s/4s4h",
241 	"/0s0o/2s2a/5s5s/4s4a",
242 	"/0s0o/2s2a/5s5s/4s4h",
243 	"/0s0o/2s2a/1s1i",
244 	"/0s0o/2s2a/1s1l",
245 	"/0s0o/2s2a/1s1i/4s4a",
246 	"/0s0o/2s2a/1s1i/4s4h",
247 	"/0s0o/2s2a/1s1l/4s4a",
248 	"/0s0o/2s2a/1s1l/4s4h",
249 	"/0s0o/2s2a/4s4a",
250 	"/0s0o/2s2a/4s4h",
251 	"/0s0o/2s2a/4s4a",
252 	"/0s0o/2s2a/4s4h",
253 	"/0s0o/3s3e",
254 	"/0s0o/3s3e/5s5s",
255 	"/0s0o/3s3e/5s5s/1s1i",
256 	"/0s0o/3s3e/5s5s/1s1l",
257 	"/0s0o/3s3e/5s5s/1s1i/4s4a",
258 	"/0s0o/3s3e/5s5s/1s1i/4s4h",
259 	"/0s0o/3s3e/5s5s/1s1l/4s4a",
260 	"/0s0o/3s3e/5s5s/1s1l/4s4h",
261 	"/0s0o/3s3e/5s5s/4s4a",
262 	"/0s0o/3s3e/5s5s/4s4h",
263 	"/0s0o/3s3e/5s5s/4s4a",
264 	"/0s0o/3s3e/5s5s/4s4h",
265 	"/0s0o/3s3e/1s1i",
266 	"/0s0o/3s3e/1s1l",
267 	"/0s0o/3s3e/1s1i/4s4a",
268 	"/0s0o/3s3e/1s1i/4s4h",
269 	"/0s0o/3s3e/1s1l/4s4a",
270 	"/0s0o/3s3e/1s1l/4s4h",
271 	"/0s0o/3s3e/4s4a",
272 	"/0s0o/3s3e/4s4h",
273 	"/0s0o/3s3e/4s4a",
274 	"/0s0o/3s3e/4s4h",
275 	"/0s0o/5s5s",
276 	"/0s0o/5s5s/1s1i",
277 	"/0s0o/5s5s/1s1l",
278 	"/0s0o/5s5s/1s1i/4s4a",
279 	"/0s0o/5s5s/1s1i/4s4h",
280 	"/0s0o/5s5s/1s1l/4s4a",
281 	"/0s0o/5s5s/1s1l/4s4h",
282 	"/0s0o/5s5s/4s4a",
283 	"/0s0o/5s5s/4s4h",
284 	"/0s0o/5s5s/4s4a",
285 	"/0s0o/5s5s/4s4h",
286 	"/0s0o/1s1i",
287 	"/0s0o/1s1l",
288 	"/0s0o/1s1i/4s4a",
289 	"/0s0o/1s1i/4s4h",
290 	"/0s0o/1s1l/4s4a",
291 	"/0s0o/1s1l/4s4h",
292 	"/0s0o/4s4a",
293 	"/0s0o/4s4h",
294 	"/0s0o/4s4a",
295 	"/0s0o/4s4h",
296 	"/2s2a",
297 	"/2s2a/3s3e",
298 	"/2s2a/3s3e/5s5s",
299 	"/2s2a/3s3e/5s5s/1s1i",
300 	"/2s2a/3s3e/5s5s/1s1l",
301 	"/2s2a/3s3e/5s5s/1s1i/4s4a",
302 	"/2s2a/3s3e/5s5s/1s1i/4s4h",
303 	"/2s2a/3s3e/5s5s/1s1l/4s4a",
304 	"/2s2a/3s3e/5s5s/1s1l/4s4h",
305 	"/2s2a/3s3e/5s5s/4s4a",
306 	"/2s2a/3s3e/5s5s/4s4h",
307 	"/2s2a/3s3e/5s5s/4s4a",
308 	"/2s2a/3s3e/5s5s/4s4h",
309 	"/2s2a/3s3e/1s1i",
310 	"/2s2a/3s3e/1s1l",
311 	"/2s2a/3s3e/1s1i/4s4a",
312 	"/2s2a/3s3e/1s1i/4s4h",
313 	"/2s2a/3s3e/1s1l/4s4a",
314 	"/2s2a/3s3e/1s1l/4s4h",
315 	"/2s2a/3s3e/4s4a",
316 	"/2s2a/3s3e/4s4h",
317 	"/2s2a/3s3e/4s4a",
318 	"/2s2a/3s3e/4s4h",
319 	"/2s2a/5s5s",
320 	"/2s2a/5s5s/1s1i",
321 	"/2s2a/5s5s/1s1l",
322 	"/2s2a/5s5s/1s1i/4s4a",
323 	"/2s2a/5s5s/1s1i/4s4h",
324 	"/2s2a/5s5s/1s1l/4s4a",
325 	"/2s2a/5s5s/1s1l/4s4h",
326 	"/2s2a/5s5s/4s4a",
327 	"/2s2a/5s5s/4s4h",
328 	"/2s2a/5s5s/4s4a",
329 	"/2s2a/5s5s/4s4h",
330 	"/2s2a/1s1i",
331 	"/2s2a/1s1l",
332 	"/2s2a/1s1i/4s4a",
333 	"/2s2a/1s1i/4s4h",
334 	"/2s2a/1s1l/4s4a",
335 	"/2s2a/1s1l/4s4h",
336 	"/2s2a/4s4a",
337 	"/2s2a/4s4h",
338 	"/2s2a/4s4a",
339 	"/2s2a/4s4h",
340 	"/3s3e",
341 	"/3s3e/5s5s",
342 	"/3s3e/5s5s/1s1i",
343 	"/3s3e/5s5s/1s1l",
344 	"/3s3e/5s5s/1s1i/4s4a",
345 	"/3s3e/5s5s/1s1i/4s4h",
346 	"/3s3e/5s5s/1s1l/4s4a",
347 	"/3s3e/5s5s/1s1l/4s4h",
348 	"/3s3e/5s5s/4s4a",
349 	"/3s3e/5s5s/4s4h",
350 	"/3s3e/5s5s/4s4a",
351 	"/3s3e/5s5s/4s4h",
352 	"/3s3e/1s1i",
353 	"/3s3e/1s1l",
354 	"/3s3e/1s1i/4s4a",
355 	"/3s3e/1s1i/4s4h",
356 	"/3s3e/1s1l/4s4a",
357 	"/3s3e/1s1l/4s4h",
358 	"/3s3e/4s4a",
359 	"/3s3e/4s4h",
360 	"/3s3e/4s4a",
361 	"/3s3e/4s4h",
362 	"/5s5s",
363 	"/5s5s/1s1i",
364 	"/5s5s/1s1l",
365 	"/5s5s/1s1i/4s4a",
366 	"/5s5s/1s1i/4s4h",
367 	"/5s5s/1s1l/4s4a",
368 	"/5s5s/1s1l/4s4h",
369 	"/5s5s/4s4a",
370 	"/5s5s/4s4h",
371 	"/5s5s/4s4a",
372 	"/5s5s/4s4h",
373 	"/1s1i",
374 	"/1s1l",
375 	"/1s1i/4s4a",
376 	"/1s1i/4s4h",
377 	"/1s1l/4s4a",
378 	"/1s1l/4s4h",
379 	"/4s4a",
380 	"/4s4h",
381 	"/4s4a",
382 	"/4s4h",
383 	/* done */
384 	(char *)0
385 };
386 
387 
388 int
389 FascistLook(PWDICT *pwp, char *instring)
390 {
391 int i;
392 	char *password;
393 	int32 notfound;
394 	char rpassword[PATH_MAX];
395 
396 	notfound = PW_WORDS(pwp);
397 
398 	(void) strlcpy(rpassword, instring, TRUNCSTRINGSIZE);
399 	password = rpassword;
400 
401 	(void) strcpy(password, Lowercase(password));
402 	(void) Trim(password);
403 
404 	/*
405 	 * it should be safe to use Mangle with its reliance on PATH_SIZE
406 	 * since password cannot be longer than TRUNCSTRINGSIZE;
407 	 * nonetheless this is not an elegant solution
408 	 */
409 
410 	for (i = 0; r_destructors[i]; i++) {
411 	char *a;
412 
413 		if (!(a = Mangle(password, r_destructors[i]))) {
414 		    continue;
415 		}
416 
417 		if (FindPW(pwp, a) != notfound) {
418 		    return (DICTIONARY_WORD);
419 		}
420 	}
421 
422 	(void) strlcpy(password, Reverse(password), PATH_MAX);
423 
424 	for (i = 0; r_destructors[i]; i++) {
425 	char *a;
426 
427 		if (!(a = Mangle(password, r_destructors[i]))) {
428 			continue;
429 		}
430 		if (FindPW(pwp, a) != notfound) {
431 		    return (REVERSE_DICTIONARY_WORD);
432 		}
433 	}
434 
435 	return (0);
436 }
437 
438 int
439 DictCheck(char *password, char *path)
440 {
441 	PWDICT *pwp;
442 	int r;
443 
444 	if ((pwp = PWOpen(path, "rF")) == NULL)
445 		return (DATABASE_OPEN_FAIL);
446 
447 	r = FascistLook(pwp, password);
448 	(void) PWClose(pwp);
449 	return (r);
450 }
451