Prosty przykład, jak skompilować i wywołać dynamiczną metodę C#, wykorzystując wbudowany mechanizm kompilacji w .NET.
Programowanie
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
Konferencja na 25-lecie Studenckiego Koła Naukowego Informatyków „KOD”
Informatyka to Twoja pasja lub wiążesz z nią swoją przyszłość? Intresują Cię nowoczesne technologie? A może zwyczajnie masz chwilę, i chciałbyś się dowiedzieć czegoś nowego w tym temacie?
Świetnie się składa, bo Studenckie Koło Naukowe Informatyków „KOD” właśnie organizuje konferencję na 25 – lecie swojej działalności!
https://kod.prz.edu.pl/konferencja
Przewodniczyć jej będą specjaliści z wieloletnim doświadczeniem w IT, którzy przedstawią prelekcje na temat pracy w branży. Zaprezentują się również studenci Politechniki Rzeszowskiej, którzy pokażą wiele różnorodnych, innowacyjnych projektów wykonanych podczas pracy w kole (m.in. prezentacja systemu operacyjnego MicrOS oraz gry Roguelike).

Podczas wydarzenia przewidziane są także wyjątkowe konkursy z nagrodami.
Konferencja odbędzie się 6 kwietnia 2022r. i rozpocznie się o godzinie 10:00 w Auli Politechniki Rzeszowskiej (budynek V).
Istnieje również możliwość wzięcia udziału w formie zdalnej – na YT, Facebooku i stronie internetowej wydarzenia www.skni25.pl
Serdecznie zapraszamy studentów, pasjonatów i pracowników IT oraz wszystkich zainteresowanych. 🙂
WSTĘP CAŁKOWICIE DARMOWY, JEDNAK ILOŚĆ MIEJSC NA WYDARZENIE STACJONARNE OGRANICZONA! 🙂
Czekamy właśnie na Ciebie!
JObfuscator v1.09 – Obfuskator Java dla Androida
Wypuściłem właśnie małą aktualizację dla swojego obfuskatora dla języka Java – JObfuscator. Poprawka naprawia błąd w obsłudze adnotacji, który powodował problemy z szyfrowaniem stringów.
https://www.pelock.com/products/jobfuscator
Jeśli chcecie żeby wasz kod tak wyglądał i sprawiał nie lada uciechę każdemu kto rzuci się na waszą aplikację na Androida z dekompilatorem, polecam swój produkt.

PELock v2.11 – Zabezpieczenie Oprogramowania
Wypuściłem mały update PELock – czyli jedynego polskiego systemu zabezpieczenia 32-bitowych aplikacji EXE/DLL/OCX wraz z systemem kluczy licencyjnych, bazującym na asymetrycznej kryptografii RSA.
Zmiany
- Zabezpieczenie z linii komend z parametrem
/autozabezpieczy wszystkie pliki znajdujące się na liście projektu (wcześniej zabezpieczany był tylko pierwszy plik) - Dodano język francuski interfejsu użytkownika (dziękuję Terry)

Wersja demonstracyjna do pobrania ze strony:
https://www.pelock.com/pl/produkty/pelock/pobierz
Przykłady użycia dla m.in. Delphi/Freepascal, C/C++, PowerBASIC, PureBasic, generowanie licencji, sprzętowych identyfikatorów etc. na GitHubie:
https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK
Antidebugging w aplikacjach Android
Dzisiaj analizowałem sobie jedną starszą aplikację i natknąłem się na ciekawy kod, sprawdzający kilka rzeczy, których autorzy sobie nie życzą (to nie jest koncert życzeń), marnie zakamuflowanych pod fałszywymi nazwami 😀
Sprawdzane są m.in.
- Czy urządzenie było zrootowanie i czy dostępne są narzędzia takie jak np. komenda su.
- Czy podpięty jest debugger
- Czy zainstalowane są ehem wrogie aplikacje
Kod mówi więcej niż słowa, dlatego spójrzcie sami, może komuś ta wiedza się kiedyś przyda, z zastrzeżeniem, że to starsza aplikacja i kilka rzeczy mogło się już zmienić.
using System;
using System.Collections.Generic;
using System.IO;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Xamarin.Forms;
namespace Abc
{
// Token: 0x02000010 RID: 16
public class CalendarService : ICalendarService
{
// Token: 0x06000044 RID: 68 RVA: 0x000080A5 File Offset: 0x000062A5
public bool IsDateCorrect()
{
return this.IsDayCorrect() || this.IsProperUtcFormat() || this.IsMonthCorrect() || this.IsCurrentMonth() || this.IsItReallyCurrentYearAlready();
}
// Token: 0x06000045 RID: 69 RVA: 0x000080D0 File Offset: 0x000062D0
public bool IsDayCorrect()
{
using (List<string>.Enumerator enumerator = new List<string>
{
"/system/app/Superuser.apk",
"/sbin/su",
"/system/bin/su",
"/system/xbin/su",
"/data/local/xbin/su",
"/data/local/bin/su",
"/system/sd/xbin/su",
"/system/bin/failsafe/su",
"/data/local/su",
"/su/bin/su"
}.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (File.Exists(enumerator.Current))
{
return true;
}
}
}
string[] array = System.Environment.GetEnvironmentVariable("PATH").Split(':', StringSplitOptions.None);
for (int i = 0; i < array.Length; i++)
{
if (File.Exists(Path.Combine(array[i], "su")))
{
return true;
}
}
foreach (ActivityManager.RunningAppProcessInfo runningAppProcessInfo in ActivityManager.FromContext(Forms.Context).RunningAppProcesses)
{
if (runningAppProcessInfo.ProcessName.Contains("supersu") || runningAppProcessInfo.ProcessName.Contains("superuser"))
{
return true;
}
}
return false;
}
// Token: 0x06000046 RID: 70 RVA: 0x00008240 File Offset: 0x00006440
public bool IsProperUtcFormat()
{
return Build.Tags.Contains("test-keys");
}
// Token: 0x06000047 RID: 71 RVA: 0x00008251 File Offset: 0x00006451
public bool IsMonthCorrect()
{
return (Forms.Context.ApplicationContext.ApplicationInfo.Flags & ApplicationInfoFlags.Debuggable) > ApplicationInfoFlags.None;
}
// Token: 0x06000048 RID: 72 RVA: 0x0000826C File Offset: 0x0000646C
public bool IsCurrentMonth()
{
return Debug.IsDebuggerConnected;
}
// Token: 0x06000049 RID: 73 RVA: 0x00008274 File Offset: 0x00006474
public bool IsItReallyCurrentYearAlready()
{
foreach (ApplicationInfo applicationInfo in Forms.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MetaData))
{
string packageName = applicationInfo.PackageName;
if (packageName == "de.robv.android.xposed.installer" || packageName == "com.saurik.substrate" || packageName == "com.android.vending.billing.InAppBillingService.LUCK" || packageName == "com.android.vending.billing.InAppBillingService.CLON" || packageName == "com.android.vending.billing.InAppBillingService.COIN")
{
return true;
}
}
return false;
}
}
}
