2021. július 27., kedd

No More Ransom - ransomware decrypter

Az informatika fejlődésének természetes velejáróként tekinthető a kibertámadások szaporodása és erősödése.

Napjaink egyik legnépszerűbb támadási típusa a ransomware, vagyis a zsarolóvírus, aminek a neve tálalóan írja le a működését: bejutva a készülékre titkosítja a rajta lévő adatokat, ezáltal a felhasználó számára elérhetetlenné téve azokat, és azt ígéri, hogy váltságdíj ellenében visszaadják a hozzáférést. 

A helyzet javítására 2016-ban létrehozták a No More Ransom weboldalt, ahol számos ransomware típuscsaládhoz található a dekódoló eszköz, ráadásul a lista egyre csak bővül. Érdemes egy próbát tenni vele, ha belefutna valaki egy ransomware-be.

Sajnos nem mindegyikhez létezik még ilyen dekódoló, így továbbra is a legjobb védekezés a megelőzés, amihez a No More Ransom tanácsokkal is szolgál.











2019. december 31., kedd

SourceTree egyszercsak nem indul

Windows környezetben a SourceTree indításakor az a jelenség fogadott, hogy az indulást követően dolgozott valamin a CPU-n, majd bármilyen látható hibajelzés nélkül azonnal be is zárult még a betöltés során. Megpróbáltam magát a SourceTree-t is és az OS-t is újraindítani, de nem javult a helyzet.

A naplófájlt megnézve, az alábbi hibaüznetet találtam:
C:\Users\<username>\AppData\Local\Atlassian\SourceTree\sourcetree.log
ERROR [2019-12-02 11:23:45,180] [1] [SourceTree.App] [.ctor] - finish EnsureSquirrelExecutionStubIsCopied
ERROR [2019-12-02 11:23:45,382] [1] [SourceTree.App] [OnStartup] - Failed to start

System.NullReferenceException: Object reference not set to an instance of an object.

