Unfortunately, "It depends".
The Liskov Substitution principle (LSP), in general is undefined. It's supposed to take the idea of type substitutability (in the type theoretic sense) and extend it into the realm of behaviours. That is, a sub-type's behaviour must "extend" the behaviour of the super-type. The issue is that it does not give a good definition of what those behaviours are and how you can test if you are changing them.
There are many examples of what apparently constitutes a violation of the LSP. Most of those are flawed as they fail to take into the prerequisite that all type substitutions, including all valid covariant and contravariant alterations to the method(s) and type parameters in the interface, are correct. The LSP is an extension to this type checking. Additionally, the ability to use this variance in the signatures is a requirement to correctly implement many behaviours of an interface, therefore satisfying the LSP.
E.g. Take the Clone() method. If you have an abstract class Mammal and a subclass Human, the Human class MUST return a Human when Clone is called. This is because there is expected behaviour of the Clone() method that is codified in the use of the English word "clone". Returning a Mammal violates that expected behaviour.
While the correct implementation of the Clone() method is impossible in C#, the virtual keyword enables a "close enough" approximation, therefore not only is virtual NOT a violation of the LSP, but it's a requirement IF you use base classes.
Lastly, the LSP, like all the principals in SOLID, is more a collection of "code smells" than an actual definable rule. They are there to give you a way of discussing why code isn't good. It does not tell you what the real issue is with the code, nor does it tell you how to correct it or how to prevent it from occurring.