




















# sources/p244pl/edu/vulcan/p250b/p252b/C5090b.java:91:
return (a.hashCode() == 99349 && a.equals("dev")) ? new C5089a("https://efeb-komunikacja-pro-efebmobile.vdpo.pl", false) : new C5089a("http://efeb-komunikacja.vdpo.pl", false);




librus


~❯ which jarsigner
/usr/bin/jarsigner (edited)
which: no jarsigner in (/home/doteq/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin:/home/doteq/Android/Sdk/build-tools/29.0.2/)




























































public Response intercept(Chain chain) {
C1848i.m7961b(chain, "chain");
Request request = chain.request();
DateTime now = DateTime.now();
C1848i.m7957a((Object) now, "DateTime.now()");
String f = C5627e.m22003f(now);
HttpUrl url = request.url();
C1848i.m7957a((Object) url, "request.url()");
String a = C5070a.m20537a(url);
Builder header = request.newBuilder().method(request.method(), request.body()).header("vOS", "Android").header("vDeviceModel", this.f12439b).header("vAPI", "1").header("vDate", f).header("vCanonicalUrl", a);
String method = request.method();
if (method != null) {
int hashCode = method.hashCode();
if (hashCode == 79599 ? method.equals("PUT") : !(hashCode == 2461856 ? !method.equals("POST") : hashCode != 75900968 || !method.equals("PATCH"))) {
C5647c cVar = this.f12440c;
C1848i.m7957a((Object) request, "request");
C5649b a2 = cVar.mo18287a(m20539a(request));
header.header("Digest", a2.mo18289a()).header("Signature", this.f12440c.mo18288a((C1878i<String, Object>[]) new C1878i[]{new C1878i("vCanonicalUrl", a), new C1878i("Digest", a2), new C1878i("vDate", f)}).mo18291a());
Response proceed = chain.proceed(header.build());
C1848i.m7957a((Object) proceed, "chain.proceed(builder.build())");
return proceed;
}
}
header.header("Signature", this.f12440c.mo18288a((C1878i<String, Object>[]) new C1878i[]{new C1878i("vCanonicalUrl", a), new C1878i("vDate", f)}).mo18291a());
Response proceed2 = chain.proceed(header.build());
C1848i.m7957a((Object) proceed2, "chain.proceed(builder.build())");
return proceed2;
}













private final KeyPair m22045b(KeyPairGenerator keyPairGenerator, String str) {
Calendar instance = Calendar.getInstance();
Calendar instance2 = Calendar.getInstance();
instance2.add(1, 20);
KeyPairGeneratorSpec.Builder serialNumber = new KeyPairGeneratorSpec.Builder(this.f12747e).setAlias(str).setSerialNumber(BigInteger.ONE);
StringBuilder sb = new StringBuilder();
sb.append("CN=");
sb.append(str);
sb.append(" CA Certificate");
KeyPairGeneratorSpec.Builder subject = serialNumber.setSubject(new X500Principal(sb.toString()));
C1848i.m7957a((Object) instance, "startDate");
KeyPairGeneratorSpec.Builder startDate = subject.setStartDate(instance.getTime());
C1848i.m7957a((Object) instance2, "endDate");
keyPairGenerator.initialize(startDate.setEndDate(instance2.getTime()).build());
KeyPair generateKeyPair = keyPairGenerator.generateKeyPair();
C1848i.m7957a((Object) generateKeyPair, "generator.generateKeyPair()");
return generateKeyPair;
}C1848i.m7957a to jakiś logger, kto wie, może nawet timber

dev to dużo by dało, bo co kawałek jest wywołanie tego



register/new
java.security.MessageDigest














1




























CertificateThumbprint oraz CertificateId to sha1 tego certyfikatu










TODO: przegenerować cert. Po stronie Efeba istnieje CertId podpięty pod inne SelfId
/* Code decompiled incorrectly, please refer to instructions dump. */ (edited)





