Dlaczego nie warto wspierać finansowo projektu open source AsmJit?

Krótka historia programisty (Petr Kobalicek), który chciał dotację za swój projekt open source AsmJit, ale nie za bardzo było mu w smak informację o dotacjach utrzymywać na stronie projektu.

Historia nie jest o pieniądzach, wspieram mnóstwo projektów programistycznych mniejszymi i większymi kwotami pieniędzy, ale jest dla mnie skrajnie nieuczciwe prosić o dotację, mieć na stronie projektu sekcję informującą o dotacjach i ludziach, którzy je przesłali, a potem te informacje potajemnie usuwać (nawet jeśli minęło kilka lat).

Początki projektu AsmJit

Wspierałem finansowo projekt open source AsmJit project od samego jego początku istnienia, kiedy dowiedziałem się o nim w 2010 roku. Dawno, dawno temu, nieprawdaż?

Od czasu do czasu sprawdzałem co nowego. W 2019 roku zauważyłem, że Petr usunął informację o moich dotacjach ze strony projektu, pozostawiłem komentarz w repozytorium projektu na GitHubie. Petr nie odpowiedział na komentarz, nie wysłał mi żadnego maila, ale się wściekł, że w ogóle o tym wspomniałem.

Chciałbyś żeby było o tym cicho, czyż nie Petr?

Żeby było jasne, przez lata kilkukrotnie wysyłałem pieniądze na ten projekt. Petr zapewniał mnie, że przez to, że wpłacałem dotację zamieści link do mojej strony (sam wyszedł z tą inicjatywą).

Jak to było naprawdę…

Nie myślałem o tym za wiele, bo dotacje były zrobione w 2010 (!) roku, ale dla pewności przeszukałem swoje maile, co konkretnie zaproponował Petr:

20 kwiecień 2010

Hi Bartek,

I’d like to thank you for your generous donation.

If you want I can add a link to your name and your site under the Donation in AsmJit main page (I looked at your site and you are interested in assembler so this is also related page). You are first who donated to the AsmJit project and you have my respect.

Thank you!

— Best regards

Petr Kobalicek http://kobalicek.com

Jak widać Petr sam zaproponował, że zamieści link do mojej strony jeśli tylko tego będę chciał! Drogi kolega zapomniał co sam proponował, a teraz w 2019 zarzekał się, że to była płatna promocja i dlatego usunął informację o tej dotacji…

Dotacje zrobiłem, gdy projekt w ogóle nie był popularny, ale dla mnie był bardzo przydatny, nie liczyłem na nic w zamian, więc cieszyłem się z tego co zaproponował sam Petr.

Petr chciał upublicznić kwoty dotacji, wieć proszę bardzo:

  • 2010.04.19 (dawno temu, co nie?) — 25 EUR
  • 2012.12.14–25 EUR
  • 2015.01.11–50 EUR
  • 2016.03.26–25 EUR

Śmieszne sumy jak na dzień dzisiejszy, ale to nie jest sens tej historii. Zacytuję co powiedział Petr Kobalicek w 2010 roku:

“You are first who donated to the AsmJit project and you have my respect.”

Co za miły facet ten Petr Kobalicek, ponieważ zarzucił mi w dyskusji na GitHubie, że moje dotacje to tak naprawdę była płatna promocja i w swojej złości postanowił, że już nie potrzebuje moich pieniędzy (teraz, co nie) i zwróci mi całość żebym się odpierdolił…

Hi Bartosz,

It’s sad that you have chosen a public channel to resolve a personal matter between us. I really appreciate all donations, including yours, however, I think that we should differentiate between a donation and a paid advertisement. You “donated” to advertise your own product and I kept that advertisement for a very long time, however, I don’t consider your donation as a lifetime obligation to provide you advertisement of your commercial product.

Initially I wanted to fix this by keeping you on the list by changing the text it to the current donors format, but since you escalated it rather quickly (without even trying to contact me directly) I suggest to return you back all your donations so we can just move on without wasting more time on this. Just send me your IBAN so I can make the payment. I verified the total sum I received from you was ~120.55 EUR (4 payments total, last payment from March 2016), the PayPal archive doesn’t display fees so I will send you the exact amount that I have received. Let me know if it’s not the correct amount, it’s just what I have found in history.

And a last thing. Would you mind me sharing the total amount I received from you and the last transaction date on that issue page? Since you created it and made this thing public with the intention to hurt the project I think it would be fair to add some economic details there so a possible reader can make his own picture about the matter.

