There exists a generalization of DBSCAN, known as "Generalized DBSCAN".
Actually for DBSCAN you do not even need a distance. Which is why it actually does not make sense to compute a similarity matrix in the first place.
All you need is a predicate "getNeighbors", that computes objects you consider as neighbors.
See: in DBSCAN, the distance is not really used, except to test whether an object is a neighbor or not. So all you need is this boolean decision.
You can try the following approach: initialize the matrix with all 1s.
For any two objecs that you consider similar for your application (we can't help you a lot on that, without knowing your application and data), fill the corresponding cells with 0.
Then run DBSCAN with epsilon = 0.5, and obviously DBSCAN will consider all the 0s as neighbors.