return (a.hashCode() == 99349 && a.equals("dev")) ? new a("https://efeb-komunikacja-pro-efebmobile.vdpo.pl", false) : new a("http://efeb-komunikacja.vdpo.pl", false);
a.equals("dev")
if (i.a(this.b, (Object) "P01")) {...









if (VERSION.SDK_INT >= 23) {
KeyPairGenerator instance = KeyPairGenerator.getInstance("EC", "AndroidKeyStore");
C1848i.m7957a((Object) instance, "generator");
return m22043a(instance, str);
}
KeyPairGenerator instance2 = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
C1848i.m7957a((Object) instance2, "generator");
return m22045b(instance2, str); (edited)

APP_CERTIFICATE




SHA-256= przed szyfrowaniem, a to powinno być dodane dopiero później (to nie jest szyfrowane, tylko dodawane już do wyjściowego nagłówka)






















Class jest zastrzeżone przez język i byłby problem przy deserializacji



Żądany byt `Certyfikat` nie został odnaleziony




























hebe?rest (edited)

2020








hebe-js?
js?





efeb







hebe to nazwa kodowa ogólnie dzienniczka+ a nie tylko nowej wersji








js i node

js, bo kod się wykonuje w kontekście przeglądarki


npm zainstalowany?

npm init












In browser

















node wersji też nie robi"node-webcrypto-ossl": "^1.0.48",



npm install --global windows-build-tools (edited)





npm install --global --production windows-build-tools











npm install --global --production windows-build-tools@4.0.0








choco upgrade python2 visualstudio2017-workload-vctools











node-gyp
'node-gyp' is not recognized as an internal or external command,
operable program or batch file.
node-gyp cos zwraca

python, a 2.7.15 na python27 (nie pytaj czemu bo nwm)


npm config set python /path/to/executable/python27














npm config set msvs_version 2019









Traceback (most recent call last):
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\gyp_main.py", line 16, in <module>
sys.exit(gyp.script_main())
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 545, in script_main
return main(sys.argv[1:])
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 538, in main
return gyp_main(args)
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 514, in gyp_main
options.duplicate_basename_check)
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 98, in Load
generator.CalculateVariables(default_variables, params)
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\generator\msvs.py", line 1916, in CalculateVariables
generator_flags.get('msvs_version', 'auto'))
File "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\gyp\pylib\gyp\MSVSVersion.py", line 434, in SelectVisualStudioVersion
versions = _DetectVisualStudioVersions(version_map[version], 'e' in version) (edited)

"C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" install --scripts-prepend-node-path=auto
> node-webcrypto-ossl@1.0.48 install C:\AndroidStudio\Projects\_libs\_kuba2k2\uonet-request-signer\js\node_modules\node-webcrypto-ossl
> node-gyp rebuild
C:\AndroidStudio\Projects\_libs\_kuba2k2\uonet-request-signer\js\node_modules\node-webcrypto-ossl>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gy
p.js" rebuild ) else (node "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )


npm config set msbuild_path "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Current\Bin\MSBuild.exe" 



























owijał jsona w POSTcie w resztę rzeczy, żeby nie robić ręcznie












Zwolnienie? ha, oczywiście że LegalAbsence

eatery mi nie pasuje
knajpka
Distribution: null w schedule (plan lekcji) (edited)


























"Null"


















Niepoprawna lokalizacja





















✘ self@isekai ~/hebe apktool build pl.edu.vulcan.hebe --force-all
I: Using Apktool 2.4.1
I: Copying pl.edu.vulcan.hebe classes.dex file...
I: Building resources...
W: invalid resource directory name: /home/self/hebe/pl.edu.vulcan.hebe/res navigation
brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [/tmp/brut_util_Jar_7616983763408939461.tmp, p, --forced-package-id, 127, --min-sdk-version, 20, --target-sdk-version, 28, --version-code, 55, --version-name, 20.03.0.55.091311, --no-version-vectors, -F, /tmp/APKTOOL6184227671039003218.tmp, -e, /tmp/APKTOOL2066043196316670774.tmp, -0, arsc, -I, /home/self/.local/share/apktool/framework/1.apk, -S, /home/self/hebe/pl.edu.vulcan.hebe/res, -M, /home/self/hebe/pl.edu.vulcan.hebe/AndroidManifest.xml]