Best, Petr

Petr zdecydował zwrócić całą kwotę dotacji. Ale ponownie, nie chodzi tutaj o pieniądze

Niewdzięczność po latach

Teraz, po prawie 10 latach odkąd stworzył swój projekt, nie potrzebuje już moich dotacji. Teraz, gdy jego projekt jest już bardzo popularny, teraz gdy ma korporacyjnych sponsorów i nie potrzebuje już żadnej finansowej pomocy i nie musi pamiętać o swoich skromnych początkach.

Petr Kobalicek

Mimo, że wszystko to stało się dawno temu, a Petr zwrócił mi całą kwotę dotacji sprzed prawie 10 lat, cała ta historia nie dawała mi spokoju, więc krótko i zwięźle – pierdolić Petra Kobalicka i jego fałszywy szacunek dla pierwszego supportera. Teraz mi lżej.

Narzędzia do reversingu w 2022

Zaktualizowana lista i przegląd narzędzi do reverse engineeringu z poprawionymi linkami oraz nowymi narzędziami.

https://www.pelock.com/pl/artykuly/przeglad-narzedzi-do-reverse-engineeringu

https://www.pelock.com/articles/reverse-engineering-tools-review

Jak na 2022 dodałem najnowsze osiągnięcie techniki, którego być może jeszcze nie znacie…

SoftIce

Java Obfuscator – JObfuscator v1.10

Mój obfuscator dla Javy – JObfuscator zyskał małą aktualizację, jeszcze nie jest idealnie, ale po mału wszystko dąży do perfekcji

Interfejs online do potestowania – https://www.pelock.com/jobfuscator/

v1.10 – 09.08.2022

  • Poprawiono błąd w kolejności deklaracji zmiennych przy wykorzystaniu obfuskacji zmieniającej linearną ścieżkę wykonywania kodu (dziękuję Yi Wu)
  • Automatycznie dodawana adnotacja dla środowiska IntelliJ @SuppressWarnings(InstanceVariableMayNotBeInitialized) przy obfuskacji ścieżki kodu
Java Obfuscator - JObfuscator
JObfuscator w wersji command line

Anti-Spam Form dla Yii2 Framework

Anti-Spam Form jest komponentem zastępującym standardowe formy ActiveForm dla Yii2 Framework z ochroną anty-spamową, które są niewidoczne w kodzie HTML dla botów spamowych i narzędzi do zbierania danych (tzw. harvestery).

Jaka jest idea stojąca za formularzami antyspamowymi?

Koncepcja jest prosta. Boty spamowe w większości przypadków są prostymi narzędziami. Potrafią czytać Twoją stronę, szukać znaczników <form> w kodzie HTML i sztucznie wypełniać pola formularza i wysyłać go.

Zwykły bot spamowy to w 99% przypadków web scraper napisany w Pythonie pobierający zawartość strony HTML bez wykonywania kodu JS.

Ale jedną rzeczą pominiętą w metodach wykrywania spamu jest to, że boty spamowe zwykle nie mogą przetwarzać kodu JavaScript. Jest to czasochłonne i wymaga interpretera JS do wykonania kodu na stronie. Aby to osiągnąć należy już wykorzystać bardziej złożone i wolniejsze silniki, zwykle oparte o Chromium.

Jak pokonać spam boty?

Proste – umieścić formularze HTML z zakodowanymi tagami HTML <form> w formie kodu JavaScript. Nie cały formularz, ale początkowy tag ze wszystkimi jego właściwościami.

Nagle boty spamowe nie są w stanie go znaleźć. Mniej spamu bez zbyt wiele pracy.

Zwykle kod formularza wygląda następująco:

<div class="active-form">
  <!--visible <form> tag -->  
  <form id="contact-form" action="/contact" method="post">
    <input type="hidden" name="_csrf" value="u18o4NxJC5lZEhHhjpMTd-c7p3ZzYzl0wvsXMiefJJ_0HWGpr1pm6x5Qa4vnpVw5o1yXNzEQ7USUlE9HVNlGzQ==">
    <div class="form-group field-contactform-name required">
      <label class="control-label" for="contactform-name">Name</label>
      <input type="text" id="contactform-name" class="form-control" name="ContactForm[name]" aria-required="true">
      <p class="help-block help-block-error"></p>
    </div>
    <div class="form-group field-contactform-email required">
      <label class="control-label" for="contactform-email">Email</label>
      <input type="email" id="contactform-email" class="form-control" name="ContactForm[email]" aria-required="true">
      <p class="help-block help-block-error"></p>
    </div>
    <div class="form-group field-contactform-subject required">
      <label class="control-label" for="contactform-subject">Subject</label>
      <input type="text" id="contactform-subject" class="form-control" name="ContactForm[subject]" aria-required="true">
      <p class="help-block help-block-error"></p>
    </div>
    <div class="form-group field-contactform-body required">
      <label class="control-label" for="contactform-body">Body</label>
      <textarea id="contactform-body" class="form-control" name="ContactForm[body]" rows="6" aria-required="true"></textarea>
      <p class="help-block help-block-error"></p>
    </div>
    <div class="form-group field-contactform-verifycode">
      <label class="control-label" for="contactform-verifycode">Verification Code</label>
      <div class="row">
        <div class="col-xs-4 col-sm-3 col-md-3">
          <img id="contactform-verifycode-image" src="/site/captcha?v=62cff29d6ebe55.89254929" alt="">
        </div>
        <div class="col-xs-2 col-sm-3 col-md-3">
          <input type="text" id="contactform-verifycode" class="form-control" name="ContactForm[verifyCode]">
        </div>
        <div class="col-xs-6 col-sm-6 col-md-6">
          <button type="submit" class="btn btn-block btn-primary" name="contact-button">Send</button>
        </div>
      </div>
      <p class="help-block help-block-error"></p>
    </div>
  </form>
</div>

Po wykorzystaniu komponentu anty-spamerskiego:

<div class="active-form">
  <!-- <form> tag dynamically generated with the JavaScript code -->    
  <script>
    document.write(atob("PGZvcm0gaWQ9ImNvbnRhY3QtZm9ybSIgYWN0aW9uPSIvY29udGFjdCIgbWV0aG9kPSJwb3N0Ij4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX2NzcmYiIHZhbHVlPSJ1MFczN0JLaDJOQko2Q2lVeTFxc3R3OEp6aC1mcUxxOXRnOEpQem9CUjZfMEJfNmxYX0sxb2c2cVV2NmliT1A1UzI3LVh0M2F6bzNnWUZGS1NVY2xfUT09Ij4="));
  </script>
  <div class="form-group field-contactform-name required">
    <label class="control-label" for="contactform-name">Name</label>
    <input type="text" id="contactform-name" class="form-control" name="ContactForm[name]" aria-required="true">
    <p class="help-block help-block-error"></p>
  </div>
  <div class="form-group field-contactform-email required">
    <label class="control-label" for="contactform-email">Email</label>
    <input type="email" id="contactform-email" class="form-control" name="ContactForm[email]" aria-required="true">
    <p class="help-block help-block-error"></p>
  </div>
  <div class="form-group field-contactform-subject required">
    <label class="control-label" for="contactform-subject">Subject</label>
    <input type="text" id="contactform-subject" class="form-control" name="ContactForm[subject]" aria-required="true">
    <p class="help-block help-block-error"></p>
  </div>
  <div class="form-group field-contactform-body required">
    <label class="control-label" for="contactform-body">Body</label>
    <textarea id="contactform-body" class="form-control" name="ContactForm[body]" rows="6" aria-required="true"></textarea>
    <p class="help-block help-block-error"></p>
  </div>
  <div class="form-group field-contactform-verifycode">
    <label class="control-label" for="contactform-verifycode">Verification Code</label>
    <div class="row">
      <div class="col-xs-4 col-sm-3 col-md-3">
        <img id="contactform-verifycode-image" src="/site/captcha?v=62cff214a00af2.73036299" alt="">
      </div>
      <div class="col-xs-2 col-sm-3 col-md-3">
        <input type="text" id="contactform-verifycode" class="form-control" name="ContactForm[verifyCode]">
      </div>
      <div class="col-xs-6 col-sm-6 col-md-6">
        <button type="submit" class="btn btn-block btn-primary" name="contact-button">Send</button>
      </div>
    </div>
    <p class="help-block help-block-error"></p>
  </div>
  </form>
</div>

Kody źródłowe https://github.com/PELock/yii2-anti-spam-form

Paczka dla PHP https://packagist.org/packages/pelock/yii2-anti-spam-form