Word of warning: if you come to this post to find the solution only and you are not interested in the explanation how to do it then scroll down to the last section. I don’t expect any non-Polish speaker to do it so that section is not in English. And now the same warning in Polish:

Uwaga! Jeżeli interesuje Cię jak dałoby się uruchomić program Profesor Klaus Intensywny Kurs bez mikrofonu, to przewiń do ostatniej sekcji tego wpisu. Większość informacji tutaj dotyczy czegoś innego. Wpis ma charakter edukacyjny i nie jest nakłanianiem do modyfikowania aplikacji, łamania licencji lub ingerencji w oprogramowanie w jakikolwiek inny sposób.

Also, this post is only for education purposes. I am not encouraging anyone to modify the application or break the license agreements.

Today a short Reverse Engineering story to fix the application Profesor Klaus Intensywny Kurs. That’s a Polish application for learning German language. It checks for the microphone at start and shuts down when it’s not available. Microphone is not needed at all, however. Since I was using it in a remote desktop scenario without Remote Desktop Session Host (in Administrator licensing mode on Windows Server) I was looking for some workaround.

Reverse engineering the application

And another word of warning: I am not a reverse engineer and I don’t do it in an optimal way. There are probably better tools and approaches. If you are looking for best practices — that’s probably not the right place.

Okay, let’s go. The only thing I knew about the application is that it checks for the microphone when started and then exits if it cannot find one. So let’s launch API Monitor and see what it does. Start the API Monitor, select “Audio and Video” APIs, add breakpoint on waveInGetNumDevs and run the application, like this:

it immediately shows this:

Okay, so there is some API called. Let’s continue a few times and then the message dialog appears saying that application won’t run.

Let’s try it again. This time, let’s attach WinDBG on the first time Audio API is called. Let’s run it and then see this:

We have some exception with code 0eedfade. This is a well-known code for Delphi language exceptions. Let’s start the application again and catch the exception:

Okay, now we have the line where the method was called. What is this method doing? Let’s restart, add a breakpoint and see:

Well, that’s long. However, we see that almost immediately (line 95) we load the constant identifying the exception type. So it looks like call Intensywny_kurs+0x5508 (00405508) calls some well known procedure for throwing the exception.

What can we do now? Well, let’s see what arguments we pass to the method (and if any). However, this is x86 architecture so we don’t know what the previous instruction was. We cant just start decoding because instructions have different lengths. Let’s give it a try:

I have no idea if that’s the code which is actually executed. It looks kind of plausible, but cannot be sure. However, let’s give it a go.

We know there is some method called which throws the exception. Exception is probably prepared at this point. How about just not throwing it? Let’s restart the application and remove the call with no ops:

So we check the code initially, modify it, and then check again. Let’s now resume the application and see it works.

Okay, now the tricky part. We’d like to remove that code forever to be able to just run the application normally.

To do that we need a hexeditor. I used Frhed. Open the exe file and look for the following:

Luckily enough, there is only one occurrence:

If you check bytes after the pattern we can see they match our instructions. So it looks like that’s the code. Modify it with series of nops and it works!

And now solution for Polish speakers.

Uruchomienie Profesor Klaus Intensywny Kurs bez mikrofonu

Uwaga: Ta sekcja tłumaczy jak wyglądałaby zmodyfikowana aplikacja, która nie sprawdzałaby mikrofonu przy starcie. Oczywiście nie zachęcam do modyfikowania aplikacji, co jest sprzeczne z licencją, nie załączam też żadnych plików należących do autorów. Cały wpis ma charakter edukacyjny.

Uwaga 2: Wszystkie modyfikacje dotyczą wersji 1.1.0.103 pliku wykonywalnego. Jeżeli masz inną wersję, rozwiązanie poniżej może nie działać.

Uwaga 3: Modyfikowanie aplikacji jest niebezpieczne i może spowodować jej trwałe uszkodzenie. Zrób kopię zapasową, a jeżeli nie rozumiesz poniższego opisu, to poproś o pomoc kogoś bardziej doświadczonego.

Rozwiązanie automatyczne

Otwórz PowerShell z uprawnieniami administratora i przejdź do katalogu z plikiem Intensywny_kurs.exe (najprawdopodobniej w C:\Edgard\Profesor Klaus - Intensywny kurs):

A następnie skopiuj i wykonaj ten kod:

To utworzy plik Intensywny_kurs_bez_mikrofonu.exe. Jeżeli po wykonaniu ostatniej komendy zobaczyłeś wynik

to wszystko zakończyło się poprawnie.

Rozwiązanie ręczne

Na początku potrzebujemy edytora binarnego Frhed (nie jestem w żaden sposób powiązany z autorami tej aplikacji).

Po instalacji edytora, uruchom go jako administrator i otwórz plik przez File -> Open.... Wybierz plik Intensywny_kurs.exe (najprawdopodobniej z lokalizacji C:\Edgard\Profesor Klaus - Intensywny kurs.

Wciśnij CTRL + F aby otworzyć okno szukania, a następnie poszukaj tego ciągu:

Powinno być tylko jedno wystąpienie, jak poniżej:

Znaleziony ciąg musisz zastąpić wartościami

jak poniżej:

Zapisz plik przez CTRL + S, zamknij edytor, a następnie uruchom Profesora Klausa.