--use-aapt2
Failure to verify dex file '/data/app/pl.edu.vulcan.hebe-bpOpBrTuhGm3YVggumRamA==/base.apk': Bad checksum (0c08e12f, expected d94be179)

















Wulkabot is typing


















<string name="end_of_beta_version_content">"Dziękujemy za skorzystanie z wersji beta Dzienniczka VULCAN.
W celu dalszego korzystania z aplikacji należy pobrać Dzienniczek VULCAN w sklepie Google Play."</string>





'Content-Type': 'application/json; charset=utf-8',{"EnvelopeType":"Object","Envelope":null,"Status":{"Code":106,"Message":"Firebase nie rozpoznał aplikacji"},"RequestId":"e92ef652-372a-44f3-86df-1cb25514a2b8","Timestamp":1588118793607,"TimestampFormatted":"2020-04-29 02:06:33","InResponseTo":null}















GitHub 
























The app has to generate a X.509 RSA or ECDSA certificate, a different one for each user,














from vulcan import Vulcan
import json
certificate = Vulcan.register('', '', '')
with open('cert.json', 'w') as f: # You can use other filename
json.dump(certificate.json, f)
wyrzuca mi None, zamiast certyfikatu

GitHub 















{
"IsError":true,
"IsMessageForUser":false,
"Message":"InvalidApp",
"TokenKey":null,
"TokenStatus":"Null",
"TokenCert":null
}






































GitHub 







GitHub 

































































{
"Message": "No HTTP resource was found that matches the request URI 'http://lekcjaplus.vulcan.net.pl/api/mobile/grade/summary/byPupil?__customer__group=warszawa&__customer__symbol=123456'.",
"MessageDetail": "No action was found on the controller 'UnifiedGradesController' that matches the request."
}
mmmm jak ładnie







lesson/byPupil oraz schedule/completed/byPupil zwracają lekcje zrealizowane (to chyba alias czy coś, bo jest w nich dokładnie to samo)
lesson/deleted zwraca ID usuniętych "lekcji" (idk)
schedule/completed/deleted zwraca 404.
lesson/deleted/byPupil oraz schedule/completed/deleted/byPupil zwraca ID usuniętych lekcji (ale INNE NIŻ lesson/deleted) (edited)



[object]/deleted/[byPupil?] oraz [object]/byPupil


[object]/deleted/[byPupil?] oraz [object]/byPupil













{'EnvelopeType': 'Object', 'Envelope': None, 'Status': {'Code': 205, 'Message': 'Certyfikat o podanym odcisku palca już istnieje'}, 'RequestId': 'c45fd045-4703-4e8f-8ebd-81d727070c40', 'Timestamp': 1602107178603, 'TimestampFormatted': '2020-10-07 23:46:18', 'InResponseTo': None}



























getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES)

















DeviceModel: 'MACBOOK KURWA NA HEBE'
hebe po prostu dalemiPhone, nei jestem pewny












DER (edited)PEMow
SHA-256=?



SYMBOL/ID/Statystyki.mvc/GetOcenyCzastkowe daje mi "Brak uprawnień.".





idBiezacyUczen, idBiezacyDziennik, idBiezacyDziennikPrzedszkole, idBiezacyDziennikWychowankowie, biezacyRokSzkolny, UonetPlus_ASP.NET_SessionId, EfebSsoAuthCookie, UonetPlus_SLACookie, X-V-RequestVerificationToken[UUID], ARR_uonetplus-uczen.vulcan.net.pl, ARR_3S_ARR_EFEB
_ga czy coś takiego, nie pamiętam






