Your bad hash computes each byte of digest from only two bytes of message, resulting in very few small equations which can be solved by many automated tools.
I've made the assumption that
digest = (129*msg) XOR msg.
Expressing this hash in Cryptol we get:
badHash :  -> 
badHash msg = [ x ^ y | x <- mul | y <- (msg @@ (#[0..14] : [_]))]
mul = [ m * 129 | m <- msg ]
Now we can use Cryptol to leverage modern SMT solvers and find your message. However, there are many collisions with this hash function so to get a particular pre-image we need to solve for all satisfying solutions or know at least some of the pre-image of interest.
For example, say we have the hash for
Main> let x = badHash [255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
[0x71, 0xff, 0x81, 0x03, 0x81, 0x07, 0x81, 0x03, 0x81, 0x0f, 0x81,
0x03, 0x81, 0x07, 0x81, 0x03]
We can feed the digest into an SMT (in this case CVC4):
Main> :sat \msg -> badHash msg == x
(\msg -> badHash msg == x) [0xf2, 0x8d, 0x0c, 0x8f, 0x0e, 0x89,
0x08, 0x8b, 0x0a, 0x85, 0x04, 0x87, 0x06, 0x81, 0x00, 0x83]
And we could look for pre-images that start with the value 255:
Main> :sat \msg -> badHash msg == x && msg@0 == 255
(\msg -> badHash msg == x && msg @ 0 == 255) [0xff, 0x00, 0x01
,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
,0x0a, 0x0b, 0x0c, 0x0d, 0x0e] = True
Easy as the press of a button.