WinToUSB 9.0
qt程序,注册验证代码与EasyUEFI 大同小异,这里仅记录相关类、函数地址
关联 https://www.cnblogs.com/DirWang/p/18149030
目录
- WinToUSB 9.0
- CActivationDlg
- CActivationDlg QMetaObject__d
- CActivationRegisterPage
- CActivationRegisterPage QMetaObject__d
- CActivationOfflinePage
- CActivationOfflinePage QMetaObject__d
- CActivationDlg
- check
- 注册码
- check_rsa_pubk_dec_49B2C0
- rsa_dec_49AFD0
- 激活码
- check_activation_570C40
- 注册码
- 测试
- py
CActivationDlg
.rdata:008047F0 ; class CActivationDlg: CPopupWnd, CWinBaseFrame, QDialog, QWidget, QObject, QPaintDevice; [MI] (#classinformer)
.rdata:008047F0 dd offset const CActivationDlg::`RTTI Complete Object Locator'
.rdata:008047F4 const CActivationDlg::`vftable' dd offset sub_493D70
.rdata:008047F4 ; DATA XREF: sub_402670+B9↑o
.rdata:008047F4 ; sub_403F40+36↑o ...
.rdata:008047F8 dd offset sub_493D90
.rdata:008047FC dd offset sub_493DF0
.rdata:00804800 dd offset sub_403FB0
.rdata:00804804 dd offset QWidget::event(QEvent *)
.rdata:00804808 dd offset sub_49C380
.rdata:0080480C dd offset QObject::timerEvent(QTimerEvent *)
.rdata:00804810 dd offset QObject::childEvent(QChildEvent *)
.rdata:00804814 dd offset QObject::customEvent(QEvent *)
.rdata:00804818 dd offset QObject::connectNotify(QMetaMethod const &)
.rdata:0080481C dd offset QObject::disconnectNotify(QMetaMethod const &)
.rdata:00804820 dd offset QDialog::setVisible(bool)
.rdata:00804824 dd offset QDialog::sizeHint(void)
.rdata:00804828 dd offset QDialog::minimumSizeHint(void)
.rdata:0080482C dd offset QWidget::heightForWidth(int)
.rdata:00804830 dd offset QWidget::hasHeightForWidth(void)
.rdata:00804834 dd offset QWidget::mousePressEvent(QMouseEvent *)
.rdata:00804838 dd offset QWidget::mouseReleaseEvent(QMouseEvent *)
.rdata:0080483C dd offset QWidget::mouseDoubleClickEvent(QMouseEvent *)
.rdata:00804840 dd offset QWidget::mouseMoveEvent(QMouseEvent *)
.rdata:00804844 dd offset QWidget::wheelEvent(QWheelEvent *)
.rdata:00804848 dd offset sub_49DBF0
.rdata:0080484C dd offset QWidget::keyReleaseEvent(QKeyEvent *)
.rdata:00804850 dd offset QWidget::focusInEvent(QFocusEvent *)
.rdata:00804854 dd offset QWidget::focusOutEvent(QFocusEvent *)
.rdata:00804858 dd offset QWidget::enterEvent(QEvent *)
.rdata:0080485C dd offset QWidget::leaveEvent(QEvent *)
.rdata:00804860 dd offset sub_49BE90
.rdata:00804864 dd offset QWidget::moveEvent(QMoveEvent *)
.rdata:00804868 dd offset QDialog::resizeEvent(QResizeEvent *)
.rdata:0080486C dd offset sub_49C0A0
.rdata:00804870 dd offset QDialog::contextMenuEvent(QContextMenuEvent *)
.rdata:00804874 dd offset QWidget::tabletEvent(QTabletEvent *)
.rdata:00804878 dd offset QWidget::actionEvent(QActionEvent *)
.rdata:0080487C dd offset QWidget::dragEnterEvent(QDragEnterEvent *)
.rdata:00804880 dd offset QWidget::dragMoveEvent(QDragMoveEvent *)
.rdata:00804884 dd offset QWidget::dragLeaveEvent(QDragLeaveEvent *)
.rdata:00804888 dd offset QWidget::dropEvent(QDropEvent *)
.rdata:0080488C dd offset QDialog::showEvent(QShowEvent *)
.rdata:00804890 dd offset QWidget::hideEvent(QHideEvent *)
.rdata:00804894 dd offset QWidget::nativeEvent(QByteArray const &,void *,long *)
.rdata:00804898 dd offset QWidget::changeEvent(QEvent *)
.rdata:0080489C dd offset QWidget::inputMethodEvent(QInputMethodEvent *)
.rdata:008048A0 dd offset QWidget::inputMethodQuery(Qt::InputMethodQuery)
.rdata:008048A4 dd offset QWidget::focusNextPrevChild(bool)
.rdata:008048A8 dd offset QDialog::open(void)
.rdata:008048AC dd offset sub_49BB50
.rdata:008048B0 dd offset QDialog::done(int)
.rdata:008048B4 dd offset QDialog::accept(void)
.rdata:008048B8 dd offset sub_49C0D0
.rdata:008048BC dd offset sub_49C170
.rdata:008048C0 dd offset sub_49DAC0
.rdata:008048C4 dd offset nullsub_15
.rdata:008048C8 dd offset QWidget::showMinimized(void)
.rdata:008048CC dd offset nullsub_16
.rdata:008048D0 dd offset nullsub_17
.rdata:008048D4 dd offset nullsub_18
.rdata:008048D8 dd offset sub_49DA70
.rdata:008048DC dd offset sub_4010F0
CActivationDlg QMetaObject__d
.rdata:009D4510 qt_meta_stringdata_CActivationDlg QArrayData <0FFFFFFFFh, 0Eh, 0, 30h>
.rdata:009D4510 ; DATA XREF: .rdata:CActivationDlg↓o
.rdata:009D4510 ; String: CActivationDlg, alloc: 0, capRvrsd 0
.rdata:009D4520 QArrayData <0FFFFFFFFh, 15h, 0, 2Fh> ; String: sigReinitRegisterPage, alloc: 0, capRvrsd 0
.rdata:009D4530 QArrayData <0FFFFFFFFh, 0, 0, 35h> ; String: , alloc: 0, capRvrsd 0
.rdata:009D4540 aCactivationdlg db 'CActivationDlg',0 ; DATA XREF: sub_493D90+11↑o
.rdata:009D454F aSigreinitregis db 'sigReinitRegisterPage',0
.rdata:009D4565 align 4
.rdata:009D4568 qt_meta_dataCActivationDlg QMetaObjectPrivate <7, 0, 0, 0, 1, 0Eh, 0, 0, 0, 0, 0, 0, 0, 1>
.rdata:009D4568 ; DATA XREF: .rdata:CActivationDlg↓o
.rdata:009D4568 ; CLASS: CActivationDlg
.rdata:009D4568 ; MethodCount: 1 PropertyCount: 0 EnumCount: 0
.rdata:009D4568 ; ConstructorCount: 0 SignalCount: 1
.rdata:009D45A0 QMetaMethod <1, 0, 13h, 2, 6> ; SIGNAL Public Void sigReinitRegisterPage()
.rdata:009D45B4 dd 2Bh ; Void
.rdata:009D45B8 db 0
.rdata:009D45B9 db 0
.rdata:009D45BA db 0
.rdata:009D45BB db 0
.rdata:009D45BC CActivationDlg QMetaObject__d <offset CPopupWnd, \
.rdata:009D45BC ; DATA XREF: sub_4041A0+25D↑o
.rdata:009D45BC ; CActivationDlg__qt_static_metacall+16↑o ...
.rdata:009D45BC offset qt_meta_stringdata_CActivationDlg, \
.rdata:009D45BC offset qt_meta_dataCActivationDlg, \
.rdata:009D45BC offset CActivationDlg__qt_static_metacall, 0, 0>
CActivationRegisterPage
.rdata:00804E20 ; class CActivationRegisterPage: CBasePage, QWidget, QObject, QPaintDevice; [MI] (#classinformer)
.rdata:00804E20 dd offset const CActivationRegisterPage::`RTTI Complete Object Locator'
.rdata:00804E24 const CActivationRegisterPage::`vftable' dd offset sub_494130
.rdata:00804E24 ; DATA XREF: CActivationRegisterPage_405CF0+52↑o
.rdata:00804E24 ; sub_405E10+25↑o
.rdata:00804E28 dd offset sub_494150
.rdata:00804E2C dd offset sub_4941B0
.rdata:00804E30 dd offset sub_405DF0
.rdata:00804E34 dd offset QWidget::event(QEvent *)
.rdata:00804E38 dd offset QObject::eventFilter(QObject *,QEvent *)
.rdata:00804E3C dd offset QObject::timerEvent(QTimerEvent *)
.rdata:00804E40 dd offset QObject::childEvent(QChildEvent *)
.rdata:00804E44 dd offset QObject::customEvent(QEvent *)
.rdata:00804E48 dd offset QObject::connectNotify(QMetaMethod const &)
.rdata:00804E4C dd offset QObject::disconnectNotify(QMetaMethod const &)
.rdata:00804E50 dd offset QWidget::setVisible(bool)
.rdata:00804E54 dd offset QWidget::sizeHint(void)
.rdata:00804E58 dd offset QWidget::minimumSizeHint(void)
.rdata:00804E5C dd offset QWidget::heightForWidth(int)
.rdata:00804E60 dd offset QWidget::hasHeightForWidth(void)
.rdata:00804E64 dd offset QWidget::mousePressEvent(QMouseEvent *)
.rdata:00804E68 dd offset QWidget::mouseReleaseEvent(QMouseEvent *)
.rdata:00804E6C dd offset QWidget::mouseDoubleClickEvent(QMouseEvent *)
.rdata:00804E70 dd offset QWidget::mouseMoveEvent(QMouseEvent *)
.rdata:00804E74 dd offset QWidget::wheelEvent(QWheelEvent *)
.rdata:00804E78 dd offset QWidget::keyPressEvent(QKeyEvent *)
.rdata:00804E7C dd offset QWidget::keyReleaseEvent(QKeyEvent *)
.rdata:00804E80 dd offset QWidget::focusInEvent(QFocusEvent *)
.rdata:00804E84 dd offset QWidget::focusOutEvent(QFocusEvent *)
.rdata:00804E88 dd offset QWidget::enterEvent(QEvent *)
.rdata:00804E8C dd offset QWidget::leaveEvent(QEvent *)
.rdata:00804E90 dd offset QWidget::paintEvent(QPaintEvent *)
.rdata:00804E94 dd offset QWidget::moveEvent(QMoveEvent *)
.rdata:00804E98 dd offset QWidget::resizeEvent(QResizeEvent *)
.rdata:00804E9C dd offset QWidget::closeEvent(QCloseEvent *)
.rdata:00804EA0 dd offset QWidget::contextMenuEvent(QContextMenuEvent *)
.rdata:00804EA4 dd offset QWidget::tabletEvent(QTabletEvent *)
.rdata:00804EA8 dd offset QWidget::actionEvent(QActionEvent *)
.rdata:00804EAC dd offset QWidget::dragEnterEvent(QDragEnterEvent *)
.rdata:00804EB0 dd offset QWidget::dragMoveEvent(QDragMoveEvent *)
.rdata:00804EB4 dd offset QWidget::dragLeaveEvent(QDragLeaveEvent *)
.rdata:00804EB8 dd offset QWidget::dropEvent(QDropEvent *)
.rdata:00804EBC dd offset showEvent_406620
.rdata:00804EC0 dd offset QWidget::hideEvent(QHideEvent *)
.rdata:00804EC4 dd offset QWidget::nativeEvent(QByteArray const &,void *,long *)
.rdata:00804EC8 dd offset QWidget::changeEvent(QEvent *)
.rdata:00804ECC dd offset QWidget::inputMethodEvent(QInputMethodEvent *)
.rdata:00804ED0 dd offset QWidget::inputMethodQuery(Qt::InputMethodQuery)
.rdata:00804ED4 dd offset QWidget::focusNextPrevChild(bool)
.rdata:00804ED8 dd offset sub_405E90
.rdata:00804EDC dd offset nullsub_19
.rdata:00804EE0 dd offset nullsub_20
.rdata:00804EE4 dd offset setupUi_405EA0
.rdata:00804EE8 dd offset set_button_406400
.rdata:00804EEC dd offset Register_4066F0
.rdata:00804EF0 dd offset buy__open_store_wintousb_406650
.rdata:00804EF4 dd offset sub_406640
CActivationRegisterPage QMetaObject__d
.rdata:009D4010 qt_meta_stringdata_CActivationRegisterPage QArrayData <0FFFFFFFFh, 17h, 0, 0A0h>
.rdata:009D4010 ; DATA XREF: .rdata:CActivationRegisterPage↓o
.rdata:009D4010 ; String: CActivationRegisterPage, alloc: 0, capRvrsd 0
.rdata:009D4020 QArrayData <0FFFFFFFFh, 1Ah, 0, 0A8h> ; String: sigReinitOfflineActivePage, alloc: 0, capRvrsd 0
.rdata:009D4030 QArrayData <0FFFFFFFFh, 0, 0, 0B3h> ; String: , alloc: 0, capRvrsd 0
.rdata:009D4040 QArrayData <0FFFFFFFFh, 8, 0, 0A4h> ; String: QString&, alloc: 0, capRvrsd 0
.rdata:009D4050 QArrayData <0FFFFFFFFh, 0Dh, 0, 9Dh> ; String: eEditionType&, alloc: 0, capRvrsd 0
.rdata:009D4060 QArrayData <0FFFFFFFFh, 1Fh, 0, 9Bh> ; String: sigReinitActivationCompletePage, alloc: 0, capRvrsd 0
.rdata:009D4070 QArrayData <0FFFFFFFFh, 6, 0, 0ABh> ; String: BRRET&, alloc: 0, capRvrsd 0
.rdata:009D4080 QArrayData <0FFFFFFFFh, 0Eh, 0, 0A2h> ; String: slotReinitPage, alloc: 0, capRvrsd 0
.rdata:009D4090 QArrayData <0FFFFFFFFh, 1Ah, 0, 0A1h> ; String: slotLicenseEditTextChanged, alloc: 0, capRvrsd 0
.rdata:009D40A0 QArrayData <0FFFFFFFFh, 0Ah, 0, 0ACh> ; String: strLicense, alloc: 0, capRvrsd 0
.rdata:009D40B0 aCactivationreg db 'CActivationRegisterPage',0
.rdata:009D40B0 ; DATA XREF: sub_494150+11↑o
.rdata:009D40C8 aSigreinitoffli db 'sigReinitOfflineActivePage',0
.rdata:009D40E3 align 4
.rdata:009D40E4 aQstring db 'QString&',0
.rdata:009D40ED aEeditiontype_1 db 'eEditionType&',0
.rdata:009D40FB aSigreinitactiv db 'sigReinitActivationCompletePage',0
.rdata:009D411B aBrret_4 db 'BRRET&',0
.rdata:009D4122 aSlotreinitpage db 'slotReinitPage',0
.rdata:009D4131 aSlotlicenseedi db 'slotLicenseEditTextChanged',0
.rdata:009D414C aStrlicense db 'strLicense',0
.rdata:009D4157 align 4
.rdata:009D4158 qt_meta_dataCActivationRegisterPage QMetaObjectPrivate <7, 0, 0, 0, 4, 0Eh, 0, 0, 0, 0, 0, 0, 0, 2>
.rdata:009D4158 ; DATA XREF: .rdata:CActivationRegisterPage↓o
.rdata:009D4158 ; CLASS: CActivationRegisterPage
.rdata:009D4158 ; MethodCount: 4 PropertyCount: 0 EnumCount: 0
.rdata:009D4158 ; ConstructorCount: 0 SignalCount: 2
.rdata:009D4190 QMetaMethod <1, 3, 22h, 2, 6> ; SIGNAL Public Void sigReinitOfflineActivePage(QString& , QString& , eEditionType& )
.rdata:009D41A4 QMetaMethod <5, 4, 29h, 2, 6> ; SIGNAL Public Void sigReinitActivationCompletePage(BRRET& , QString& , QString& , eEditionType& )
.rdata:009D41B8 QMetaMethod <7, 0, 32h, 2, 8> ; SLOT Private Void slotReinitPage()
.rdata:009D41CC QMetaMethod <8, 1, 33h, 2, 8> ; SLOT Private Void slotLicenseEditTextChanged(QString strLicense)
.rdata:009D41E0 dd 2Bh ; Void
.rdata:009D41E4 dd 80000003h ; QString&
.rdata:009D41E8 dd 80000003h ; QString&
.rdata:009D41EC dd 80000004h ; eEditionType&
.rdata:009D41F0 dd 2
.rdata:009D41F4 dd 2
.rdata:009D41F8 dd 2
.rdata:009D41FC dd 2Bh ; Void
.rdata:009D4200 dd 80000006h ; BRRET&
.rdata:009D4204 dd 80000003h ; QString&
.rdata:009D4208 dd 80000003h ; QString&
.rdata:009D420C dd 80000004h ; eEditionType&
.rdata:009D4210 dd 2
.rdata:009D4214 dd 2
.rdata:009D4218 dd 2
.rdata:009D421C dd 2
.rdata:009D4220 dd 2Bh ; Void
.rdata:009D4224 dd 2Bh ; Void
.rdata:009D4228 dd 0Ah ; QString
.rdata:009D422C dd 9 ; strLicense
.rdata:009D4230 db 0
.rdata:009D4231 db 0
.rdata:009D4232 db 0
.rdata:009D4233 db 0
.rdata:009D4234 CActivationRegisterPage QMetaObject__d <offset CBasePage, \
.rdata:009D4234 ; DATA XREF: Register_4066F0:loc_406BBF↑o
.rdata:009D4234 ; sub_494130:loc_49413F↑o ...
.rdata:009D4234 offset qt_meta_stringdata_CActivationRegisterPage, \
.rdata:009D4234 offset qt_meta_dataCActivationRegisterPage, \
.rdata:009D4234 offset CActivationRegisterPage__qt_static_metacall, 0,\
.rdata:009D4234 0>
CActivationOfflinePage
.rdata:00804BF0 ; class CActivationOfflinePage: CBasePage, QWidget, QObject, QPaintDevice; [MI] (#classinformer)
.rdata:00804BF0 dd offset const CActivationOfflinePage::`RTTI Complete Object Locator'
.rdata:00804BF4 const CActivationOfflinePage::`vftable' dd offset sub_493F30
.rdata:00804BF4 ; DATA XREF: sub_404590+52↑o
.rdata:00804BF4 ; sub_404690+25↑o
.rdata:00804BF8 dd offset sub_493F50
.rdata:00804BFC dd offset sub_493FB0
.rdata:00804C00 dd offset sub_404670
.rdata:00804C04 dd offset QWidget::event(QEvent *)
.rdata:00804C08 dd offset QObject::eventFilter(QObject *,QEvent *)
.rdata:00804C0C dd offset QObject::timerEvent(QTimerEvent *)
.rdata:00804C10 dd offset QObject::childEvent(QChildEvent *)
.rdata:00804C14 dd offset QObject::customEvent(QEvent *)
.rdata:00804C18 dd offset QObject::connectNotify(QMetaMethod const &)
.rdata:00804C1C dd offset QObject::disconnectNotify(QMetaMethod const &)
.rdata:00804C20 dd offset QWidget::setVisible(bool)
.rdata:00804C24 dd offset QWidget::sizeHint(void)
.rdata:00804C28 dd offset QWidget::minimumSizeHint(void)
.rdata:00804C2C dd offset QWidget::heightForWidth(int)
.rdata:00804C30 dd offset QWidget::hasHeightForWidth(void)
.rdata:00804C34 dd offset QWidget::mousePressEvent(QMouseEvent *)
.rdata:00804C38 dd offset QWidget::mouseReleaseEvent(QMouseEvent *)
.rdata:00804C3C dd offset QWidget::mouseDoubleClickEvent(QMouseEvent *)
.rdata:00804C40 dd offset QWidget::mouseMoveEvent(QMouseEvent *)
.rdata:00804C44 dd offset QWidget::wheelEvent(QWheelEvent *)
.rdata:00804C48 dd offset QWidget::keyPressEvent(QKeyEvent *)
.rdata:00804C4C dd offset QWidget::keyReleaseEvent(QKeyEvent *)
.rdata:00804C50 dd offset QWidget::focusInEvent(QFocusEvent *)
.rdata:00804C54 dd offset QWidget::focusOutEvent(QFocusEvent *)
.rdata:00804C58 dd offset QWidget::enterEvent(QEvent *)
.rdata:00804C5C dd offset QWidget::leaveEvent(QEvent *)
.rdata:00804C60 dd offset QWidget::paintEvent(QPaintEvent *)
.rdata:00804C64 dd offset QWidget::moveEvent(QMoveEvent *)
.rdata:00804C68 dd offset QWidget::resizeEvent(QResizeEvent *)
.rdata:00804C6C dd offset QWidget::closeEvent(QCloseEvent *)
.rdata:00804C70 dd offset QWidget::contextMenuEvent(QContextMenuEvent *)
.rdata:00804C74 dd offset QWidget::tabletEvent(QTabletEvent *)
.rdata:00804C78 dd offset QWidget::actionEvent(QActionEvent *)
.rdata:00804C7C dd offset QWidget::dragEnterEvent(QDragEnterEvent *)
.rdata:00804C80 dd offset QWidget::dragMoveEvent(QDragMoveEvent *)
.rdata:00804C84 dd offset QWidget::dragLeaveEvent(QDragLeaveEvent *)
.rdata:00804C88 dd offset QWidget::dropEvent(QDropEvent *)
.rdata:00804C8C dd offset sub_4054A0
.rdata:00804C90 dd offset QWidget::hideEvent(QHideEvent *)
.rdata:00804C94 dd offset QWidget::nativeEvent(QByteArray const &,void *,long *)
.rdata:00804C98 dd offset QWidget::changeEvent(QEvent *)
.rdata:00804C9C dd offset QWidget::inputMethodEvent(QInputMethodEvent *)
.rdata:00804CA0 dd offset QWidget::inputMethodQuery(Qt::InputMethodQuery)
.rdata:00804CA4 dd offset QWidget::focusNextPrevChild(bool)
.rdata:00804CA8 dd offset sub_404710
.rdata:00804CAC dd offset nullsub_19
.rdata:00804CB0 dd offset nullsub_20
.rdata:00804CB4 dd offset setupUI_404730
.rdata:00804CB8 dd offset set_button_405280
.rdata:00804CBC dd offset Offline_Register_4054E0
.rdata:00804CC0 dd offset sub_4054D0
.rdata:00804CC4 dd offset sub_4054C0
CActivationOfflinePage QMetaObject__d
.rdata:009D4250 qt_meta_stringdata_CActivationOfflinePage QArrayData <0FFFFFFFFh, 16h, 0, 0E0h>
.rdata:009D4250 ; DATA XREF: .rdata:CActivationOfflinePage↓o
.rdata:009D4250 ; String: CActivationOfflinePage, alloc: 0, capRvrsd 0
.rdata:009D4260 QArrayData <0FFFFFFFFh, 1Fh, 0, 0E7h> ; String: sigReinitActivationCompletePage, alloc: 0, capRvrsd 0
.rdata:009D4270 QArrayData <0FFFFFFFFh, 0, 0, 0F7h> ; String: , alloc: 0, capRvrsd 0
.rdata:009D4280 QArrayData <0FFFFFFFFh, 6, 0, 0E8h> ; String: BRRET&, alloc: 0, capRvrsd 0
.rdata:009D4290 QArrayData <0FFFFFFFFh, 8, 0, 0DFh> ; String: QString&, alloc: 0, capRvrsd 0
.rdata:009D42A0 QArrayData <0FFFFFFFFh, 0Dh, 0, 0D8h> ; String: eEditionType&, alloc: 0, capRvrsd 0
.rdata:009D42B0 QArrayData <0FFFFFFFFh, 0Eh, 0, 0D6h> ; String: slotReinitPage, alloc: 0, capRvrsd 0
.rdata:009D42C0 QArrayData <0FFFFFFFFh, 8, 0, 0D5h> ; String: strEmail, alloc: 0, capRvrsd 0
.rdata:009D42D0 QArrayData <0FFFFFFFFh, 0Ah, 0, 0CEh> ; String: strLicense, alloc: 0, capRvrsd 0
.rdata:009D42E0 QArrayData <0FFFFFFFFh, 0Ch, 0, 0C9h> ; String: eEditionType, alloc: 0, capRvrsd 0
.rdata:009D42F0 QArrayData <0FFFFFFFFh, 21h, 0, 0C6h> ; String: slotActivationCodeEditTextChanged, alloc: 0, capRvrsd 0
.rdata:009D4300 QArrayData <0FFFFFFFFh, 11h, 0, 0D8h> ; String: strActivationCode, alloc: 0, capRvrsd 0
.rdata:009D4310 QArrayData <0FFFFFFFFh, 1Ch, 0, 0DAh> ; String: slotOfflineActivateLinkPress, alloc: 0, capRvrsd 0
.rdata:009D4320 QArrayData <0FFFFFFFFh, 6, 0, 0E7h> ; String: strUrl, alloc: 0, capRvrsd 0
.rdata:009D4330 aCactivationoff db 'CActivationOfflinePage',0
.rdata:009D4330 ; DATA XREF: sub_493F50+11↑o
.rdata:009D4347 aSigreinitactiv_0 db 'sigReinitActivationCompletePage',0
.rdata:009D4367 align 4
.rdata:009D4368 aBrret_5 db 'BRRET&',0
.rdata:009D436F aQstring_0 db 'QString&',0
.rdata:009D4378 aEeditiontype_2 db 'eEditionType&',0
.rdata:009D4386 aSlotreinitpage_0 db 'slotReinitPage',0
.rdata:009D4395 aStremail db 'strEmail',0
.rdata:009D439E aStrlicense_0 db 'strLicense',0
.rdata:009D43A9 aEeditiontype_3 db 'eEditionType',0
.rdata:009D43B6 aSlotactivation db 'slotActivationCodeEditTextChanged',0
.rdata:009D43D8 aStractivationc db 'strActivationCode',0
.rdata:009D43EA aSlotofflineact db 'slotOfflineActivateLinkPress',0
.rdata:009D4407 aStrurl_0 db 'strUrl',0
.rdata:009D440E align 10h
.rdata:009D4410 qt_meta_dataCActivationOfflinePage QMetaObjectPrivate <7, 0, 0, 0, 4, 0Eh, 0, 0, 0, 0, 0, 0, 0, 1>
.rdata:009D4410 ; DATA XREF: .rdata:CActivationOfflinePage↓o
.rdata:009D4410 ; CLASS: CActivationOfflinePage
.rdata:009D4410 ; MethodCount: 4 PropertyCount: 0 EnumCount: 0
.rdata:009D4410 ; ConstructorCount: 0 SignalCount: 1
.rdata:009D4448 QMetaMethod <1, 4, 22h, 2, 6> ; SIGNAL Public Void sigReinitActivationCompletePage(BRRET& , QString& , QString& , eEditionType& )
.rdata:009D445C QMetaMethod <6, 3, 2Bh, 2, 8> ; SLOT Private Void slotReinitPage(QString& strEmail, QString& strLicense, eEditionType& eEditionType)
.rdata:009D4470 QMetaMethod <0Ah, 1, 32h, 2, 8> ; SLOT Private Void slotActivationCodeEditTextChanged(QString strActivationCode)
.rdata:009D4484 QMetaMethod <0Ch, 1, 35h, 2, 8> ; SLOT Private Void slotOfflineActivateLinkPress(QString strUrl)
.rdata:009D4498 dd 2Bh ; Void
.rdata:009D449C dd 80000003h ; BRRET&
.rdata:009D44A0 dd 80000004h ; QString&
.rdata:009D44A4 dd 80000004h ; QString&
.rdata:009D44A8 dd 80000005h ; eEditionType&
.rdata:009D44AC dd 2
.rdata:009D44B0 dd 2
.rdata:009D44B4 dd 2
.rdata:009D44B8 dd 2
.rdata:009D44BC dd 2Bh ; Void
.rdata:009D44C0 dd 80000004h ; QString&
.rdata:009D44C4 dd 80000004h ; QString&
.rdata:009D44C8 dd 80000005h ; eEditionType&
.rdata:009D44CC dd 7 ; strEmail
.rdata:009D44D0 dd 8 ; strLicense
.rdata:009D44D4 dd 9 ; eEditionType
.rdata:009D44D8 dd 2Bh ; Void
.rdata:009D44DC dd 0Ah ; QString
.rdata:009D44E0 dd 0Bh ; strActivationCode
.rdata:009D44E4 dd 2Bh ; Void
.rdata:009D44E8 dd 0Ah ; QString
.rdata:009D44EC dd 0Dh ; strUrl
.rdata:009D44F0 db 0
.rdata:009D44F1 db 0
.rdata:009D44F2 db 0
.rdata:009D44F3 db 0
.rdata:009D44F4 CActivationOfflinePage QMetaObject__d <offset CBasePage, \
.rdata:009D44F4 ; DATA XREF: Offline_Register_4054E0+2A8↑o
.rdata:009D44F4 ; sub_493F30:loc_493F3F↑o ...
.rdata:009D44F4 offset qt_meta_stringdata_CActivationOfflinePage, \
.rdata:009D44F4 offset qt_meta_dataCActivationOfflinePage, \
.rdata:009D44F4 offset CActivationOfflinePage__qt_static_metacall, 0, \
.rdata:009D44F4 0>
check
注册码
Register_4066F0
check_rsa_pubk_dec_49B2C0
DWORD __cdecl check_rsa_pubk_dec_49B2C0(char *out, wchar_t *Sourcea, int a3)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]v4 = v3;memset(Dest, 0, 0x31);memset(data, 0, 0x1F);v5 = wcslen(v3);if ( Sourcea && wcslen(Sourcea) == 0x30 && v4 && v5 ){v6 = (char *)malloc(v5 + 1);String = v6;if ( v6 ){if ( v5 == wcstombs(v6, v4, v5 + 1) ){_strupr(String);if ( wcstombs(Dest, Sourcea, 0x31u) == 0x30 ){_strupr(Dest);LastError = xxb32_decode_49B190((int)data, (int)Dest);if ( (_WORD)v12 ){log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x2A0, LastError, v12);}else{LastError = rsa_dec_49AFD0(data, (int)out, a3);if ( v13 ){log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", v16, v17, 0x2A7);}else{v14 = out[0x1D];out[0x1D] = 0;if ( v14 != (unsigned __int8)crc8_49B7E0(0, (unsigned __int8 *)out) ){LastError = GetLastError();log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", v16, v17, 0x2B0);}}}}else{v11 = GetLastError() + 0x297000E00000000i64;LastError = v11;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x298, v11);}}else{v10 = GetLastError() + 0x28F000E00000000i64;LastError = v10;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x290, v10);}}else{v8 = GetLastError() + 0x289000300000000i64;LastError = v8;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x28A, v8);}if ( String )free(String);}else{v15 = GetLastError() + 0x28101F100000000i64;LastError = v15;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x282, v15);}return LastError;
}
rsa_dec_49AFD0
int __thiscall rsa_dec_49AFD0(void *data, int out, unsigned __int8 a3)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]v3 = 0;memset(v14, 0, 0x1000u);v4 = "-----BEGIN RSA PUBLIC KEY-----\n""MCYCHwC9s2qhNcaeKtlin3VtwnU9Vv4x/j0wBPS43F/8eKMCAwEAAQ==\n""-----END RSA PUBLIC KEY-----\n";if ( a3 >= 6u )v4 = "-----BEGIN RSA PUBLIC KEY-----\n""MCYCHwClu0T8p4bIbBbZW+PHRMA3XqSZ3+smlgw2JdmLMuUCAwEAAQ==\n""-----END RSA PUBLIC KEY-----\n";qmemcpy(v14, v4, 0x75u);v5 = BIO_new_mem_buf(v14, 0x75);v6 = v5;if ( v5 ){bio = PEM_read_bio_(v5, 0, 0, 0);v9 = bio;if ( bio ){if ( RSA_eay_public_decrypt_71AEE0(30, (int)data, out, (int)bio) < 0 ){v11 = GetLastError() + 0x13D000200000000i64;v3 = v11;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x13E, v11);}}else{v10 = GetLastError() + 0x135007200000000i64;v3 = v10;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x136, v10);}BIO_free_all(v6);if ( v9 )RSA_free(v9);}else{v7 = GetLastError() + 0x12D000300000000i64;v3 = v7;log_4B0FD0((int)L"%S %d nRet=0x%016llX\n", ".\\License.cpp", 0x12E, v7);}CRYPTO_cleanup_all_ex_data();return v3;
}
激活码
.rdata:009F15BC ; class CActiveOnline: IActiveOnlineEx, IActiveOnline, IActiveOnlineBase; (#classinformer)
.rdata:009F15BC dd offset const CActiveOnline::`RTTI Complete Object Locator'
.rdata:009F15C0 const CActiveOnline::`vftable' dd offset sub_56CB20
.rdata:009F15C0 ; DATA XREF: CActiveOnline_56C8E0+37↑o
.rdata:009F15C0 ; sub_56C9F0+26↑o
.rdata:009F15C4 dd offset sub_56C5A0
.rdata:009F15C8 dd offset sub_56C5B0
.rdata:009F15CC dd offset sub_570300
.rdata:009F15D0 dd offset sub_570400
.rdata:009F15D4 dd offset sub_5704A0
.rdata:009F15D8 dd offset sub_570460
.rdata:009F15DC dd offset check_activation_570C40
.rdata:009F15E0 dd offset sub_570BF0
.rdata:009F15E4 dd offset sub_571300
.rdata:009F15E8 dd offset sub_571370
.rdata:009F15EC dd offset sub_571390
.rdata:009F15F0 dd offset sub_571730
.rdata:009F15F4 dd offset sub_5718A0
check_activation_570C40
int __thiscall check_activation_570C40(_DWORD *this, void *Source, int a3)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]v40 = this;*(_DWORD *)v69 = 7;v68 = 0;LOWORD(v66) = 0;v88 = 6;v46 = 7;v45 = 0;LOWORD(String[0]) = 0;v50 = 7;v49 = 0;LOWORD(lpWideCharStr) = 0;v54 = 7;v53 = 0;LOWORD(v52) = 0;v61 = 7;v60 = 0;LOWORD(v59) = 0;_Ptr = 0;memset(v87, 0, sizeof(v87));v71 = 0;v72 = 0;v73 = 0;v79 = 0;v80 = 0;v81 = 0;v82 = 0;v83 = 0;v84 = 0;v85 = 0;v75 = 0;*(_DWORD *)v76 = 0;v77 = 0;MultiByteStr = 0;v78 = 0;v74 = 0;v64 = 0xF;v63 = 0;LOBYTE(v62) = 0;v57 = 0xF;v56 = 0;LOBYTE(v55) = 0;v41 = operator new(1u);LOBYTE(v88) = 7;if ( this[2] ){if ( Source ){if ( a3 ){sub_411430(v65, Source, wcslen((const unsigned __int16 *)Source));v39 = sub_5782F0((int)(this + 0x14), v65, (int)v65);if ( (v39 & 0xFFF) == 0 ){v36 = &v58;v35 = (int)&v51;v39 = (int)&v28;sub_4105B0(v65, (int)&v28);// split '|'v35 = sub_571A10((int)v47, (int)v43, v28, v29, v30, v31, v32, v33, v34, v35, (int)v36);if ( (v35 & 0xFFF) == 0 ){v4 = v42[0];if ( v42[5] < (wchar_t *)8 )v4 = (const wchar_t *)v42;if ( (unsigned int)(wcstol(v4, 0, 0x10) - 0x8000) > 0x11 )v35 = 0x2E601001;elsev35 = sub_572410();if ( (v35 & 0xFFF) == 0 ){v5 = v36;v6 = v36 + 0x48;if ( sub_4BA960((int)(v36 + 0x48)) ){if ( v45 == 8 || v49 == 8 ){v7 = String[0];if ( v46 < 8 )v7 = (const WCHAR *)String;WideCharToMultiByte(0, 0, v7, 0xFFFFFFFF, v65, 0xA, 0, 0);p_lpWideCharStr = lpWideCharStr;if ( v50 < 8 )p_lpWideCharStr = (const WCHAR *)&lpWideCharStr;WideCharToMultiByte(0, 0, p_lpWideCharStr, 0xFFFFFFFF, v67, 0xA, 0, 0);if ( (unsigned int)v5[0x47] < 8 )v9 = (const WCHAR *)(v5 + 0x42);elsev9 = (const WCHAR *)v5[0x42];WideCharToMultiByte(0, 0, v9, 0xFFFFFFFF, &v76[3], 0x40, 0, 0);if ( (unsigned int)v6[6] < 8 )v10 = (const WCHAR *)(v6 + 1);elsev10 = (const WCHAR *)v6[1];WideCharToMultiByte(0, 0, v10, 0xFFFFFFFF, v69, 0x18, 0, 0);v37 = &v23;std::string::string((std::string *)&v23, &v76[3]);v11 = (const std::string *)sub_577E00(v38, v23, v24, v25, v26, v27, v28, (int)v29);v87[0x2F] = 8;std::string::assign((std::string *)&v58, v11, 0, 0xFFFFFFFF);v87[0x2F] = 7;std::string::~string((int)v38);v37 = &v23;std::string::string((std::string *)&v23, v69);v12 = (const std::string *)sub_577E00(v38, v23, v24, v25, v26, v27, v28, (int)v29);v87[0x2F] = 9;std::string::assign((std::string *)&v51, v12, 0, 0xFFFFFFFF);v87[0x2F] = 7;std::string::~string((int)v38);v13 = std::string::substr((std::string *)8, (std::string *)8, v30, v31);if ( *((_DWORD *)v13 + 6) < 0x10u )v14 = (char *)v13 + 4;elsev14 = (const char *)*((_DWORD *)v13 + 1);v15 = strcmp(v14, v65);std::string::~string((int)v38);if ( v15 ){v35 = 0x14B01003;}else{v19 = std::string::substr((std::string *)8, (std::string *)8, v30, v31);if ( *((_DWORD *)v19 + 6) < 0x10u )v20 = (char *)v19 + 4;elsev20 = (const char *)*((_DWORD *)v19 + 1);v21 = strcmp(v20, v67);std::string::~string((int)v38);if ( v21 )v35 = 0x14C01003;}}else{v35 = 0x14401003;}}else{v35 = 0x1420100B;}}}}}else{v39 = 0x12801002;}}else{v39 = 0x12701002;}}else{v39 = 0x12501004;}sub_56D4D0();v16 = v39;v17 = (wchar_t **)String[0];if ( (v39 & 0xFFF) != 0 ){if ( v46 < 8 )v17 = String;v36 = (int *)v17;LastError = GetLastError();sub_575C20(L"[A] AutoActive failed! uReturn = %x SysErr = %d wsStatus = %s", v16, LastError);}else{if ( v46 < 8 )v17 = String;sub_575C20(L"[A] AutoActive success. wsStatus = %s", v17);}operator delete(v41);if ( v57 >= 0x10 )operator delete(v55);v57 = 0xF;v56 = 0;LOBYTE(v55) = 0;if ( v64 >= 0x10 )operator delete(v62);v64 = 0xF;v63 = 0;LOBYTE(v62) = 0;if ( v61 >= 8 )operator delete(v59);v61 = 7;v60 = 0;LOWORD(v59) = 0;if ( v54 >= 8 )operator delete((void *)v52);v54 = 7;v53 = 0;LOWORD(v52) = 0;if ( v50 >= 8 )operator delete((void *)lpWideCharStr);v50 = 7;v49 = 0;LOWORD(lpWideCharStr) = 0;if ( v46 >= 8 )operator delete(String[0]);v46 = 7;v45 = 0;LOWORD(String[0]) = 0;if ( *(_DWORD *)v69 >= 8u )operator delete(v66);return v39;
}
测试
py
'''
pip install pycryptodome
'''
import base64
import ctypes
import io
import os
import random
from typing import Union
from Crypto.PublicKey import RSA
from Crypto.Util.number import inverseimport hashlib
import time
from datetime import datetimedef convert_to_time64(time_str):# 解析时间字符串为 datetime 对象dt_obj = datetime.strptime(time_str, r"%Y-%m-%d %H:%M:%S")# 将 datetime 对象转换为时间戳timestamp = dt_obj.timestamp()# # 将时间戳转换为 _time64 格式# time64 = int(timestamp * 1e7) # 1e7 是将秒转换为 100 纳秒的单位time64 = int(timestamp)return time64def convert_to_time_string(time64):# 将 _time64 格式的时间戳转换为秒数# timestamp = time64 / 1e7 # 将 100 纳秒转换为秒# 使用 fromtimestamp 将秒数转换为 datetime 对象dt_obj = datetime.fromtimestamp(time64)# 使用 strftime 方法将 datetime 对象格式化为时间字符串time_str = dt_obj.strftime("%Y-%m-%d %H:%M:%S")return time_strpubk = "-----BEGIN RSA PUBLIC KEY-----\n"\"MCYCHwC9s2qhNcaeKtlin3VtwnU9Vv4x/j0wBPS43F/8eKMCAwEAAQ==\n"\"-----END RSA PUBLIC KEY-----\n"def rsa_pk_enc(data: bytes) -> bytes:# http://factordb.com/index.php?query=1309267119417726280330942057320079958095363483536018220587938405183944867# e=65537p = 1138829745998159918316484590691394789q = 1149660099780921729474053823339894503n = p*q# phi = (p - 1) * (q - 1)# d = inverse(e, phi)# print(d)d = 461760535243012729352417637561931856791126802617053449862506727428818545t = int.from_bytes(data, 'big')x = pow(t, d, n)bs = i2bs(x)# print(x)# print(bs,bs.hex())return bs# from rsa import PublicKey, common, transform, core
# def rsa_pubkey_dec(cipher:bytes, PUBLIC_KEY:bytes=pubk.encode()):
# public_key = PublicKey.load_pkcs1(PUBLIC_KEY)
# encrypted = transform.bytes2int(cipher)
# print('e:',public_key.e)
# print('n:',public_key.n)
# decrypted = core.decrypt_int(encrypted, public_key.e, public_key.n)
# print('rsa_pubkey_dec result:',decrypted)
# text = transform.int2bytes(decrypted)
# return texttable = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,0x6B, 0x79, 0x6E, 0x6A, 0x41, 0x34, 0x45, 0x48, 0x78, 0x36, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,0x40, 0x63, 0x4E, 0x57, 0x32, 0x7A, 0x6C, 0x53, 0x58, 0x4C, 0x59, 0x30, 0x64, 0x75, 0x77, 0x44,0x6F, 0x51, 0x70, 0x56, 0x46, 0x7C, 0x61, 0x37, 0x38, 0x5A, 0x62, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,0x60, 0x39, 0x67, 0x65, 0x43, 0x74, 0x69, 0x73, 0x50, 0x6D, 0x68, 0x72, 0x66, 0x4F, 0x31, 0x33,0x55, 0x4B, 0x42, 0x35, 0x4D, 0x49, 0x54, 0x76, 0x71, 0x47, 0x4A, 0x7B, 0x52, 0x7D, 0x7E, 0x7F]def s_transform(s: str):ret = ''for x in s:ret += chr(table[ord(x)])return retdef re_transfrom(s: str):ret = ''for x in s:ret += chr(table.index(ord(x)))return retdef i2bs(m: int, byteorder='big'):hex_m = m.to_bytes((m.bit_length() + 7) // 8, byteorder=byteorder)return hex_mdef rsa_pub_dec(decoded_data: bytes, PUBLIC_KEY: bytes = pubk.encode()) -> bytes:# base64.b64decode("MCYCHwC9s2qhNcaeKtlin3VtwnU9Vv4x")public_key = RSA.import_key(PUBLIC_KEY)# 获取模数和公钥指数n = public_key.ne = public_key.e# 打印结果print("Modulus (n):", n)# bs_n=n.to_bytes(128,'big')# print(bs_n,bs_n.hex())print("Exponent (e):", e)c = int.from_bytes(decoded_data, 'big')m = pow(c, e, n)print('pow:', m)hex_m = i2bs(m)return hex_mclass CustomBase32Codec:def __init__(self, custom_alphabet='ABCDEFGHJKLMNPQRSTUVWXYZ23456789'):if len(custom_alphabet) != 32:raise ValueError("Custom alphabet must contain 32 characters.")# Standard Base32 alphabetstandard_alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'# Create translation tablesself.encode_trans = bytes.maketrans(standard_alphabet, custom_alphabet.encode())self.decode_trans = bytes.maketrans(custom_alphabet.encode(), standard_alphabet)def encode(self, data):if isinstance(data, str):data = data.encode('utf-8')# Use the standard base64 library to encode and then translate to custom alphabetencoded = base64.b32encode(data)return encoded.translate(self.encode_trans)def decode(self, data):if isinstance(data, str):data = data.encode('utf-8')# Translate from custom alphabet to standard and then decode using standard base64 librarystandard_encoded = data.translate(self.decode_trans)return base64.b32decode(standard_encoded)def reflect_data(x, width):# See: https://stackoverflow.com/a/20918545if width == 8:x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1)x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2)x = ((x & 0x0F) << 4) | ((x & 0xF0) >> 4)elif width == 16:x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1)x = ((x & 0x3333) << 2) | ((x & 0xCCCC) >> 2)x = ((x & 0x0F0F) << 4) | ((x & 0xF0F0) >> 4)x = ((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8)elif width == 32:x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1)x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2)x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4)x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8)x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16)else:raise ValueError('Unsupported width')return xdef crc_poly(data, n, poly, crc=0, ref_in=False, ref_out=False, xor_out=0):g = 1 << n | poly # Generator polynomial# Loop over the datafor d in data:# Reverse the input byte if the flag is trueif ref_in:d = reflect_data(d, 8)# XOR the top byte in the CRC with the input bytecrc ^= d << (n - 8)# Loop over all the bits in the bytefor _ in range(8):# Start by shifting the CRC, so we can check for the top bitcrc <<= 1# XOR the CRC if the top bit is 1if crc & (1 << n):crc ^= g# Reverse the output if the flag is trueif ref_out:crc = reflect_data(crc, n)# Return the CRC valuereturn crc ^ xor_outdef CRC8_MAXIM(data: bytes):crc8 = crc_poly(data, n=8, poly=0x31, ref_in=True, ref_out=True, xor_out=0)return crc8def convert_bytes_to_structure(st: object, byte: bytes):assert ctypes.sizeof(st) == len(byte), 'size error! need:%d,give:%d' % (ctypes.sizeof(st), len(byte))# ctypes.memmove(ctypes.pointer(st), byte, ctypes.sizeof(st))ctypes.memmove(ctypes.addressof(st), byte, ctypes.sizeof(st))class TYPE_BASE(ctypes.LittleEndianStructure):_pack_: int = 1def __init__(self, data: Union[bytes, list, tuple, set]) -> None:if isinstance(data, bytes):convert_bytes_to_structure(self, data)elif isinstance(data, (list, tuple, set)):convert_bytes_to_structure(self, bytes(data))elif isinstance(data, io.IOBase):data.readinto(self)'''
struct LicenseInfo{char var0;char var1;char major_version2;char var3;int expiration4;char var8;char unknow9[7];char var10;char var11;char unknow12[11];char crc1d;};
'''class LicenseInfo(TYPE_BASE):# _pack_: int = 1_fields_: list = [("var0", ctypes.c_ubyte),("var1", ctypes.c_ubyte),("major_version2", ctypes.c_ubyte),("var3", ctypes.c_ubyte),("expiration4", ctypes.c_uint32),("var8", ctypes.c_ubyte),("unknow9", ctypes.c_byte*7),("var10", ctypes.c_ubyte),("var11", ctypes.c_ubyte),("unknow12", ctypes.c_byte*11),("crc1d", ctypes.c_ubyte),]def __init__(self, data: Union[bytes, list, tuple, set]) -> None:super().__init__(data)self.get_var()def get_var(self):if (self.var8 & 0xf) != 0:if (self.var8 & 0xf) == 1 or (self.var8 & 0xf) == 2:self.ver2 = self.var0self.ver1 = self.var10else:self.ver2 = self.var0 & 0x1fself.ver1 = self.var0 >> 5def __str__(self) -> str:info = ''info += 'ver1:%02x\n' % self.ver1info += 'ver2:%02x\n' % self.ver2info += 'major_version2:%02x\n' % self.major_version2info += 'var3:%02x\n' % self.var3info += 'expiration4:%s\n' % convert_to_time_string(self.expiration4)info += 'var8:%02x\n' % self.var8info += 'unknow9:%s\n' % bytes(self.unknow9)info += 'var10:%02x\n' % self.var10info += 'var11:%02x\n' % self.var11info += 'unknow12:%s\n' % bytes(self.unknow12)info += 'crc1d:%02x\n' % self.crc1dreturn infodef parse_license(data: bytes):custom_b32 = CustomBase32Codec()decoded_data = custom_b32.decode(data)# need FA8F3EFD9308B22C6B57B07291068F99D59A8E64B858042D1CF6# 5d438f96fa8f3efd9308b22c6b57b07291068f99d59a8e64b858042d1cf6print("Custom Base32 Decoded:", decoded_data)print('hex:', decoded_data.hex())# enc=custom_b32.encode(b'SUPPORT@HASLEO.COM')# print('enc:',enc)# text=rsa_pubkey_dec(decoded_data)text = rsa_pub_dec(decoded_data)print('rsa_pubkey_dec:', text)print('rsa_pubkey_dec hex:', text.hex())enc = rsa_pk_enc(text)print('test enc:', enc, enc.hex())# rsa_dec=bytes.fromhex('210102000AA5325610004C4A41434FEB07699B0BD58FBD6A616AE7ED19')rsa_dec = text[:-1]+b'\x00'# CRC-8/MAXIMcrc8 = CRC8_MAXIM(rsa_dec)print('crc8/MAXIM :', crc8, hex(crc8))obj = LicenseInfo(text)print(str(obj))# 示例用法# time_str = "2024-01-01 12:00:00"# time64 = convert_to_time64(time_str)# print('time64:',time64)def GenActivationCode(license, machine_code) -> str:lic_md5 = hashlib.md5(license).hexdigest()# print('lic_md5:',lic_md5)mc_md5 = hashlib.md5(machine_code).hexdigest()# print('mc_md5:',mc_md5)s = '8000|%s|%s|%s' % (lic_md5[8:16], mc_md5[8:16], machine_code.decode())# print(s)re_s = re_transfrom(s)# print(re_s)return re_sdef GenLicense(ver2=1) -> bytes:lic = b''#ver2 = 1ver1 = 1 # random.randint(1,4)lic += (ver2 | (ver1 << 5)).to_bytes(1, 'little') # this way var8 must 0lic += b'\x01' # var1lic += b'\xff' # major_version2lic += b'\x00' # var3expiration4 = convert_to_time64('2077-01-01 12:00:00')t = convert_to_time_string(expiration4)# print(t)lic += expiration4.to_bytes(4, 'little')var8 = b'\x00'lic += var8lic += os.urandom(7) # unknow9[7]lic += b'\x00' # var10lic += b'\xff' # var11 monthlic += os.urandom(11) # unknow12[11]crc8 = CRC8_MAXIM(lic+b'\x00')lic += crc8.to_bytes(1, 'little')# print('lic:',lic,lic.hex())# print(str(LicenseInfo(lic)))enc = rsa_pk_enc(lic)license = CustomBase32Codec().encode(enc)return licenseclass Products:EASYUEFI=1WINTOUSB=2if __name__ == "__main__":print('[#]Must be used without internet access!')license = GenLicense(Products.WINTOUSB)print('License:', license.decode())print('Please input MachineCode:')mc = input().encode()ac = GenActivationCode(license, mc)print('ActivationCode', ac)