idBiezacyUczen, idBiezacyDziennik, idBiezacyDziennikPrzedszkole, idBiezacyDziennikWychowankowie, biezacyRokSzkolny, UonetPlus_ASP.NET_SessionId, EfebSsoAuthCookie, UonetPlus_SLACookie, X-V-RequestVerificationToken[UUID], ARR_uonetplus-uczen.vulcan.net.pl, ARR_3S_ARR_EFEB 

SYMBOL/ID/Statystyki.mvc/GetOcenyCzastkowe daje mi "Brak uprawnień.". 












GitHub 



dobra





data: [
{
Subject: "Nazwa przedmiotu",
IsAverage: bool,
TableContent: String?,
ClassSeries: {
Average: /*coś?*/,
IsEmpty: bool,
Items: [
{Label: String, Value: Number}
]
},
StudentSeries: {IsEmpty: bool, Average: /* coś?*/, Items:[
{Label: String, Value: Number}
]
}
]






Unreaded























{
"Id": "---41344rSamorzadKlasowy",
"Name": "Nazwisko imie - Przewodniczący 11F (TK)",
"IdLogin": 12345,
"Unreaded": false,
"Date": null,
"Role": 8,
"PushMessage": false,
"UnitId": 8,
"Hash": "pkeNfRwS7fE467fE46sCsCrVjo2ykO4F7fE46sCOA="
} (edited)








to wiem że działają






WyslijJako









































with open("account.json", "w") as f: f.write(account.as_json)
i blad: AttributeError: 'coroutine' object has no attribute 'as_json' kilka dni temu udalo mi sie to ogarnac samemu ale nie pamietam jak to zrobilem, pomoze ktos?
account (edited)awaitaccount = await vulcan.Account.register( keystore, token, symbol, pin )

with open("account.json", "w") as f: f.write(account.as_json)
i blad: AttributeError: 'coroutine' object has no attribute 'as_json' kilka dni temu udalo mi sie to ogarnac samemu ale nie pamietam jak to zrobilem, pomoze ktos? 
GitHub 

await bo Account.register to coroutine



account = await vulcan.Account.register( keystore, token, symbol, pin ) 




nie ma Uczeń na tle klasy















Uczen na tle klasy to chyba zaden scraping nie jest potrzebny bo ten endpoint zwraca dość ładny JSON



ta libka jest szybsza i stabilniejsza





ta libka jest szybsza i stabilniejsza 



















































































.cs


































































































{
"Envelope": [],
"EnvelopeType": "IEnumerable`1",
"InResponseTo": null,
"RequestId": "0af2f4a9-2aeb-4618-bbe5-4f93074fdad9",
"Status": {
"Code": 0,
"Message": "OK"
},
"Timestamp": 1664478635753,
"TimestampFormatted": "2022-09-29 21:10:35"
}




















































Content-Type jest istotny, reszta raczej nie jest potrzebna
"Status": {
"Code": -1,
"Message": "Internal Server Error (InvalidKeyException)"
},

Uzyskiwanie certyfikatu PFX jest nieaktualna



GitHub 









keyId="fingerprint",headers="vCanonicalUrl vDate",algorithm="sha256withrsa",signature=Base64(SHA256withRSA(ZWH17d77UflTjYdrW8GekXK/L6tQ1JjzlJxhHSFnKj91wizTPpfkSv9SjUJ1Bl5TtoGFyQgks9IVJa4RhWj/xX85w2kKA49QHJu8jAl1VcOs9qzTtCkr3c4rm+JHlF42EaSBFy8cSiCBnP0VyK5bmeHXYjedaaGXEpolrLi1S2QAGwcmGP2bcQn5o9z6NFHWwNgt8o+4sqhmcTdtN45ifPWlDgYA/82WPPZha1kz0r/AyWP5sXPXmgrpzCqWj+ryzWy23l2wgF4c2NbOwzLk9zfJab/1MQOPGyoQdsWJpqpG3uA2AWYyHRiEyrPAzGsSX+tjvulm3tloZUveO0PkKA==)),
"Content-Type": "application/json; charset=utf-8",
Connection: "Keep-Alive",
"Accept-Encoding": "application/gzip",
"User-Agent": "okhttp/3.11.0",
Digest: "SHA-256=RBNvo1WzZ4oRRq0W9+hknpT7T8If536DEMBg9hyq/4o=",
},









