#Eviter le message "Unofficial software"

1 messages · Page 1 of 1 (latest)

thick pond
#

Bonjour,
je crois avoir vu une fois dans un des threads qu'il était possible de ne pas afficher le message "UNOFFICIAL SOFTWARE" lors de la présence d'un userland custom.
De mémoire c'était Yaya.Cout qui l'avait évoqué.
Quelqu'un connaitrait il une méthode ?

wanton lagoon
#

Ah oui, c'était moi qui avait du parler de ça. L'idée, c'est d'écrire une application externe qui jump à l'adresse de l'autre userland (0x90410040 pour le slot B, si je calcule bien) pour n'être qu'en mode d'application externe et pas userland modifié. Je n'ai pas testé en pratique, mais je ne vois pas ce qui empêcherait ça

#

En reprenant un peu de code d'Epsilon, ce code devrait marcher si je ne me trompe pas

void jump(uint32_t jumpIsrVectorAddress) {
  uint32_t * stackPointerAddress = reinterpret_cast<uint32_t *>(jumpIsrVectorAddress);
  uint32_t * resetHandlerAddress = stackPointerAddress + 1;

  asm volatile (
      "msr MSP, %[stackPointer] ; bx %[resetHandler]"
      : :
      [stackPointer] "r" (*stackPointerAddress),
      [resetHandler] "r" (*resetHandlerAddress)
      );
}

void main() {
    // jump(0x90010040); // Exécution slot A
    jump(0x90410040); // Exécution slot B
}
thick pond
# wanton lagoon En reprenant un peu de code d'Epsilon, ce code devrait marcher si je ne me tromp...

En soit je ne me suis pas trompé ? Lorsque je lance l'app, elle crash.
Pour tester, j'ai ajouter du texte a l'écran, puis un sleep. Le texte s'affiche et après le sleep l'app crash.
Ce serait bloquer par le noyau ?


extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;

using namespace EADK;

void jump(uint32_t jumpIsrVectorAddress) {
  uint32_t * stackPointerAddress = reinterpret_cast<uint32_t *>(jumpIsrVectorAddress);
  uint32_t * resetHandlerAddress = stackPointerAddress + 1;

  asm volatile (
      "msr MSP, %[stackPointer] ; bx %[resetHandler]"
      : :
      [stackPointer] "r" (*stackPointerAddress),
      [resetHandler] "r" (*resetHandlerAddress)
      );
}

int main(int argc, char * argv[]) {

  // jump(0x90010040); // Exécution slot A
  jump(0x90410040); // Exécution slot B

}
wanton lagoon
#

Tu peux essayer de remplacer le contenu du main par ça ? ((void)0x90410041)();

#

Pas sûr que ça marche aussi bien

#

Peut-être ((void *)0x90410041)(); si il ne veut pas compiler

thick pond
#

Pour les deux cas j'ai une erreur de compile :

  • ((void)0x90410041)(); => error: void value not ignored as it ought to be
  • ((void *)0x90410041)(); => error: expression cannot be used as a function
wanton lagoon
#

Et ça ? ((uint32_t *)0x90410041)();

thick pond
wanton lagoon
#

Sans le pointeur, alors ? ((uint32_t)0x90410041)();

thick pond
wanton lagoon
#