at SourceTree.Notifications.NotificationsManager.SetOwner(NotificationDialogWindow notificationWindow)
at SourceTree.Notifications.NotificationsManager.ShowNotificationDialog[T](NotificationDialogWindow notificationWindow, Tuple`2 customAction, VistaTaskDialogIcon icon)
at SourceTree.Notifications.NotificationsManager.ShowNotificationDialog[T](String title, String message, Tuple`2 customAction, String cancelLabel, String suppressionSetting, Action`1 suppressionChangedAction, Object contentControl, String contentCommandLabel, Action contentAction)
at SourceTree.Notifications.NotificationsManager.ShowNotificationDialogWithYesConfirmation(String title, String message, String details)
at SourceTree.Configuration.WpfSpellCheckerPreFlightCheck.Run()
at SourceTree.AppRoot.RunPreFlightChecks()
at SourceTree.AppRoot.OnStartup(StartupEventArgs e)
at SourceTree.App.OnStartup(StartupEventArgs e)

A hiba az Atlassian issue tracker szerint a 2.3.5-ös verzióban javítva lett, így az elsődleges javítást a frissítés jelenti. Előfordulhat azonban olyan szituáció is, hogy nem akarunk vagy éppen nem tudunk frissíteni valami miatt, ekkor az automatikus takarítást engedélyezve is feléleszthető:
C:\Users\<username>\AppData\Local\Atlassian\SourceTree.exe_Url_<guid>\<sourcetree_version>\user.config
<setting name="AutomaticallyCleanUpDictionaryFiles" serializeAs="String">
  <value>True</value>
</setting>

2018. május 27., vasárnap

XAMARIN és a WCF

A ritka kivételektől eltekintve szinte mindegyik mobil alkalmazás kommunikál valamilyen backend rendszerrel, most csupán a Windows  Communication Foundation (WCF) vonalra térnék ki.

Sok helyen lehet találkozni olyannal, hogy nem működik a WCF Xamarin alatt, pedig csupán néhány korlátozással kell együtt élni a cél elérése érdekében.

Ezen a linken elérhető egy követhető leírás Xamarinhoz arról, hogyan kell összekötni egy WCF-es kiszolgálóval. Ehhez tennék kiegészítést néhány speciális esetet megvizsgálva.

Korlátozások

  • Nincs XAML konfig
A "hagyományos" XML alapú konfigurációs fájlokkal tényleg nem lehet megvalósítani, mivel nem lehet csak úgy odatenni az indítófájl mellé. Másfelől .NET C# alatt, - hasonlóan a WPF UI vezérlőkhöz - ami konfig fájlban XAML-lel leírható, az C# kóddal is. Ezt használja ki a fentebb linkelt tutoriál is.

  • Nincs NetTCPBinding
Fontos megjegyezni, hogy mobilon nem létezik a NetTCPBinding, csak valamilyen *HttpBinding típust lehet használni.

  • Nincs EndpointBehaviors
PCL készítésekor egy WCF kliensben a Behavior helyett az EndpointBehaviort kell használni, ami Windows RT-n még elfut, de Android és iOS rendszereken a MONO alatt NotImplementedExceptionnel elszáll. Szerencsére reflectionnel kinyerhető a megoldás:
//client.Endpoint.EndpointBehaviors.Add(new EndpointBehavior());

//client is of type System.ServiceModel.ClientBase<T>
var prop = client.Endpoint.GetType()
                 .GetTypeInfo()
                 .GetDeclaredProperty("Behaviors");
var obj = (KeyedCollection<Type, IEndpointBehavior>)prop
                 .GetValue(client.Endpoint);
obj.Add(new EndpointBehavior());

Ugyanez a helyzet a MessageInspectorral is:
//clientRuntime.ClientMessageInspectors.Add(new MessageInspector());

var prop = clientRuntime.GetType()
                        .GetTypeInfo()
                        .GetDeclaredProperty("MessageInspectors");
var obj = (ICollection<IClientMessageInspector>)prop
                        .GetValue(clientRuntime);
obj.Add(new MessageInspector());

Wrapper a WCF hívás körül

Korábban már írtam arról, hogyan célszerű felkészülni arra, ha a WCF kliens hívása kezeletlen hibára fut. Ilyenkor nem szabad a Close()-t ráhívni, mint ahogy azt teszi alapértelmezetten a USING, helyette Abort() kell.

Async/await és a WCF

Xamarin alatt is használhatók az async/await kulcsszavak, amik tökéletesen illeszkednek az aszinkron WCF hívások köré. Bővebb leírás itt található.

public class WcfServiceWrapper:IWcfServiceWrapper
{
    private IWcfService _wcfService;

    public WcfServiceWrapper(IWcfService wcfService)
    {
        if (wcfService == null) throw new ArgumentNullException("wcfService");

        _wcfService = wcfService;
    }

    public async Task<string> GetDataAsync(int number)
    {
        return await new TaskFactory()
          .FromAsync<int,string>(
            _wcfService.BeginGetData, 
            _wcfService.EndGetData, 
            number, 
            null, 
            TaskCreationOptions.None
          );
    }
}

.NET Portable Assembly


Ha esetleg bármi miatt szeretnénk hozzáadni mobilon is használható .NET portable assembly-t, akkor azok itt találhatók:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\

Generált proxy és az IExtensibleDataObject


A WCF által publikált WSDL alapján le lehet generálni a hálózaton keresztül utazó osztályokat. Amennyiben a DataContractSerializert használjuk szerver oldalon, akkor ráteszi az IExtensibleDataObject interfészt és a hozzátartozó ExtensionDataObject tulajdonságot ezen generált osztályokra. Önmagában nem lenne baj, hiszen a System.Runtime.Serialization.dll-ben elérhető ez az interfész és osztály, van belőle portable DLL is, gondolhatnánk, hogy majd hozzáadjuk a PCL projekthez és készen vagyunk. Nos, ez az út nem járható, nem engedi hozzáadni azzal az üzenettel, hogy már referálja a sajátját. A probléma az, hogy abban viszont nincsenek benne ezek. 

1) Egyik megoldás lehet, hogy a kiszolgáló oldalon a ServiceContract attribútumban vagy akár magában a DataContractSerializerben bekapcsoljuk, hogy IgnoreExtensionDataObject. Viszont ezek a nevüknek megfelelően csak annyit csinálnak, hogy figyelembe kell-e venni az ExtensionDataObjectet vagy sem, de továbbra is megmaradnak az osztályokban. Elvileg a platformspecifikus projekthez már hozzá lehet adni ezt a dll-t, és utána működhet valahogy a DependencyService-en keresztül, de ezt a vonalat nem próbáltam ki.

2) Ha biztosan tudjuk, hogy egyáltalán nem használjuk semmire az ExtensionDataObjectet, akkor egy-egy üres osztállyal és interfésszel könnyedén orvosolható a helyzet:
 public interface IExtensibleDataObject { ExtensionData { get; set; } }  public sealed class ExtensionDataObject {}

2018. január 5., péntek

Unity - NativePlugins visszaírja a beállításokat újraindításkor

Egyik cross platform fejlesztés során a NativePlugins nevű plugint kellett használnom néhány funkcióhoz, hogy azok a megszokott módon működjenek az adott operációs rendszeren. A plugin több mindenre is képes, amelyeket grafikus felületen lehet pipálgatva szabályozni, hogy mire van szükség. Nekem éppenséggel a megosztás kezelése és egy fájl kiválasztó modul kellett csak belőle:

Funkciók kiválasztása
A problémám a Unity első újraindítását követően jelentkezett, amikor Androidra akartam fordítani, de elpukkant, mondván, a Billing modul IInAppBillingService osztálya kétszer is hozzá van adva a projekthez. Másik árulkodó jel az volt, hogy újabb NPSettings.asset és EditorNotificationCenter.asset fájlok keletkeztek a fájlnevek végén növekvő számozással akárhányszor elindult a Unity és néha annak bezárása nélkül is. Megnézve az NP beállításait, szomorúan tapasztaltam, hogy minden visszaállt az alapértelmezett értékre: mindegyik funkció be volt pipálva és a Billing modul ütközött a már korábban használttal. 

Az NP szerkesztőfelületén az Inspectorból elérhető egy egészen mutatós leírás hozzá, de ilyen jelenségről nem írt, ami akár még abból is adódhatott, hogy a leírás korábbi verzióhoz tartozott.

Végül az NPSettings.cs fájlban meglett a titok, miszerint statikus konstruktorban szerepelt egy olyan kódrészlet, ami UnityEditorban mindig újragenerálta a beállításokat, ha egy bizonyos DISABLE_NPSETTINGS_GENERATION szimbólum nincs definiálva.

Ezt hozzáadva az Edit/Unity Project Settings/Player settings menüpont Scripting Define Symbols listájába, helyreállt a rend és többé nem generált új asset fájlokat és megtartott a beállításokat.
DISABLE_NPSETTINGS_GENERATION beállítása

2017. augusztus 12., szombat

Hiányzó Google API verzió Android Studio-ban

Andriod Studioban szerettem volna betölteni egy projektet, de elakadt, mondván, nem található a "Google API X verzió". Segítőkészen felajánlotta, hogy az SDK managerrel letölthető. Ennek megfelelően cselekedtem, majd örömmel nyugtáztam a kezelőben, hogy az állapota "installed", így ismét rápróbáltam a projektre, viszont a hibaüzenet ismét jelentkezett.



Az SDK managerben a "Show package details" gombot kattintva jött elő a kapcsolódó komponensek listája, amiben látszott, hogy valóban nincs minden telepítve. A részleteknél kellett egyesével kipipálni, hogy tegye fel a kívánt elemeket is. Ezt követően már sikeresen lefutott a betöltés.



Tanulság a történetből, hogy a fordító nem hazudik: ha azt mondja, hogy valami nincs telepítve, akkor az tényleg nincs, függetlenül attól, hogy az SDK manager azt írja, hogy "installed", amiből az átlagember jogosan hihetné, hogy márpedig telepített.

2017. július 11., kedd

Egér/billentyűzet közvetlen csatolása VMWARE alá

Beruháztam egy Logitech vezeték nélküli programozható gombokkal rendelkező egérre. Amikor megpróbáltam egy VMWARE virtuálisgép alatt is használni, akkor szembesültem vele, hogy a VM csak az alap három gombot értelmezte és az extra gombokra vagy semmit nem csinált vagy pedig valamilyen karakterként értelmezte. 

Feltelepítettem a VM alá is az egér vezérlőprogramját, végtére is ilyen szempontból az egy teljes értékű, független gép, így jogosan hiányolhatja. A telepítést követően azzal fogadott a VM alatt, hogy nem talált megfelelő eszközt.

Hiába kapcsoltam be a konkrét VM beállításai között, hogy mindegyik elérhető USB eszközt lássa, a vevőegységet továbbra sem érzékelte.




A .vmx fájlba kellett az alábbi bejegyzéseket hozzáadnom:

mouse.vusb.enable = "TRUE"
mouse.vusb.useBasicMouse = "FALSE"
usb.generic.allowHID = "TRUE"
usb.generic.allowLastHID = "TRUE"

A negyedik beállítás nélkül is látszott már az USB-s vevőegység a VM számára, de nem engedte hozzárendelni, mondván, a gazdarendszernek szüksége van rá, mivel ez egy beviteli eszköz. Miután a negyediket is hozzáadtam, csak egy figyelmeztetés dobott fel, hogy ha ezt megteszem, akkor a gazdarendszer egy inputtal szegényebb lesz. Ez egy fontos információ, tehát csak olyan esetben ajánlott ezt a megoldást választani, ahol van még legalább egy "tartalék" is az adott eszközből (legyen az egér vagy billentyűzet), mert ezzel a módszerrel kizárólagosan a VM fogja kezelni.

2017. június 24., szombat

XAMARIN app nem indul eszközön debugban

Visual Studio-val szerettem volna egy XAMARIN.FORMS alkalmazást Android telefonon tesztelni, de az alábbi hibaüzenet fogadott:

The application could not be started. Ensure that the application has been installed to the target device and has a launchable activity (MainLauncher = true).
Additionally, check Build->Configuration Manager to ensure this project is set to Deploy for this configuration.

Attól függetlenül, hogy sikeresen lefordult és a deploy során sem panaszkodott semmire, mégsem találta meg a telefonon az alkalmazást. Az eszköz főmenüjét megnézve, valóban nem volt indítóikon. A helyzetet tovább bonyolította, hogy nem mindegyik eszköz reagált így, volt, amelyiken ment. Ráadásul a problémások másik gépen jól működtek.

A vizsgálódás során kipróbáltam, hogy ha másik csomagazonosítót állítok be, akkor mit reagál. Az új azonosítóval gond nélkül elindult mindegyik eszközön.

A problémás eszközökön mindegyiknél megtaláltam az Alkalmazások listájában a régi csomagazonosítóval az appot, tehát valamilyen formában már telepítve volt egy verzió. Végül összeállt a kép: a Visual Studio-val történő telepítés során - számomra ismeretlen célból - valamilyen egyedi azonosítót is generál az alkalmazásba - talán a Fast Deploymenttel lehet összefüggésben -, ami megakadályozza, hogy egy másik VS rá tudjon frissíteni a már telepített verzióra.

A megoldás az volt, hogy kézzel el kellett távolítani a korábbi verziót, ami a másik VS-től származott és azt követően mindegyik készüléken működött.