keyId="fingerprint",headers="vCanonicalUrl vDate",algorithm="sha256withrsa",signature=Base64(SHA256withRSA(ZWH17d77UflTjYdrW8GekXK/L6tQ1JjzlJxhHSFnKj91wizTPpfkSv9SjUJ1Bl5TtoGFyQgks9IVJa4RhWj/xX85w2kKA49QHJu8jAl1VcOs9qzTtCkr3c4rm+JHlF42EaSBFy8cSiCBnP0VyK5bmeHXYjedaaGXEpolrLi1S2QAGwcmGP2bcQn5o9z6NFHWwNgt8o+4sqhmcTdtN45ifPWlDgYA/82WPPZha1kz0r/AyWP5sXPXmgrpzCqWj+ryzWy23l2wgF4c2NbOwzLk9zfJab/1MQOPGyoQdsWJpqpG3uA2AWYyHRiEyrPAzGsSX+tjvulm3tloZUveO0PkKA==)),
"Content-Type": "application/json; charset=utf-8",
Connection: "Keep-Alive",
"Accept-Encoding": "application/gzip",
"User-Agent": "okhttp/3.11.0",
Digest: "SHA-256=RBNvo1WzZ4oRRq0W9+hknpT7T8If536DEMBg9hyq/4o=",
}, 
















HasRead: null



HasRead: null 




















































































GitHub 











periodId

















uczeń na tle klasy ?
Próbowałem z https://uonetplus-uczen.vulcan.net.pl/xxx/xxxxx/Statystyki.mvc/GetOcenyCzastkowe ale pokazuje się błąd.









uczeń na tle klasy mogę użyć https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe czy musze zrobić to w jakiś inny sposób?
https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe wyświetla błąd:
HTTP Error 404
Wystąpił nieoczekiwany wyjątek. Jeśli problem będzie się powtarzał prosimy o kontakt z serwisem.
a https://uonetplus-uczen.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe :
Wystąpił nieoczekiwany błąd
Wystąpił błąd aplikacji. Prosimy zalogować się ponownie. Jeśli problem będzie się powtarzał, prosimy o kontakt z serwisem.






uczeń na tle klasy mogę użyć https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe czy musze zrobić to w jakiś inny sposób?
https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe wyświetla błąd:
HTTP Error 404
Wystąpił nieoczekiwany wyjątek. Jeśli problem będzie się powtarzał prosimy o kontakt z serwisem.
a https://uonetplus-uczen.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe :
Wystąpił nieoczekiwany błąd
Wystąpił błąd aplikacji. Prosimy zalogować się ponownie. Jeśli problem będzie się powtarzał, prosimy o kontakt z serwisem. uonetplus-uczenplus jest inny endpoint do pobierania statystyk, ale nie pamiętam jaki bo nie zrobiłem go kiedyś w docsach https://marioneq4958.github.io/uczenplus-docs/

uczeń na tle klasy mogę użyć https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe czy musze zrobić to w jakiś inny sposób?
https://uonetplus-uczenplus.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe wyświetla błąd:
HTTP Error 404
Wystąpił nieoczekiwany wyjątek. Jeśli problem będzie się powtarzał prosimy o kontakt z serwisem.
a https://uonetplus-uczen.vulcan.net.pl/xxx/xxxx/Statystyki.mvc/GetOcenyCzastkowe :
Wystąpił nieoczekiwany błąd
Wystąpił błąd aplikacji. Prosimy zalogować się ponownie. Jeśli problem będzie się powtarzał, prosimy o kontakt z serwisem. Wystąpił nieoczekiwany błąd
selenium webdriver i wszystko działa. Nie wiem czy jest to najlepsze rozwiązanie ale narazie mi wystarcza.