Et ça ? (en se basant sur du code d'Upsilon)

typedef void (*entrypoint)();
void main() {
    return ((entrypoint)(const uint32_t*)0x90410041)();
}
thick pond
# wanton lagoon Et ça ? (en se basant sur du code d'Upsilon) ```cpp typedef void (*entrypoint)()...

Je l'ai implémenté comme ça :


extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;

using namespace EADK;

typedef void (*entrypoint)();
void main_jump() {
    return ((entrypoint)(const uint32_t*)0x90410041)();
}

int main(int argc, char * argv[]) {
  main_jump();
}

Mais ça crash quand même.
Peut-être que le jump est bloqué par Epsilon ? 🤔

wanton lagoon
#

Possible, mais ça m'étonne, car c'est ce que fait KhiCAS (s'exécuter depuis le slot B)

wanton lagoon
wanton lagoon
#

Ou alors j'ai mal calculé mes adresses de jump

#

Tu essayes d'exécuter quelle version d'Epsilon ?

thick pond
wanton lagoon
#

Essaye avec cette adresse-là à la place : 0x90410059

thick pond
# wanton lagoon Essaye avec cette adresse-là à la place : `0x90410059`

J'obtient toujours un crash.


extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;

using namespace EADK;

typedef void (*entrypoint)();
void main_jump() {
    return ((entrypoint)(const uint32_t*)0x90410059)();
}

int main(int argc, char * argv[]) {
  Display::pushRectUniform(Screen::Rect, Color(0x000000));
  Display::drawString("Hello World !", Point(40, 120), false, Color(0xFF0000), Color(0x000000));
  Timing::msleep(2000);
  main_jump();
}

Mais "Hello World !" s'affiche bien

wanton lagoon
#

Tu as bien flashé ton userland en slot B, juste pour savoir ?

#

Et tu pourrais tenter avec l'implémentation du début en assembleur ? (avec jump(0x90410058);)

thick pond
wanton lagoon
#

jump(0x90410030);, c'est mieux ?

#

(en lisant le binaire directement, c'est là que ça devrait commencer, mais je vois pas trop pourquoi j'avais pas cette valeur ailleurs)

#

Ah oui, je me suis trompé en écrivant ma doc, en fait

thick pond
# wanton lagoon Ah oui, je me suis trompé en écrivant ma doc, en fait

😂 En tout cas ça y est ça fonctionne 🎉 . Merci beaucoup
J'ai juste 2 petites questions :

  • c'est possible de refaire ce jump dans l'autre sens (slotb vers slotA) mais en intégrant directement un .nwa a epsilon ? Le tout pour pouvoir naviguer entre les deux slots.
  • on pourrais pas jump a l'adresse du noyau b plutot qu'au slotB pour pouvoir executer un userland avec moins de restriction ? (déso si j'ai pas bien compris toute ta doc 😅 )
#

Tient, quelque chose d'interressant : lorsque je boot sans l'app au slotB et que je vais sur "a propos" dans les paramètres je crash. mais en jump avec l'app .nwa je crash pas dans cette option...

wanton lagoon
#

Pour refaire le jump dans l'autre sens, ça doit être possible (il suffit juste de jump à 0x90010030 au lieu de 0x90410030). Par contre, l'userland officiel s'exécutera avec les restrictions d'une application externe (pas de mode examen…), donc ça devient moins intéressant. Pas sûr que l'application reste visible après être retourné sur l'userland officiel (à vérifier). L'userland modifié peut dans tous les cas être modifié pour afficher un menu pour retourner sur l'userland officiel (via le même code que l'application externe) ou toujours afficher les applications externes

#

Pour jump au kernel du slot B, ce n'est pas possible depuis l'userland, car tu n'as pas les droits, en gros (plus précisément, le kernel n'aurait pas les droits pour fonctionner une fois exécuté, mais je ne sais pas si quelque chose empêche vraiment de jump sur le kernel, ça ne servirait pas à grand-chose)

thick pond
#

Ok merci 😁 Je vais essayer tout ça

wanton lagoon
#

Ah oui, effectivement

#

(c'était différent sur les anciennes versions d'Epsilon)

thick pond
#

j'ai quand même tester de repasser sur le slotA, et ducoup je me retrouve avec le message "UNOFFICIAl SOFTWARE" lorsque je suis sur l'officiel 😂

#

mais c'est interessant car ça fait bugs le noyau 🤔 (j'ai donc pas accès a la led sur Epsilon). Bon il suffit d'un reset et ça revient a la normal

wanton lagoon
#

Les différents niveaux, c'est officiel > applications externes > userland custom

thick pond
#

Les applications externes ont un peu plus de droits que l'userland custom ou c'est kasi pareil ?

wanton lagoon
#

C'est globalement pareil (pas de LED), à part le popup qui est spécifique aux userland customs

#

Et bien sûr la license des applications externes permet la redistribution, contrairement à l'userland

thick pond
#

C'est quand même dommage pour la LED, je comprends que ça évite beaucoup de problèmes (et de débordement aussi) mais ça restreint aussi beaucoup la communauté 😞. Au moins ya les apps externes, c'est mieux que rien 😐