1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
-- UMASS{functi0n4lsh17}
{-# LANGUAGE ForeignFunctionInterface #-}
module Crackme where
import Data.Char
import Foreign.C.Types
import Foreign.C.String
rotate :: Int -> [a] -> [a]
rotate _ [] = []
rotate n xs = zipWith const (drop n (cycle xs)) xs
checkPairs :: Int -> [(Int, Int)] -> Bool
checkPairs _ [] = True
checkPairs 0 ((a, b):[]) = ((a, b) == (208,42))
checkPairs 1 ((a, b):cdr) = ((a, b) == (120,-10)) && checkPairs 0 cdr
checkPairs 2 ((a, b):cdr) = ((a, b) == (126,-28)) && checkPairs 1 cdr
checkPairs 3 ((a, b):cdr) = ((a, b) == (189,19)) && checkPairs 2 cdr
checkPairs 4 ((a, b):cdr) = ((a, b) == (240,-10)) && checkPairs 3 cdr
checkPairs 5 ((a, b):cdr) = ((a, b) == (163,53)) && checkPairs 4 cdr
checkPairs 6 ((a, b):cdr) = ((a, b) == (101,3)) && checkPairs 5 cdr
checkPairs 7 ((a, b):cdr) = ((a, b) == (214,6)) && checkPairs 6 cdr
checkPairs 8 ((a, b):cdr) = ((a, b) == (163,-67)) && checkPairs 7 cdr
checkPairs 9 ((a, b):cdr) = ((a, b) == (213,-3)) && checkPairs 8 cdr
checkPairs 10 ((a, b):cdr) = ((a, b) == (168,64)) && checkPairs 9 cdr
checkPairs 11 ((a, b):cdr) = ((a, b) == (209,-11)) && checkPairs 10 cdr
checkPairs 12 ((a, b):cdr) = ((a, b) == (158,62)) && checkPairs 11 cdr
checkPairs 13 ((a, b):cdr) = ((a, b) == (222,12)) && checkPairs 12 cdr
checkPairs 14 ((a, b):cdr) = ((a, b) == (218,-14)) && checkPairs 13 cdr
checkPairs 15 ((a, b):cdr) = ((a, b) == (222,24)) && checkPairs 14 cdr
checkPairs 16 ((a, b):cdr) = ((a, b) == (193,-27)) && checkPairs 15 cdr
checkPairs 17 ((a, b):cdr) = ((a, b) == (200,-34)) && checkPairs 16 cdr
checkPairs 18 ((a, b):cdr) = ((a, b) == (167,-37)) && checkPairs 17 cdr
checkPairs 19 ((a, b):cdr) = ((a, b) == (200,-46)) && checkPairs 18 cdr
checkPairs 20 ((a, b):cdr) = ((a, b) == (168,2)) && checkPairs 19 cdr
checkPairs i pairs = False
keyCheck :: String -> Bool
keyCheck key = checkPairs 20 pairs
where pairs = map (\(x, y) -> (ord x + ord y, ord x - ord y)) $ zip key $ rotate 4 key
keycheck_hs :: CString -> IO CInt
keycheck_hs encoded =
do key <- peekCString encoded
return $ if (keyCheck key) then 1 else 0
foreign export ccall keycheck_hs :: CString -> IO CInt
|