Единственный способ (хороший) защитить свое приложение - сделать его клиент-серверным и предоставить конечному пользователю лишь клиентский интерфейс - скинув в него все что не жалко пустить на анализ в дизассемблер и отладчик. А основной (и одновременно минимальный) функционал вынести на свой сервер. Кода, к которому нет доступа, - только тот код не взломать.