Chłopaki sfabrykowali dongla i postawili lipny serwer odpowiadający "licencja aktywna" :)
No tak, dlatego apka powinna implementować MTLS'a . Dodatkowo apka powinna mieć zahardkodowany dodatkowy klucz publiczny a same binaria być odpowiednio zobfuskowane, żeby tego klucza łatwo nie wydobyć. Wtedy odpowiedź "licencja aktywna" powinna posiadać dodatkowy podpis a klient ten podpis weryfikuje swoim kluczem czy pochodzi od znanego sobie serwera. Adres serwera też powinien być wyryty w kamieniu czyli zahardkodowany i zobfuskowany. Dodatkowo klient powinien wysyłać periodycznego healtchecka z raportem ze swoim stanem tak, żeby serwer mógł zdeterminować czy stan klienta jest taki jaki powinien być (nie podmieniony klucz publiczny itp). Jeżeli klient nie wysyła healthchecków przez dłuższy czas to też już o czymś świadczy.
To wszystko też oczywiście da się obejść, ale jest tego kilka warstw (MTLS, obfuskacja, wersyfikacja podpisu, healtchecki) co sprawia, że staje się to czasochłonne a przez to mniej opłacalne. Jest jeszcze inna kwestia - trzeba to tak zrobić żeby klient, który uczciwie kupił nie czuł się jak przestępca i nie był ukarany za to, że dostawca internetu leci w kulki i postanowil nie świadczyć usługi przez pół dnia.
Generalnie temat nie jest prosty, samodzielne robienie takich rzeczy to orka na ugorze. Jeżeli to pierwsza próba zaimplementowania czegoś takiego, to oprócz dongle'a nie wychodziłbym poza MTLS'a i obfuskację.