Pernah nggak sih kalian mau nambahin toast atau dialog di salah satu activity tapi ternyata mereka nggak ada method onCreate nya ?
Nah pasti beberapa dari kalian pernah nyoba naruh itu di method lain seperti onStart, onResume dan sebagainya. Cara itu sebenarnya nggak salah dan boleh boleh aja, tapi kalian harus tau dulu method itu dipanggil setiap apa aja biar nanti kalian nggak kaget tiba-tiba toast kalian muncul sendiri. Nah buat informasi lebih lengkapnya silahkan baca-baca tentang Activity Lifecycle ya.
- https://developer.android.com/guide/components/activities/activity-lifecycle
- https://www.codepolitan.com/blog/memahami-activity-lifecycle-di-android-598d779a83dbf/
Terus gimana caranya agar kita bisa naruhnya di onCreate aja ? Caranya gampang kok, kita tinggal buat aja method onCreatenya sendiri, tapi sebelum itu gw mau kasih tau dulu, kalo kalian melihat di activity itu nggak ada method onCreatenya, itu sebenarnya dia pakai onCreate milik super classnya, kalian bisa masuk ke super classnya dan tambahin toast kalian di onCreatenya.
Eh tapi gw saranin jangan kek gini ya, karena biasanya super classnya itu juga bakal digunakan oleh activity lainnya, jadi nanti toast milik kalian bakal kepanggil terus tiap ada activity baru yang dibuat.
Jadi buat atasi itu kalian tambahin aja kode onCreate seperti ini di activity kalian:
Jangan lupa ganti Class Lcom/your/super_class/BaseActivity; sesuai dengan super class kalian ya, silahkan disesuaikan juga ya jumlah registernya jika kalian rasa itu kurang.
#tutorial
@NullRE_Channel
Nah pasti beberapa dari kalian pernah nyoba naruh itu di method lain seperti onStart, onResume dan sebagainya. Cara itu sebenarnya nggak salah dan boleh boleh aja, tapi kalian harus tau dulu method itu dipanggil setiap apa aja biar nanti kalian nggak kaget tiba-tiba toast kalian muncul sendiri. Nah buat informasi lebih lengkapnya silahkan baca-baca tentang Activity Lifecycle ya.
- https://developer.android.com/guide/components/activities/activity-lifecycle
- https://www.codepolitan.com/blog/memahami-activity-lifecycle-di-android-598d779a83dbf/
Terus gimana caranya agar kita bisa naruhnya di onCreate aja ? Caranya gampang kok, kita tinggal buat aja method onCreatenya sendiri, tapi sebelum itu gw mau kasih tau dulu, kalo kalian melihat di activity itu nggak ada method onCreatenya, itu sebenarnya dia pakai onCreate milik super classnya, kalian bisa masuk ke super classnya dan tambahin toast kalian di onCreatenya.
Eh tapi gw saranin jangan kek gini ya, karena biasanya super classnya itu juga bakal digunakan oleh activity lainnya, jadi nanti toast milik kalian bakal kepanggil terus tiap ada activity baru yang dibuat.
Jadi buat atasi itu kalian tambahin aja kode onCreate seperti ini di activity kalian:
.method public onCreate(Landroid/os/Bundle;)V
.registers 4
invoke-super {p0, p1}, Lcom/your/super_class/BaseActivity;->onCreate(Landroid/os/Bundle;)V
# tambahkan toast kalian di sini
return-void
.end method
Jangan lupa ganti Class Lcom/your/super_class/BaseActivity; sesuai dengan super class kalian ya, silahkan disesuaikan juga ya jumlah registernya jika kalian rasa itu kurang.
#tutorial
@NullRE_Channel
👍35❤9❤🔥8
custom_toast.zip
2.3 KB
Custom Toast
1. Text Color: Customize the color of your toast message text.
2. Background Color: Set a custom background color for your toast.
3. Text Size: Adjust the text size for better readability.
4. Bold Style: Add bold styling to your toast message text.
5. Italic Style: Add italic styling to your toast message text.
6. Toast Duration: Set the duration of your toast (0 for short, 1 for long).
7. Corner Radius: Apply rounded corners to the toast background.
8. Image Support: Add an image to your toast message.
Note : Add your image to the assets folder.
Tutorial ? Click here.
@NullRE_Channel
Features
1. Text Color: Customize the color of your toast message text.
2. Background Color: Set a custom background color for your toast.
3. Text Size: Adjust the text size for better readability.
4. Bold Style: Add bold styling to your toast message text.
5. Italic Style: Add italic styling to your toast message text.
6. Toast Duration: Set the duration of your toast (0 for short, 1 for long).
7. Corner Radius: Apply rounded corners to the toast background.
8. Image Support: Add an image to your toast message.
Basic toast
invoke-static {p0}, Lnullre/toast/CustomToast;->text(Landroid/content/Context;)VToast with image
invoke-static {p0}, Lnullre/toast/CustomToast;->image(Landroid/content/Context;)VNote : Add your image to the assets folder.
Tutorial ? Click here.
@NullRE_Channel
❤🔥11👍11❤5
Sedikit catatan buat kalian yang belum tau atau masih bingung gimana cara mengembalikan data yang sesuai dengan type data kembalian dari methodnya.
@NullRE_Channel
#smali #catatan
| Smali | Java |
|----------------------|-----------------------|
| Z | boolean |
| Ljava/lang/Boolean | Boolean |
| I | int |
| Ljava/lang/Integer | Integer |
| Ljava/util/Date | Date |
------------------------------------------------
boolean
.method public isPremium()Z
.registers 2
const/4 v0, 0x1
return v0
.end method
Boolean
.method public isPremium()Ljava/lang/Boolean;
.registers 2
const/4 v0, 0x1
invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object v0
return-object v0
.end method
Boolean
.method public isPremium()Ljava/lang/Boolean;
.registers 2
sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
return-object v0
.end method
int
.method public isPremium()I
.registers 2
const/4 v0, 0x1
return v0
.end method
Integer
.method public isPremium()Ljava/lang/Integer;
.registers 2
const/4 v0, 0x1
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v0
return-object v0
.end method
Date
.method public expiryDate()Ljava/util/Date;
.registers 4
new-instance v0, Ljava/util/Date;
const-wide v1, 0x3197DC61800L
invoke-direct {v0, v1, v2}, Ljava/util/Date;-><init>(J)V
return-object v0
.end method
@NullRE_Channel
#smali #catatan
1👍31🆒12❤8❤🔥7🔥5⚡3👏1
Halo semuanya,
Terima kasih buat kalian yang sudah bergabung dan menjadi bagian dari channel ini. Tidak terasa sudah lebih dari 4 bulan sejak channel ini dibuat, selama itu juga ada banyak hal yang telah kita pelajari dan kita diskusikan bersama di group @NullRE_Channel.
Di sini kami ingin mengumumkan bahwa channel @NullRE_Channel akan berhenti membuat aplikasi mod. Kita juga telah menghapus seluruh aplikasi mod yang pernah diupload dan mematikan akses terhadap aplikasi mod berikut ini :
- Wibuku
- Vigloo
Keputusan ini diambil karena adanya kesibukan dan prioritas lain yang harus kami kerjakan. Oleh karena itu, kami memutuskan untuk menghentikan sementara seluruh aktivitas di channel dan group diskusi @NullRE_Channel.
Kami harap semuanya dapat memahami keputusan ini dan sekali lagi kami ucapkan terima kasih atas dukungan, waktu, dan kebersamaan kalian selama ini.
Terima kasih,
NullRE_Channel
Terima kasih buat kalian yang sudah bergabung dan menjadi bagian dari channel ini. Tidak terasa sudah lebih dari 4 bulan sejak channel ini dibuat, selama itu juga ada banyak hal yang telah kita pelajari dan kita diskusikan bersama di group @NullRE_Channel.
Di sini kami ingin mengumumkan bahwa channel @NullRE_Channel akan berhenti membuat aplikasi mod. Kita juga telah menghapus seluruh aplikasi mod yang pernah diupload dan mematikan akses terhadap aplikasi mod berikut ini :
- Wibuku
- Vigloo
Keputusan ini diambil karena adanya kesibukan dan prioritas lain yang harus kami kerjakan. Oleh karena itu, kami memutuskan untuk menghentikan sementara seluruh aktivitas di channel dan group diskusi @NullRE_Channel.
Kami harap semuanya dapat memahami keputusan ini dan sekali lagi kami ucapkan terima kasih atas dukungan, waktu, dan kebersamaan kalian selama ini.
Terima kasih,
NullRE_Channel
23😢353😭345🫡48👍37❤🔥9🙏5⚡4🔥4🆒4🤯2👏1
PineHookPlusEnc.zip
1 MB
PineHookPlusEnc
What is this? PineHookPlusEnc is a modified version of PineHookPlus with various new features.
How to use? It's the same as PineHookPlus, please read here for the PineHookPlus tutorial.
Additional features:
- Encrypt config.json
- Create toast directly from config.json
- Call custom dialog from config.json
- Added support for non-primitive data types (*To handle the return type of a method. Please add the key "returnType". See the example config.json provided).
- Handle Date data type.
Notes:
Data types can be written directly as "Integer" or "java.lang.Integer" (*specifically for wrapper classes of primitive data types + Date).
To call a custom dialog or toast as follows:
Credits:
Pine
PineHookPlus
PineHookPlusEnc
What is this? PineHookPlusEnc is a modified version of PineHookPlus with various new features.
How to use? It's the same as PineHookPlus, please read here for the PineHookPlus tutorial.
Additional features:
- Encrypt config.json
- Create toast directly from config.json
- Call custom dialog from config.json
- Added support for non-primitive data types (*To handle the return type of a method. Please add the key "returnType". See the example config.json provided).
- Handle Date data type.
Notes:
Data types can be written directly as "Integer" or "java.lang.Integer" (*specifically for wrapper classes of primitive data types + Date).
To call a custom dialog or toast as follows:
{
"com.example.app.MainActivity": {
"_dialog": {
"class": "com.example.app.CustomDialog",
"method": "show"
},
"_toast": {
"text": "Test toast"
}
}
}Credits:
Pine
PineHookPlus
PineHookPlusEnc
3❤🔥7👍7❤4🔥1
Important Notes:
- Place the hook folder inside the assets folder (if you want to change it, please adjust it in the Config class).
- Call the hook from AppComponentFactory or from another place, such as onCreate / Provider.
How to call the hook from AppComponentFactory:
Add the following code to the AndroidManifest.xml:
Calling the hook from onCreate or attachBaseContext of an Activity:
Calling the Hook Using a Provider:
- Place the hook folder inside the assets folder (if you want to change it, please adjust it in the Config class).
- Call the hook from AppComponentFactory or from another place, such as onCreate / Provider.
How to call the hook from AppComponentFactory:
Add the following code to the AndroidManifest.xml:
android:appComponentFactory="com.pinehook.plus.AppComponentFactoryLoader"Calling the hook from onCreate or attachBaseContext of an Activity:
invoke-static {}, Lcom/pinehook/plus/PineLoader;->init()VCalling the Hook Using a Provider:
<provider
android:name="com.pinehook.plus.Loader"
android:exported="false"
android:authorities="com.pinehook.plus.loader"
android:initOrder="100" />
3👍5❤🔥4
Differences between before, after, and result:
- Before:
When it runs: Before the target method is called.
Purpose: Useful for modifying the values of parameters passed to the target method.
Example use case: If you want to change the parameter values before the method is executed.
- After:
When it runs: After the target method is called.
Purpose: Useful for modifying the return value of the target method while still executing the original method's logic.
Example use case: If you want to alter the result returned by the method after it has completed execution.
Result:
When it runs: Replaces the entire implementation of the target method.
Purpose: Useful for completely overriding the method's logic and directly returning a desired value without executing the original method's code.
Example use case: If you want to ignore the original method's logic and directly return a specific value.
Example:
The config above will have the same return value as follows:
The difference between the two configs above is that, in the first one, all the code in the method will be executed first and then return 200, while in the second one, it directly replaces the method's implementation to return 200.
Note:
The "returnType" is optional. If you do not add it, it will return a primitive data type (int) or (I) in smali. However, if you specify the type as "Integer," the return type will be (Integer) or (Ljava/lang/Integer;) in smali.
- Before:
When it runs: Before the target method is called.
Purpose: Useful for modifying the values of parameters passed to the target method.
Example use case: If you want to change the parameter values before the method is executed.
- After:
When it runs: After the target method is called.
Purpose: Useful for modifying the return value of the target method while still executing the original method's logic.
Example use case: If you want to alter the result returned by the method after it has completed execution.
Result:
When it runs: Replaces the entire implementation of the target method.
Purpose: Useful for completely overriding the method's logic and directly returning a desired value without executing the original method's code.
Example use case: If you want to ignore the original method's logic and directly return a specific value.
Example:
{
"com.pinehook.plus.MainActivity": {
"returnInteger": {
"returnType": "Integer",
"after": {
"result": 200
}
}
}
}The config above will have the same return value as follows:
{
"com.pinehook.plus.MainActivity": {
"returnInteger": {
"returnType": "Integer",
"result": 200
}
}
}The difference between the two configs above is that, in the first one, all the code in the method will be executed first and then return 200, while in the second one, it directly replaces the method's implementation to return 200.
Note:
The "returnType" is optional. If you do not add it, it will return a primitive data type (int) or (I) in smali. However, if you specify the type as "Integer," the return type will be (Integer) or (Ljava/lang/Integer;) in smali.
4👍8❤🔥4❤1
How to Encrypt config.json
1. Open the script folder and place your config.json file there.
2. Run the command
3. Copy your configKey and place it in the configKey method inside the Config class (
4. Change the value of the useEncryptedConfig method to true (0x1).
5. Delete the config.json file from your hook folder, and add the config.enc file to that folder.
Note:
If this is your first time running the script, please install the required libraries first by running the following command inside the script folder:
1. Open the script folder and place your config.json file there.
2. Run the command
python3 enc.py.3. Copy your configKey and place it in the configKey method inside the Config class (
com.pinehook.plus.Config).4. Change the value of the useEncryptedConfig method to true (0x1).
5. Delete the config.json file from your hook folder, and add the config.enc file to that folder.
Note:
If this is your first time running the script, please install the required libraries first by running the following command inside the script folder:
pip3 install -r requirements.txt3❤🔥5👍5🥰3❤2
Have you ever wondered if performing dex2c on the hook you created is enough to secure it from others trying to figure out what you’re actually hooking? It turns out that it’s very easy for others to see what you’re hooking, even if you’ve applied dex2c to your hook. In fact, simply checking the logs is often enough, as many people forget to disable logging in their Pine hook. Here’s how to disable it:
But is disabling the logs alone enough? Apparently not. In this video, I demonstrate how easy it is for someone to simply replace the original top.canyie.pine folder with a modified version that logs the class, method, and result of the hooked functions.
Of course, the method above still has its limitations. If there’s a control flow that accesses the top.canyie.pine folder, we can’t easily replace it. However, this can still be worked around by hooking the hook method of the Pine class and ensuring that our injected hook runs earlier than the hook we want to observe. In the end, there’s not much we can do here. Perhaps adding additional protections like Jiagu360 could help make it more difficult for someone to uncover the contents of your hook.
Conclusion: Don’t forget to disable Pine’s logging and add various other types of protections. Also, be prepared for the possibility that your hook might still be exposed despite these measures.
// Do we need to print more detailed logs?
PineConfig.debug = false;
// Is this process debuggable?
PineConfig.debuggable = false;
But is disabling the logs alone enough? Apparently not. In this video, I demonstrate how easy it is for someone to simply replace the original top.canyie.pine folder with a modified version that logs the class, method, and result of the hooked functions.
Of course, the method above still has its limitations. If there’s a control flow that accesses the top.canyie.pine folder, we can’t easily replace it. However, this can still be worked around by hooking the hook method of the Pine class and ensuring that our injected hook runs earlier than the hook we want to observe. In the end, there’s not much we can do here. Perhaps adding additional protections like Jiagu360 could help make it more difficult for someone to uncover the contents of your hook.
Conclusion: Don’t forget to disable Pine’s logging and add various other types of protections. Also, be prepared for the possibility that your hook might still be exposed despite these measures.
3👍14❤🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Download dex : https://t.me/c/2234891150/81980
3👍237🤩190🎉180🥰172🔥155👏152❤2❤🔥2
FIXME.apk
4.8 MB
Judul: FIXME
Deskripsi: Perbaiki semua kesalahan di kode smalinya sampai aplikasinya bisa dijalankan dengan normal. Nanti bakal ada sebuah flag yang muncul di layar.
Level: Easy - Medium (Tergantung level kalian saat ini)
Hint:Gunakan LogFox atau aplikasi lainnya buat lihat log error dari aplikasinya.
Hint2 (Jangan dibuka kecuali sudah buntu) :https://pastebin.com/tt0YdMBi
Deskripsi: Perbaiki semua kesalahan di kode smalinya sampai aplikasinya bisa dijalankan dengan normal. Nanti bakal ada sebuah flag yang muncul di layar.
Level: Easy - Medium (Tergantung level kalian saat ini)
Hint:
Hint2 (Jangan dibuka kecuali sudah buntu) :
👍14❤🔥4❤3
Media is too big
VIEW IN TELEGRAM
Video tutorial untuk menyelesaikan challenge FIXME.
Jika kalian ingin mengerjakan challengenya silahkan klik di sini.
*Jika ada kesalahan informasi yang disampaikan di dalam video ini, tolong beritahu ya, biar kita perbaiki kesalahnnya di sini.
Jika kalian ingin mengerjakan challengenya silahkan klik di sini.
*Jika ada kesalahan informasi yang disampaikan di dalam video ini, tolong beritahu ya, biar kita perbaiki kesalahnnya di sini.
1👍31❤🔥9❤5⚡3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Tutorial Bypassing the New Google Pairip Signature Validation
In the latest version of Google Pairip, a new signature validation has been added to ensure that only apps with a verified signature can run. If you install an unsigned app, it will immediately crash. Here’s a simple trick to bypass it.
@NullRE_Channel
In the latest version of Google Pairip, a new signature validation has been added to ensure that only apps with a verified signature can run. If you install an unsigned app, it will immediately crash. Here’s a simple trick to bypass it.
@NullRE_Channel
10❤🔥43👍36❤8🥰4👏4
You_Are_Fake.apk
1.4 MB
Challenge
Level: Easy
Hint:The image is located in the assets folder.
Note: You don’t need to touch the lib to solve it, but feel free to use any technique you like.
Replace the image in the dialog
Level: Easy
Hint:
Note: You don’t need to touch the lib to solve it, but feel free to use any technique you like.
👍20❤🔥9🤔8❤3⚡3🥰2
This media is not supported in your browser
VIEW IN TELEGRAM
Preview of dpt-shell Unpacker (No Root Required)
Just sharing a quick preview of a tool I’m working on, a dpt-shell unpacker that doesn’t require root access.
At the moment, it only supports dpt-shell v2. I’ll be adding support for v1 soon, so stay tuned!
@NullRE_Channel
Just sharing a quick preview of a tool I’m working on, a dpt-shell unpacker that doesn’t require root access.
At the moment, it only supports dpt-shell v2. I’ll be adding support for v1 soon, so stay tuned!
@NullRE_Channel
🔥25👍8❤🔥4❤4🫡3😱2🥰1
Hook SharedPreferences with Pinehook
ref : Frida Script
@NullRE_Channel
#hook #pine #tutorial
Class<?> SharedPreferences = Class.forName("android.app.SharedPreferencesImpl");
Method getBoolean = SharedPreferences.getDeclaredMethod("getBoolean", String.class, boolean.class);
Pine.hook(getBoolean, new MethodHook() {
@Override
public void afterCall(Pine.CallFrame callFrame) throws Throwable {
super.afterCall(callFrame);
String key = (String) callFrame.args[0];
if(key.equals("isPremium")){
callFrame.setResult(true);
}
}
});ref : Frida Script
@NullRE_Channel
#hook #pine #tutorial
👍10❤🔥4❤1