Palm Reversing - Un
acercamiento a la realidad - Por Latigo/UCF
Comenzaremos cargando
nuestra aplicación en el emulador o la
palm Real e intentamos registrarnos con
un serial basura el programa nos muestra
el mensaje 'You entered a wrong
code!'.
Dulcemente:) Buscamos las referencias de
alertas en los archivos desensamblados.
Cortamos en archivos el archivo entero
con PrcView (o cualquier otra
herramienta similar por supuesto) , Con
un poco de búsqueda encontramos el
recurso de una alerta de nombre '
Talt0x138d.bin ' es la ventana donde
se muestra el mensaje de código
invalido. Así buscamos en el listado
muerto con el IDA la cadena ' 138d
'
code0001:000048B6 loc_0_48B6:
code0001:000048B6 move.w 8(a0),d0
code0001:000048BA cmpi.w #$44D,d0
code0001:000048BE bne.s loc_0_48FA
code0001:000048C0 move.l $A0C(a4),-(sp)
code0001:000048C4 systrap FldGetTextPtr() <- Poner en Ptr nuestro serial
code0001:000048C8 move.l a0,-(sp) <- Poner aquel Ptr ahora
code0001:000048CA lea $560(a4),a0 <- Cargar en A0 otro puntero
code0001:000048CE pea 2(a0)
code0001:000048D2 systrap StrCopy() <- copialo
code0001:000048D6 bsr sub_0_5CC <- Saltar a función Reg
code0001:000048DA adda.w #$C,sp <- Limpiar la pila
code0001:000048DE tst.w $28(a4) <- Registro de Bandera es 0?
code0001:000048E2 beq.s loc_0_48EC <- JZ Mensaje de chico malo
code0001:000048E4 move.w #$138C,-(sp) <- Mostrar el mensaje bueno
code0001:000048E8 bra loc_0_48F0
code0001:000048EC
code0001:000048EC loc_0_48EC:
code0001:000048EC move.w #$138D,-(sp) <-- AQUI!
code0001:000048F0
code0001:000048F0 loc_0_48F0:
code0001:000048F0 systrap FrmAlert()
code0001:000048F4 addq.w #2,sp
code0001:000048F6 bra loc_0_4900
Así después de un
poco de mirar nos encontramos con que el
esquema es una típica. Llamada a la
función (000048D6), comparar RegFlag
(000048DE), JZ Chico malo (000048E2) ó
de lo contrario se mostrara el mensaje 'Thank
you' (000048E4). Conseguimos ahora
entrar a la función ' Reg ' (no tenemos
que desensamblar todo) , A primera cosa
yo siempre echo un vistazo a la función
entera. Digo, una mirada rápida a ver
cuánto tiempo es y para inspeccionar la
existencia de otras llamadas API que
podrían facilitar mi trabajo. Al final
de esta sub-rutina encuentro suculento
código:
code0001:000006BE loc_0_6BE:
code0001:000006BE lea $560(a4),a0
code0001:000006C2 pea 2(a0) <- Poner aqui los mismos ptr como un 000048CA
code0001:000006C6 pea $2A0(a4) <- Dirección del serial generado
code0001:000006CA systrap StrCompare() <- La API para poner un breakpoint :)
code0001:000006CE tst.w d0 <- Son los mismos?
code0001:000006D0 bne.s loc_0_6D8 <- JNE Chico malo
code0001:000006D2 move.w #1,$28(a4) <- Poner 1 en el registro de banderas
code0001:000006D8
code0001:000006D8 loc_0_6D8:
code0001:000006D8 movem.l var_18(a6),d3-d7/a2 <- pop registers (?)
code0001:000006DE unlk a6
code0001:000006E0 rts <- RET Retirar
¡Tiempo para ' vivir
' inverso! Qué vamos a hacer ahora ,
pondremos un breakpoint en el StrCompare
SysTrap usando al PalmDebugger. ¿Cómo
hacer esto? La orden para '
breakpointing ' en una API (colocando
una trampa) es con un ' ATB '. Así en
PalmDebugger debemos poner la
instrucción "ATB ApiNumber" para tener
exito se debe colocar un bpx. Debo
confesarme que gasté montones de días
buscando alguna referencia API. Y al fin
me encontré con que esta misma lista
puede ser encontrada en el PalmOs SDK.
De cualquier manera, Les proveo de una
lista bonita y comprensible aquí Abajo.
SysTrap (Con trap
number)
Lista para poder poner Breakpoints con el Debugger.
sysTrapMemInit = 0x0
sysTrapMemInitHeapTable = 0x1
sysTrapMemStoreInit = 0x2
sysTrapMemCardFormat = 0x3
sysTrapMemCardInfo = 0x4
sysTrapMemStoreInfo = 0x5
sysTrapMemStoreSetInfo = 0x6
sysTrapMemNumHeaps = 0x7
sysTrapMemNumRAMHeaps = 0x8
sysTrapMemHeapID = 0x9
sysTrapMemHeapPtr = 0xa
sysTrapMemHeapFreeBytes = 0xb
sysTrapMemHeapSize = 0xc
sysTrapMemHeapFlags = 0xd
sysTrapMemHeapCompact = 0xe
sysTrapMemHeapInit = 0xf
sysTrapMemHeapFreeByOwnerID = 0x10
sysTrapMemChunkNew = 0x11
sysTrapMemChunkFree = 0x12
sysTrapMemPtrNew = 0x13
sysTrapMemPtrRecoverHandle = 0x14
sysTrapMemPtrFlags = 0x15
sysTrapMemPtrSize = 0x16
sysTrapMemPtrOwner = 0x17
sysTrapMemPtrHeapID = 0x18
sysTrapMemPtrCardNo = 0x19
sysTrapMemPtrToLocalID = 0x1a
sysTrapMemPtrSetOwner = 0x1b
sysTrapMemPtrResize = 0x1c
sysTrapMemPtrResetLock = 0x1d
sysTrapMemHandleNew = 0x1e
sysTrapMemHandleLockCount = 0x1f
sysTrapMemHandleToLocalID = 0x20
sysTrapMemHandleLock = 0x21
sysTrapMemHandleUnlock = 0x22
sysTrapMemLocalIDToGlobal = 0x23
sysTrapMemLocalIDKind = 0x24
sysTrapMemLocalIDToPtr = 0x25
sysTrapMemMove = 0x26
sysTrapMemSet = 0x27
sysTrapMemStoreSearch = 0x28
sysTrapMemPtrDataStorage = 0x29
sysTrapMemKernelInit = 0x2a
sysTrapMemHandleFree = 0x2b
sysTrapMemHandleFlags = 0x2c
sysTrapMemHandleSize = 0x2d
sysTrapMemHandleOwner = 0x2e
sysTrapMemHandleHeapID = 0x2f
sysTrapMemHandleDataStorage = 0x30
sysTrapMemHandleCardNo = 0x31
sysTrapMemHandleSetOwner = 0x32
sysTrapMemHandleResize = 0x33
sysTrapMemHandleResetLock = 0x34
sysTrapMemPtrUnlock = 0x35
sysTrapMemLocalIDToLockedPtr = 0x36
sysTrapMemSetDebugMode = 0x37
sysTrapMemHeapScramble = 0x38
sysTrapMemHeapCheck = 0x39
sysTrapMemNumCards = 0x3a
sysTrapMemDebugMode = 0x3b
sysTrapMemSemaphoreReserve = 0x3c
sysTrapMemSemaphoreRelease = 0x3d
sysTrapMemHeapDynamic = 0x3e
sysTrapMemNVParams = 0x3f
sysTrapDmInit = 0x40
sysTrapDmCreateDatabase = 0x41
sysTrapDmDeleteDatabase = 0x42
sysTrapDmNumDatabases = 0x43
sysTrapDmGetDatabase = 0x44
sysTrapDmFindDatabase = 0x45
sysTrapDmDatabaseInfo = 0x46
sysTrapDmSetDatabaseInfo = 0x47
sysTrapDmDatabaseSize = 0x48
sysTrapDmOpenDatabase = 0x49
sysTrapDmCloseDatabase = 0x4a
sysTrapDmNextOpenDatabase = 0x4b
sysTrapDmOpenDatabaseInfo = 0x4c
sysTrapDmResetRecordStates = 0x4d
sysTrapDmGetLastErr = 0x4e
sysTrapDmNumRecords = 0x4f
sysTrapDmRecordInfo = 0x50
sysTrapDmSetRecordInfo = 0x51
sysTrapDmAttachRecord = 0x52
sysTrapDmDetachRecord = 0x53
sysTrapDmMoveRecord = 0x54
sysTrapDmNewRecord = 0x55
sysTrapDmRemoveRecord = 0x56
sysTrapDmDeleteRecord = 0x57
sysTrapDmArchiveRecord = 0x58
sysTrapDmNewHandle = 0x59
sysTrapDmRemoveSecretRecords = 0x5a
sysTrapDmQueryRecord = 0x5b
sysTrapDmGetRecord = 0x5c
sysTrapDmResizeRecord = 0x5d
sysTrapDmReleaseRecord = 0x5e
sysTrapDmGetResource = 0x5f
sysTrapDmGet1Resource = 0x60
sysTrapDmReleaseResource = 0x61
sysTrapDmResizeResource = 0x62
sysTrapDmNextOpenResDatabase = 0x63
sysTrapDmFindResourceType = 0x64
sysTrapDmFindResource = 0x65
sysTrapDmSearchResource = 0x66
sysTrapDmNumResources = 0x67
sysTrapDmResourceInfo = 0x68
sysTrapDmSetResourceInfo = 0x69
sysTrapDmAttachResource = 0x6a
sysTrapDmDetachResource = 0x6b
sysTrapDmNewResource = 0x6c
sysTrapDmRemoveResource = 0x6d
sysTrapDmGetResourceIndex = 0x6e
sysTrapDmQuickSort = 0x6f
sysTrapDmQueryNextInCategory = 0x70
sysTrapDmNumRecordsInCategory = 0x71
sysTrapDmPositionInCategory = 0x72
sysTrapDmSeekRecordInCategory = 0x73
sysTrapDmMoveCategory = 0x74
sysTrapDmOpenDatabaseByTypeCreator = 0x75
sysTrapDmWrite = 0x76
sysTrapDmStrCopy = 0x77
sysTrapDmGetNextDatabaseByTypeCreator = 0x78
sysTrapDmWriteCheck = 0x79
sysTrapDmMoveOpenDBContext = 0x7a
sysTrapDmFindRecordByID = 0x7b
sysTrapDmGetAppInfoID = 0x7c
sysTrapDmFindSortPositionV10 = 0x7d
sysTrapDmSet = 0x7e
sysTrapDmCreateDatabaseFromImage = 0x7f
sysTrapDbgSrcMessage = 0x80
sysTrapDbgMessage = 0x81
sysTrapDbgGetMessage = 0x82
sysTrapDbgCommSettings = 0x83
sysTrapErrDisplayFileLineMsg = 0x84
sysTrapErrSetJump = 0x85
sysTrapErrLongJump = 0x86
sysTrapErrThrow = 0x87
sysTrapErrExceptionList = 0x88
sysTrapSysBroadcastActionCode = 0x89
sysTrapSysUnimplemented = 0x8a
sysTrapSysColdBoot = 0x8b
sysTrapSysReset = 0x8c
sysTrapSysDoze = 0x8d
sysTrapSysAppLaunch = 0x8e
sysTrapSysAppStartup = 0x8f
sysTrapSysAppExit = 0x90
sysTrapSysSetA5 = 0x91
sysTrapSysSetTrapAddress = 0x92
sysTrapSysGetTrapAddress = 0x93
sysTrapSysTranslateKernelErr = 0x94
sysTrapSysSemaphoreCreate = 0x95
sysTrapSysSemaphoreDelete = 0x96
sysTrapSysSemaphoreWait = 0x97
sysTrapSysSemaphoreSignal = 0x98
sysTrapSysTimerCreate = 0x99
sysTrapSysTimerWrite = 0x9a
sysTrapSysTaskCreate = 0x9b
sysTrapSysTaskDelete = 0x9c
sysTrapSysTaskTrigger = 0x9d
sysTrapSysTaskID = 0x9e
sysTrapSysTaskUserInfoPtr = 0x9f
sysTrapSysTaskDelay = 0xa0
sysTrapSysTaskSetTermProc = 0xa1
sysTrapSysUILaunch = 0xa2
sysTrapSysNewOwnerID = 0xa3
sysTrapSysSemaphoreSet = 0xa4
sysTrapSysDisableInts = 0xa5
sysTrapSysRestoreStatus = 0xa6
sysTrapSysUIAppSwitch = 0xa7
sysTrapSysCurAppInfoPV20 = 0xa8
sysTrapSysHandleEvent = 0xa9
sysTrapSysInit = 0xaa
sysTrapSysQSort = 0xab
sysTrapSysCurAppDatabase = 0xac
sysTrapSysFatalAlert = 0xad
sysTrapSysResSemaphoreCreate = 0xae
sysTrapSysResSemaphoreDelete = 0xaf
sysTrapSysResSemaphoreReserve = 0xb0
sysTrapSysResSemaphoreRelease = 0xb1
sysTrapSysSleep = 0xb2
sysTrapSysKeyboardDialogV10 = 0xb3
sysTrapSysAppLauncherDialog = 0xb4
sysTrapSysSetPerformance = 0xb5
sysTrapSysBatteryInfoV20 = 0xb6
sysTrapSysLibInstall = 0xb7
sysTrapSysLibRemove = 0xb8
sysTrapSysLibTblEntry = 0xb9
sysTrapSysLibFind = 0xba
sysTrapSysBatteryDialog = 0xbb
sysTrapSysCopyStringResource = 0xbc
sysTrapSysKernelInfo = 0xbd
sysTrapSysLaunchConsole = 0xbe
sysTrapSysTimerDelete = 0xbf
sysTrapSysSetAutoOffTime = 0xc0
sysTrapSysFormPointerArrayToStrings = 0xc1
sysTrapSysRandom = 0xc2
sysTrapSysTaskSwitching = 0xc3
sysTrapSysTimerRead = 0xc4
sysTrapStrCopy = 0xc5
sysTrapStrCat = 0xc6
sysTrapStrLen = 0xc7
sysTrapStrCompare = 0xc8
sysTrapStrIToA = 0xc9
sysTrapStrCaselessCompare = 0xca
sysTrapStrIToH = 0xcb
sysTrapStrChr = 0xcc
sysTrapStrStr = 0xcd
sysTrapStrAToI = 0xce
sysTrapStrToLower = 0xcf
sysTrapSerReceiveISP = 0xd0
sysTrapSlkOpen = 0xd1
sysTrapSlkClose = 0xd2
sysTrapSlkOpenSocket = 0xd3
sysTrapSlkCloseSocket = 0xd4
sysTrapSlkSocketRefNum = 0xd5
sysTrapSlkSocketSetTimeout = 0xd6
sysTrapSlkFlushSocket = 0xd7
sysTrapSlkSetSocketListener = 0xd8
sysTrapSlkSendPacket = 0xd9
sysTrapSlkReceivePacket = 0xda
sysTrapSlkSysPktDefaultResponse = 0xdb
sysTrapSlkProcessRPC = 0xdc
sysTrapConPutS = 0xdd
sysTrapConGetS = 0xde
sysTrapFplInit = 0xdf
sysTrapFplFree = 0xe0
sysTrapFplFToA = 0xe1
sysTrapFplAToF = 0xe2
sysTrapFplBase10Info = 0xe3
sysTrapFplLongToFloat = 0xe4
sysTrapFplFloatToLong = 0xe5
sysTrapFplFloatToULong = 0xe6
sysTrapFplMul = 0xe7
sysTrapFplAdd = 0xe8
sysTrapFplSub = 0xe9
sysTrapFplDiv = 0xea
sysTrapScrInit = 0xeb
sysTrapScrCopyRectangle = 0xec
sysTrapScrDrawChars = 0xed
sysTrapScrLineRoutine = 0xee
sysTrapScrRectangleRoutine = 0xef
sysTrapScrScreenInfo = 0xf0
sysTrapScrDrawNotify = 0xf1
sysTrapScrSendUpdateArea = 0xf2
sysTrapScrCompressScanLine = 0xf3
sysTrapScrDeCompressScanLine = 0xf4
sysTrapTimGetSeconds = 0xf5
sysTrapTimSetSeconds = 0xf6
sysTrapTimGetTicks = 0xf7
sysTrapTimInit = 0xf8
sysTrapTimSetAlarm = 0xf9
sysTrapTimGetAlarm = 0xfa
sysTrapTimHandleInterrupt = 0xfb
sysTrapTimSecondsToDateTime = 0xfc
sysTrapTimDateTimeToSeconds = 0xfd
sysTrapTimAdjust = 0xfe
sysTrapTimSleep = 0xff
sysTrapTimWake = 0x100
sysTrapCategoryCreateListV10 = 0x101
sysTrapCategoryFreeListV10 = 0x102
sysTrapCategoryFind = 0x103
sysTrapCategoryGetName = 0x104
sysTrapCategoryEditV10 = 0x105
sysTrapCategorySelectV10 = 0x106
sysTrapCategoryGetNext = 0x107
sysTrapCategorySetTriggerLabel = 0x108
sysTrapCategoryTruncateName = 0x109
sysTrapClipboardAddItem = 0x10a
sysTrapClipboardCheckIfItemExist = 0x10b
sysTrapClipboardGetItem = 0x10c
sysTrapCtlDrawControl = 0x10d
sysTrapCtlEraseControl = 0x10e
sysTrapCtlHideControl = 0x10f
sysTrapCtlShowControl = 0x110
sysTrapCtlGetValue = 0x111
sysTrapCtlSetValue = 0x112
sysTrapCtlGetLabel = 0x113
sysTrapCtlSetLabel = 0x114
sysTrapCtlHandleEvent = 0x115
sysTrapCtlHitControl = 0x116
sysTrapCtlSetEnabled = 0x117
sysTrapCtlSetUsable = 0x118
sysTrapCtlEnabled = 0x119
sysTrapEvtInitialize = 0x11a
sysTrapEvtAddEventToQueue = 0x11b
sysTrapEvtCopyEvent = 0x11c
sysTrapEvtGetEvent = 0x11d
sysTrapEvtGetPen = 0x11e
sysTrapEvtSysInit = 0x11f
sysTrapEvtGetSysEvent = 0x120
sysTrapEvtProcessSoftKeyStroke = 0x121
sysTrapEvtGetPenBtnList = 0x122
sysTrapEvtSetPenQueuePtr = 0x123
sysTrapEvtPenQueueSize = 0x124
sysTrapEvtFlushPenQueue = 0x125
sysTrapEvtEnqueuePenPoint = 0x126
sysTrapEvtDequeuePenStrokeInfo = 0x127
sysTrapEvtDequeuePenPoint = 0x128
sysTrapEvtFlushNextPenStroke = 0x129
sysTrapEvtSetKeyQueuePtr = 0x12a
sysTrapEvtKeyQueueSize = 0x12b
sysTrapEvtFlushKeyQueue = 0x12c
sysTrapEvtEnqueueKey = 0x12d
sysTrapEvtDequeueKeyEvent = 0x12e
sysTrapEvtWakeup = 0x12f
sysTrapEvtResetAutoOffTimer = 0x130
sysTrapEvtKeyQueueEmpty = 0x131
sysTrapEvtEnableGraffiti = 0x132
sysTrapFldCopy = 0x133
sysTrapFldCut = 0x134
sysTrapFldDrawField = 0x135
sysTrapFldEraseField = 0x136
sysTrapFldFreeMemory = 0x137
sysTrapFldGetBounds = 0x138
sysTrapFldGetTextPtr = 0x139
sysTrapFldGetSelection = 0x13a
sysTrapFldHandleEvent = 0x13b
sysTrapFldPaste = 0x13c
sysTrapFldRecalculateField = 0x13d
sysTrapFldSetBounds = 0x13e
sysTrapFldSetText = 0x13f
sysTrapFldGetFont = 0x140
sysTrapFldSetFont = 0x141
sysTrapFldSetSelection = 0x142
sysTrapFldGrabFocus = 0x143
sysTrapFldReleaseFocus = 0x144
sysTrapFldGetInsPtPosition = 0x145
sysTrapFldSetInsPtPosition = 0x146
sysTrapFldSetScrollPosition = 0x147
sysTrapFldGetScrollPosition = 0x148
sysTrapFldGetTextHeight = 0x149
sysTrapFldGetTextAllocatedSize = 0x14a
sysTrapFldGetTextLength = 0x14b
sysTrapFldScrollField = 0x14c
sysTrapFldScrollable = 0x14d
sysTrapFldGetVisibleLines = 0x14e
sysTrapFldGetAttributes = 0x14f
sysTrapFldSetAttributes = 0x150
sysTrapFldSendChangeNotification = 0x151
sysTrapFldCalcFieldHeight = 0x152
sysTrapFldGetTextHandle = 0x153
sysTrapFldCompactText = 0x154
sysTrapFldDirty = 0x155
sysTrapFldWordWrap = 0x156
sysTrapFldSetTextAllocatedSize = 0x157
sysTrapFldSetTextHandle = 0x158
sysTrapFldSetTextPtr = 0x159
sysTrapFldGetMaxChars = 0x15a
sysTrapFldSetMaxChars = 0x15b
sysTrapFldSetUsable = 0x15c
sysTrapFldInsert = 0x15d
sysTrapFldDelete = 0x15e
sysTrapFldUndo = 0x15f
sysTrapFldSetDirty = 0x160
sysTrapFldSendHeightChangeNotification = 0x161
sysTrapFldMakeFullyVisible = 0x162
sysTrapFntGetFont = 0x163
sysTrapFntSetFont = 0x164
sysTrapFntGetFontPtr = 0x165
sysTrapFntBaseLine = 0x166
sysTrapFntCharHeight = 0x167
sysTrapFntLineHeight = 0x168
sysTrapFntAverageCharWidth = 0x169
sysTrapFntCharWidth = 0x16a
sysTrapFntCharsWidth = 0x16b
sysTrapFntDescenderHeight = 0x16c
sysTrapFntCharsInWidth = 0x16d
sysTrapFntLineWidth = 0x16e
sysTrapFrmInitForm = 0x16f
sysTrapFrmDeleteForm = 0x170
sysTrapFrmDrawForm = 0x171
sysTrapFrmEraseForm = 0x172
sysTrapFrmGetActiveForm = 0x173
sysTrapFrmSetActiveForm = 0x174
sysTrapFrmGetActiveFormID = 0x175
sysTrapFrmGetUserModifiedState = 0x176
sysTrapFrmSetNotUserModified = 0x177
sysTrapFrmGetFocus = 0x178
sysTrapFrmSetFocus = 0x179
sysTrapFrmHandleEvent = 0x17a
sysTrapFrmGetFormBounds = 0x17b
sysTrapFrmGetWindowHandle = 0x17c
sysTrapFrmGetFormId = 0x17d
sysTrapFrmGetFormPtr = 0x17e
sysTrapFrmGetNumberOfObjects = 0x17f
sysTrapFrmGetObjectIndex = 0x180
sysTrapFrmGetObjectId = 0x181
sysTrapFrmGetObjectType = 0x182
sysTrapFrmGetObjectPtr = 0x183
sysTrapFrmHideObject = 0x184
sysTrapFrmShowObject = 0x185
sysTrapFrmGetObjectPosition = 0x186
sysTrapFrmSetObjectPosition = 0x187
sysTrapFrmGetControlValue = 0x188
sysTrapFrmSetControlValue = 0x189
sysTrapFrmGetControlGroupSelection = 0x18a
sysTrapFrmSetControlGroupSelection = 0x18b
sysTrapFrmCopyLabel = 0x18c
sysTrapFrmSetLabel = 0x18d
sysTrapFrmGetLabel = 0x18e
sysTrapFrmSetCategoryLabel = 0x18f
sysTrapFrmGetTitle = 0x190
sysTrapFrmSetTitle = 0x191
sysTrapFrmAlert = 0x192
sysTrapFrmDoDialog = 0x193
sysTrapFrmCustomAlert = 0x194
sysTrapFrmHelp = 0x195
sysTrapFrmUpdateScrollers = 0x196
sysTrapFrmGetFirstForm = 0x197
sysTrapFrmVisible = 0x198
sysTrapFrmGetObjectBounds = 0x199
sysTrapFrmCopyTitle = 0x19a
sysTrapFrmGotoForm = 0x19b
sysTrapFrmPopupForm = 0x19c
sysTrapFrmUpdateForm = 0x19d
sysTrapFrmReturnToForm = 0x19e
sysTrapFrmSetEventHandler = 0x19f
sysTrapFrmDispatchEvent = 0x1a0
sysTrapFrmCloseAllForms = 0x1a1
sysTrapFrmSaveAllForms = 0x1a2
sysTrapFrmGetGadgetData = 0x1a3
sysTrapFrmSetGadgetData = 0x1a4
sysTrapFrmSetCategoryTrigger = 0x1a5
sysTrapUIInitialize = 0x1a6
sysTrapUIReset = 0x1a7
sysTrapInsPtInitialize = 0x1a8
sysTrapInsPtSetLocation = 0x1a9
sysTrapInsPtGetLocation = 0x1aa
sysTrapInsPtEnable = 0x1ab
sysTrapInsPtEnabled = 0x1ac
sysTrapInsPtSetHeight = 0x1ad
sysTrapInsPtGetHeight = 0x1ae
sysTrapInsPtCheckBlink = 0x1af
sysTrapLstSetDrawFunction = 0x1b0
sysTrapLstDrawList = 0x1b1
sysTrapLstEraseList = 0x1b2
sysTrapLstGetSelection = 0x1b3
sysTrapLstGetSelectionText = 0x1b4
sysTrapLstHandleEvent = 0x1b5
sysTrapLstSetHeight = 0x1b6
sysTrapLstSetSelection = 0x1b7
sysTrapLstSetListChoices = 0x1b8
sysTrapLstMakeItemVisible = 0x1b9
sysTrapLstGetNumberOfItems = 0x1ba
sysTrapLstPopupList = 0x1bb
sysTrapLstSetPosition = 0x1bc
sysTrapMenuInit = 0x1bd
sysTrapMenuDispose = 0x1be
sysTrapMenuHandleEvent = 0x1bf
sysTrapMenuDrawMenu = 0x1c0
sysTrapMenuEraseStatus = 0x1c1
sysTrapMenuGetActiveMenu = 0x1c2
sysTrapMenuSetActiveMenu = 0x1c3
sysTrapRctSetRectangle = 0x1c4
sysTrapRctCopyRectangle = 0x1c5
sysTrapRctInsetRectangle = 0x1c6
sysTrapRctOffsetRectangle = 0x1c7
sysTrapRctPtInRectangle = 0x1c8
sysTrapRctGetIntersection = 0x1c9
sysTrapTblDrawTable = 0x1ca
sysTrapTblEraseTable = 0x1cb
sysTrapTblHandleEvent = 0x1cc
sysTrapTblGetItemBounds = 0x1cd
sysTrapTblSelectItem = 0x1ce
sysTrapTblGetItemInt = 0x1cf
sysTrapTblSetItemInt = 0x1d0
sysTrapTblSetItemStyle = 0x1d1
sysTrapTblUnhighlightSelection = 0x1d2
sysTrapTblSetRowUsable = 0x1d3
sysTrapTblGetNumberOfRows = 0x1d4
sysTrapTblSetCustomDrawProcedure = 0x1d5
sysTrapTblSetRowSelectable = 0x1d6
sysTrapTblRowSelectable = 0x1d7
sysTrapTblSetLoadDataProcedure = 0x1d8
sysTrapTblSetSaveDataProcedure = 0x1d9
sysTrapTblGetBounds = 0x1da
sysTrapTblSetRowHeight = 0x1db
sysTrapTblGetColumnWidth = 0x1dc
sysTrapTblGetRowID = 0x1dd
sysTrapTblSetRowID = 0x1de
sysTrapTblMarkRowInvalid = 0x1df
sysTrapTblMarkTableInvalid = 0x1e0
sysTrapTblGetSelection = 0x1e1
sysTrapTblInsertRow = 0x1e2
sysTrapTblRemoveRow = 0x1e3
sysTrapTblRowInvalid = 0x1e4
sysTrapTblRedrawTable = 0x1e5
sysTrapTblRowUsable = 0x1e6
sysTrapTblReleaseFocus = 0x1e7
sysTrapTblEditing = 0x1e8
sysTrapTblGetCurrentField = 0x1e9
sysTrapTblSetColumnUsable = 0x1ea
sysTrapTblGetRowHeight = 0x1eb
sysTrapTblSetColumnWidth = 0x1ec
sysTrapTblGrabFocus = 0x1ed
sysTrapTblSetItemPtr = 0x1ee
sysTrapTblFindRowID = 0x1ef
sysTrapTblGetLastUsableRow = 0x1f0
sysTrapTblGetColumnSpacing = 0x1f1
sysTrapTblFindRowData = 0x1f2
sysTrapTblGetRowData = 0x1f3
sysTrapTblSetRowData = 0x1f4
sysTrapTblSetColumnSpacing = 0x1f5
sysTrapWinCreateWindow = 0x1f6
sysTrapWinCreateOffscreenWindow = 0x1f7
sysTrapWinDeleteWindow = 0x1f8
sysTrapWinInitializeWindow = 0x1f9
sysTrapWinAddWindow = 0x1fa
sysTrapWinRemoveWindow = 0x1fb
sysTrapWinSetActiveWindow = 0x1fc
sysTrapWinSetDrawWindow = 0x1fd
sysTrapWinGetDrawWindow = 0x1fe
sysTrapWinGetActiveWindow = 0x1ff
sysTrapWinGetDisplayWindow = 0x200
sysTrapWinGetFirstWindow = 0x201
sysTrapWinEnableWindow = 0x202
sysTrapWinDisableWindow = 0x203
sysTrapWinGetWindowFrameRect = 0x204
sysTrapWinDrawWindowFrame = 0x205
sysTrapWinEraseWindow = 0x206
sysTrapWinSaveBits = 0x207
sysTrapWinRestoreBits = 0x208
sysTrapWinCopyRectangle = 0x209
sysTrapWinScrollRectangle = 0x20a
sysTrapWinGetDisplayExtent = 0x20b
sysTrapWinGetWindowExtent = 0x20c
sysTrapWinDisplayToWindowPt = 0x20d
sysTrapWinWindowToDisplayPt = 0x20e
sysTrapWinGetClip = 0x20f
sysTrapWinSetClip = 0x210
sysTrapWinResetClip = 0x211
sysTrapWinClipRectangle = 0x212
sysTrapWinDrawLine = 0x213
sysTrapWinDrawGrayLine = 0x214
sysTrapWinEraseLine = 0x215
sysTrapWinInvertLine = 0x216
sysTrapWinFillLine = 0x217
sysTrapWinDrawRectangle = 0x218
sysTrapWinEraseRectangle = 0x219
sysTrapWinInvertRectangle = 0x21a
sysTrapWinDrawRectangleFrame = 0x21b
sysTrapWinDrawGrayRectangleFrame = 0x21c
sysTrapWinEraseRectangleFrame = 0x21d
sysTrapWinInvertRectangleFrame = 0x21e
sysTrapWinGetFramesRectangle = 0x21f
sysTrapWinDrawChars = 0x220
sysTrapWinEraseChars = 0x221
sysTrapWinInvertChars = 0x222
sysTrapWinGetPattern = 0x223
sysTrapWinSetPattern = 0x224
sysTrapWinSetUnderlineMode = 0x225
sysTrapWinDrawBitmap = 0x226
sysTrapWinModal = 0x227
sysTrapWinGetWindowBounds = 0x228
sysTrapWinFillRectangle = 0x229
sysTrapWinDrawInvertedChars = 0x22a
sysTrapPrefOpenPreferenceDBV10 = 0x22b
sysTrapPrefGetPreferences = 0x22c
sysTrapPrefSetPreferences = 0x22d
sysTrapPrefGetAppPreferencesV10 = 0x22e
sysTrapPrefSetAppPreferencesV10 = 0x22f
sysTrapSndInit = 0x230
sysTrapSndSetDefaultVolume = 0x231
sysTrapSndGetDefaultVolume = 0x232
sysTrapSndDoCmd = 0x233
sysTrapSndPlaySystemSound = 0x234
sysTrapAlmInit = 0x235
sysTrapAlmCancelAll = 0x236
sysTrapAlmAlarmCallback = 0x237
sysTrapAlmSetAlarm = 0x238
sysTrapAlmGetAlarm = 0x239
sysTrapAlmDisplayAlarm = 0x23a
sysTrapAlmEnableNotification = 0x23b
sysTrapHwrGetRAMMapping = 0x23c
sysTrapHwrMemWritable = 0x23d
sysTrapHwrMemReadable = 0x23e
sysTrapHwrDoze = 0x23f
sysTrapHwrSleep = 0x240
sysTrapHwrWake = 0x241
sysTrapHwrSetSystemClock = 0x242
sysTrapHwrSetCPUDutyCycle = 0x243
sysTrapHwrLCDInit = 0x244
sysTrapHwrLCDSleep = 0x245
sysTrapHwrTimerInit = 0x246
sysTrapHwrCursor = 0x247
sysTrapHwrBatteryLevel = 0x248
sysTrapHwrDelay = 0x249
sysTrapHwrEnableDataWrites = 0x24a
sysTrapHwrDisableDataWrites = 0x24b
sysTrapHwrLCDBaseAddr = 0x24c
sysTrapHwrLCDDrawBitmap = 0x24d
sysTrapHwrTimerSleep = 0x24e
sysTrapHwrTimerWake = 0x24f
sysTrapHwrLCDWake = 0x250
sysTrapHwrIRQ1Handler = 0x251
sysTrapHwrIRQ2Handler = 0x252
sysTrapHwrIRQ3Handler = 0x253
sysTrapHwrIRQ4Handler = 0x254
sysTrapHwrIRQ5Handler = 0x255
sysTrapHwrIRQ6Handler = 0x256
sysTrapHwrDockSignals = 0x257
sysTrapHwrPluggedIn = 0x258
sysTrapCrc16CalcBlock = 0x259
sysTrapSelectDayV10 = 0x25a
sysTrapSelectTime = 0x25b
sysTrapDayDrawDaySelector = 0x25c
sysTrapDayHandleEvent = 0x25d
sysTrapDayDrawDays = 0x25e
sysTrapDayOfWeek = 0x25f
sysTrapDaysInMonth = 0x260
sysTrapDayOfMonth = 0x261
sysTrapDateDaysToDate = 0x262
sysTrapDateToDays = 0x263
sysTrapDateAdjust = 0x264
sysTrapDateSecondsToDate = 0x265
sysTrapDateToAscii = 0x266
sysTrapDateToDOWDMFormat = 0x267
sysTrapTimeToAscii = 0x268
sysTrapFind = 0x269
sysTrapFindStrInStr = 0x26a
sysTrapFindSaveMatch = 0x26b
sysTrapFindGetLineBounds = 0x26c
sysTrapFindDrawHeader = 0x26d
sysTrapPenOpen = 0x26e
sysTrapPenClose = 0x26f
sysTrapPenGetRawPen = 0x270
sysTrapPenCalibrate = 0x271
sysTrapPenRawToScreen = 0x272
sysTrapPenScreenToRaw = 0x273
sysTrapPenResetCalibration = 0x274
sysTrapPenSleep = 0x275
sysTrapPenWake = 0x276
sysTrapResLoadForm = 0x277
sysTrapResLoadMenu = 0x278
sysTrapFtrInit = 0x279
sysTrapFtrUnregister = 0x27a
sysTrapFtrGet = 0x27b
sysTrapFtrSet = 0x27c
sysTrapFtrGetByIndex = 0x27d
sysTrapGrfInit = 0x27e
sysTrapGrfFree = 0x27f
sysTrapGrfGetState = 0x280
sysTrapGrfSetState = 0x281
sysTrapGrfFlushPoints = 0x282
sysTrapGrfAddPoint = 0x283
sysTrapGrfInitState = 0x284
sysTrapGrfCleanState = 0x285
sysTrapGrfMatch = 0x286
sysTrapGrfGetMacro = 0x287
sysTrapGrfFilterPoints = 0x288
sysTrapGrfGetNumPoints = 0x289
sysTrapGrfGetPoint = 0x28a
sysTrapGrfFindBranch = 0x28b
sysTrapGrfMatchGlyph = 0x28c
sysTrapGrfGetGlyphMapping = 0x28d
sysTrapGrfGetMacroName = 0x28e
sysTrapGrfDeleteMacro = 0x28f
sysTrapGrfAddMacro = 0x290
sysTrapGrfGetAndExpandMacro = 0x291
sysTrapGrfProcessStroke = 0x292
sysTrapGrfFieldChange = 0x293
sysTrapGetCharSortValue = 0x294
sysTrapGetCharAttr = 0x295
sysTrapGetCharCaselessValue = 0x296
sysTrapPwdExists = 0x297
sysTrapPwdVerify = 0x298
sysTrapPwdSet = 0x299
sysTrapPwdRemove = 0x29a
sysTrapGsiInitialize = 0x29b
sysTrapGsiSetLocation = 0x29c
sysTrapGsiEnable = 0x29d
sysTrapGsiEnabled = 0x29e
sysTrapGsiSetShiftState = 0x29f
sysTrapKeyInit = 0x2a0
sysTrapKeyHandleInterrupt = 0x2a1
sysTrapKeyCurrentState = 0x2a2
sysTrapKeyResetDoubleTap = 0x2a3
sysTrapKeyRates = 0x2a4
sysTrapKeySleep = 0x2a5
sysTrapKeyWake = 0x2a6
sysTrapDlkControl = 0x2a7
sysTrapDlkStartServer = 0x2a8
sysTrapDlkGetSyncInfo = 0x2a9
sysTrapDlkSetLogEntry = 0x2aa
sysTrapUnused2 = 0x2ab
sysTrapSysLibLoad = 0x2ac
sysTrapSndPlaySmf = 0x2ad
sysTrapSndCreateMidiList = 0x2ae
sysTrapAbtShowAbout = 0x2af
sysTrapMdmDial = 0x2b0
sysTrapMdmHangUp = 0x2b1
sysTrapDmSearchRecord = 0x2b2
sysTrapSysInsertionSort = 0x2b3
sysTrapDmInsertionSort = 0x2b4
sysTrapLstSetTopItem = 0x2b5
sysTrapSclSetScrollBar = 0x2b6
sysTrapSclDrawScrollBar = 0x2b7
sysTrapSclHandleEvent = 0x2b8
sysTrapSysMailboxCreate = 0x2b9
sysTrapSysMailboxDelete = 0x2ba
sysTrapSysMailboxFlush = 0x2bb
sysTrapSysMailboxSend = 0x2bc
sysTrapSysMailboxWait = 0x2bd
sysTrapSysTaskWait = 0x2be
sysTrapSysTaskWake = 0x2bf
sysTrapSysTaskWaitClr = 0x2c0
sysTrapSysTaskSuspend = 0x2c1
sysTrapSysTaskResume = 0x2c2
sysTrapCategoryCreateList = 0x2c3
sysTrapCategoryFreeList = 0x2c4
sysTrapCategoryEditV20 = 0x2c5
sysTrapCategorySelect = 0x2c6
sysTrapDmDeleteCategory = 0x2c7
sysTrapSysEvGroupCreate = 0x2c8
sysTrapSysEvGroupSignal = 0x2c9
sysTrapSysEvGroupRead = 0x2ca
sysTrapSysEvGroupWait = 0x2cb
sysTrapEvtEventAvail = 0x2cc
sysTrapEvtSysEventAvail = 0x2cd
sysTrapStrNCopy = 0x2ce
sysTrapKeySetMask = 0x2cf
sysTrapSelectDay = 0x2d0
sysTrapPrefGetPreference = 0x2d1
sysTrapPrefSetPreference = 0x2d2
sysTrapPrefGetAppPreferences = 0x2d3
sysTrapPrefSetAppPreferences = 0x2d4
sysTrapFrmPointInTitle = 0x2d5
sysTrapStrNCat = 0x2d6
sysTrapMemCmp = 0x2d7
sysTrapTblSetColumnEditIndicator = 0x2d8
sysTrapFntWordWrap = 0x2d9
sysTrapFldGetScrollValues = 0x2da
sysTrapSysCreateDataBaseList = 0x2db
sysTrapSysCreatePanelList = 0x2dc
sysTrapDlkDispatchRequest = 0x2dd
sysTrapStrPrintF = 0x2de
sysTrapStrVPrintF = 0x2df
sysTrapPrefOpenPreferenceDB = 0x2e0
sysTrapSysGraffitiReferenceDialog = 0x2e1
sysTrapSysKeyboardDialog = 0x2e2
sysTrapFntWordWrapReverseNLines = 0x2e3
sysTrapFntGetScrollValues = 0x2e4
sysTrapTblSetRowStaticHeight = 0x2e5
sysTrapTblHasScrollBar = 0x2e6
sysTrapSclGetScrollBar = 0x2e7
sysTrapFldGetNumberOfBlankLines = 0x2e8
sysTrapSysTicksPerSecond = 0x2e9
sysTrapHwrBacklight = 0x2ea
sysTrapDmDatabaseProtect = 0x2eb
sysTrapTblSetBounds = 0x2ec
sysTrapStrNCompare = 0x2ed
sysTrapStrNCaselessCompare = 0x2ee
sysTrapPhoneNumberLookup = 0x2ef
sysTrapFrmSetMenu = 0x2f0
sysTrapEncDigestMD5 = 0x2f1
sysTrapDmFindSortPosition = 0x2f2
sysTrapSysBinarySearch = 0x2f3
sysTrapSysErrString = 0x2f4
sysTrapSysStringByIndex = 0x2f5
sysTrapEvtAddUniqueEventToQueue = 0x2f6
sysTrapStrLocalizeNumber = 0x2f7
sysTrapStrDelocalizeNumber = 0x2f8
sysTrapLocGetNumberSeparators = 0x2f9
sysTrapMenuSetActiveMenuRscID = 0x2fa
sysTrapLstScrollList = 0x2fb
sysTrapCategoryInitialize = 0x2fc
sysTrapEncDigestMD4 = 0x2fd
sysTrapEncDES = 0x2fe
sysTrapLstGetVisibleItems = 0x2ff
sysTrapWinSetWindowBounds = 0x300
sysTrapCategorySetName = 0x301
sysTrapFldSetInsertionPoint = 0x302
sysTrapFrmSetObjectBounds = 0x303
sysTrapWinSetColors = 0x304
sysTrapFlpDispatch = 0x305
sysTrapFlpEmDispatch = 0x306
sysTrapExgInit = 0x307
sysTrapExgConnect = 0x308
sysTrapExgPut = 0x309
sysTrapExgGet = 0x30a
sysTrapExgAccept = 0x30b
sysTrapExgDisconnect = 0x30c
sysTrapExgSend = 0x30d
sysTrapExgReceive = 0x30e
sysTrapExgRegisterData = 0x30f
sysTrapExgNotifyReceive = 0x310
sysTrapExgControl = 0x311
sysTrapPrgStartDialog = 0x312
sysTrapPrgStopDialog = 0x313
sysTrapPrgUpdateDialog = 0x314
sysTrapPrgHandleEvent = 0x315
sysTrapImcReadFieldNoSemicolon = 0x316
sysTrapImcReadFieldQuotablePrintable = 0x317
sysTrapImcReadPropertyParameter = 0x318
sysTrapImcSkipAllPropertyParameters = 0x319
sysTrapImcReadWhiteSpace = 0x31a
sysTrapImcWriteQuotedPrintable = 0x31b
sysTrapImcWriteNoSemicolon = 0x31c
sysTrapImcStringIsAscii = 0x31d
sysTrapTblGetItemFont = 0x31e
sysTrapTblSetItemFont = 0x31f
sysTrapFontSelect = 0x320
sysTrapFntDefineFont = 0x321
sysTrapCategoryEdit = 0x322
sysTrapSysGetOSVersionString = 0x323
sysTrapSysBatteryInfo = 0x324
sysTrapSysUIBusy = 0x325
sysTrapWinValidateHandle = 0x326
sysTrapFrmValidatePtr = 0x327
sysTrapCtlValidatePointer = 0x328
sysTrapWinMoveWindowAddr = 0x329
sysTrapFrmAddSpaceForObject = 0x32a
sysTrapFrmNewForm = 0x32b
sysTrapCtlNewControl = 0x32c
sysTrapFldNewField = 0x32d
sysTrapLstNewList = 0x32e
sysTrapFrmNewLabel = 0x32f
sysTrapFrmNewBitmap = 0x330
sysTrapFrmNewGadget = 0x331
sysTrapFileOpen = 0x332
sysTrapFileClose = 0x333
sysTrapFileDelete = 0x334
sysTrapFileReadLow = 0x335
sysTrapFileWrite = 0x336
sysTrapFileSeek = 0x337
sysTrapFileTell = 0x338
sysTrapFileTruncate = 0x339
sysTrapFileControl = 0x33a
sysTrapFrmActiveState = 0x33b
sysTrapSysGetAppInfo = 0x33c
sysTrapSysGetStackInfo = 0x33d
sysTrapScrDisplayMode = 0x33e
sysTrapHwrLCDGetDepth = 0x33f
sysTrapHwrGetROMToken = 0x340
sysTrapDbgControl = 0x341
sysTrapExgDBRead = 0x342
sysTrapExgDBWrite = 0x343
sysTrapSysGremlins = 0x344
sysTrapFrmRemoveObject = 0x345
StrCompare es 0XC8 . Eso significa que
tenemos que ponerle fuego al
PalmDebugger, Primero Poner el debugger
en ' Emulator ' en ' menu "Connection"
(in the case you want to debug a program
which is running on the emu por
supuesto) , Invocar Con el comando "ATT",
(Para conectar el debugger),Buscamos un
"atb 0c8" y entonces con "g" entramos al
emulador y se congela el debugger (Es el
mismo que el F5 en el debugger SoftIce
de Windows 32 bits).
Ahora regresemos al
Yearly.PRC en la palm e intentemos
registrarnos como antes (Recuerda, Todo
el tiempo el emulador salta al debugger
cuando encuentra algún " bp", la ejecución es libreada
y podemos trabajar en el debugger. Para
devolver a la ejecución a la palm o el
emúlador, Solo basta poner un Go "g" y
un "Enter" por supuesto.
Escribir un serial y dar click en "OK",
BOOm!! Allí conseguimos ir . StrCompare
toma dos parámetros, uno (en este caso)
es el serial que hemos escrito y el otro
es el serial generado bueno.
La pregunta es en que
lugar de la memoria tenemos nuestro
verdedero serial:)
(Btw Yearly toma como un nombre de
usuario el nombre del usuario HotSync,
en mi caso es ' Latigo '). Escribimos un
comando ' il ' para desensamblar las 10
líneas de código a partir del breakpoint.
Hacemos esto para comparar este código
dentro del IDA para saber si estamos en
el lugar correcto.
Regresamos al código desensamblado,
sabemos que punteros son presionados:
000007C2 45 EC 02 A0
LEA.L $2A0(A4), A2
000007C6 42 32 50 00 CLR.B $0(A2, D5.W)
000007CA 48 6C 02 A0 PEA.L $2A0(A4)
000007CE 4E 4F A0 C7 SysTrap StrLen
000007D2 58 4F ADD.W #$4, A7
000007D4 0C 40 00 08 CMP.W #$0008, D0
000007D8 63 14 BLS.S LOC_7EE
000007DA 48 6C 02 A0 PEA.L $2A0(A4)
000007DE 4E 4F A0 C7 SysTrap StrLen
000007E2 E2 48 LSR.W #$1, D0
000007E4 36 00 MOVE.W D0, D3
000007E6 52 43 ADD.W #$1, D3
000007E8 42 32 30 00 CLR.B $0(A2, D3.W)
000007EC 58 4F ADD.W #$4, A7
loc_7EE:
000007EE 41 EC 05 60 LEA.L $560(A4), A0
000007F2 48 68 00 02 PEA.L $2(A0) <- Empuja aquí el mismo ptr como adentro 000048CA
000007F6 48 6C 02 A0 PEA.L $2A0(A4) <- Dirección para la generación del serial
000007FA 4E 4F A0 C8 SysTrap StrCompare
000007FE 4A 40 TST.W D0
00000800 66 06 BNE.S LOC_808
00000802 39 7C 00 01 00.. MOVE.W #$0001,
$28(A4)
loc_808:
00000808 4C EE
0000080A 04 F8 DC.W #04F8
0000080C FF E8 DC.W #FFE8
0000080E 4E 5E UNLK.L A6
00000810 4E 75 RTS
Nos interesa el
$2A0(A4)
Ya que el otro contiene una copia de
nuestro serial.
'$2A0(A4)
Siguiente manera: 'Tomaremos la
dirección que está contenida en el
registro A4, añadiéndole 0x2A0
él puntero nos llevara a algo, entonces
pondremos el puntero y conseguiremos el
serial real '
Para saber los contenidos de A4
debemos escribir el comando ' REG
' (Para que nos muestre los contenidos
de TODOS los registros). En este caso,
A4 contiene a ' 0001306A
'. 0x2A0 deberíamos de agregar
este, dándonos 0x1330A como
consecuencia. ÉSTE es el puntero de la
cadena. Todo lo de la izquierda
esta en 'DM 1330A'
(DM = Display Memory) Este es el
resultado de la busqueda en memoria:
0001330A: 35 36 36 38 00 00 00 00 00 00 00 00 00 00 00 00 "5668............"
Con el comando "dm a1" encontramos el serial falso.
Otra manera de encontrar el serial es usar el comando "dm a1"
El número 5668 es el serial para un HotSync/name "Latigo"
Of course, the other
pointer passed as parameter to
StrCompare was our username, but just in
case you wanna double check do the
following: 0x1306A + 0x560 + 0x2 =
0x135CC
'DM 135CC' and you'll see what
you entered as a serial. (Btw, the last
'0x2' is added to our addresses
cos that is what happens at
code0001:000006C2)
Que es eso! , Allí lo
tenemos! un agradable
'Listado muerto ' + ' Acercamiento con
la memoria '
Por consiguiente, La parte de este
tutorial enseñara como realizar el
keygen, Sigue leyendo abajo.
Comandos usado en el PalmDebugger.exe
(checar la lista de comandos del PalmDebugger's
con la ayuda que se incluye con help):
Comando |
Descripción |
|
ATB |
Colocar un
trap break.
Sytanx = atb 'SysTrap
number' |
G |
Continuar ejecucion.
Toma la dirección de la
memoria es parametro
opcional |
ATT |
Conectar el debugger con
un Emulador ó Palm
remota |
IL |
Desensamblar el
código del programa
actual en la
dirección
(EIP). |
DM |
(Dumps) Mostrar el
contenido de la memoria |
REG |
Mostrar todos los
registros. |
|
Ok, Esto es todo espero
que les haya gustado ,
http://www.latigo.cjb.net. Bye!
KeyGen early 3.1c "Generador de
llaves"
Son algunas instrucciones en DragonBall cpu comentadas y
traducidas para una mejor comprensión. Al final esta el
código fuente del KeyGen en lenguaje Assembler para
Win32Asm .
Subrutina (s) que el programa usa para generar y validar
un número de serie. Cada línea es comentada y las
instrucciones traducidas a x86 son descritas después del
carácter '|'. Las instrucciones del x86 son ' mixtas '
con los registros DragonBall. (Se verán los términos más
adelante) lo hice de forma que se pudiera entender el
algoritmo.
code0001:000005CC link a6,#0 ; Crear espacio en la memoria para variables
code0001:000005D0 movem.l d3-d7/a2,-(sp) ; Guardar registros y destruirlos
code0001:000005D4 pea $9E0(a4) ; Pon el username
code0001:000005D8 systrap StrLen()
code0001:000005DC move.w d0,d6 ; mov serial's longitud de D6 | mov D6,d0
code0001:000005DE moveq #$F,d2 ; move 0xf de d2 | mov d2,0fh
code0001:000005E0 lsr.w d2,d0 ; Cambia a la derecha d0 by d2 | shr d0,d2
code0001:000005E2 add.w d6,d0 ; add d6 to d0 | ADD d0,d6
code0001:000005E4 move.w d0,d7 ; mov d7,d0
code0001:000005E6 asr.w #1,d7 ; shr d7,1
code0001:000005E8 move.w d7,d4 ; mov d4,d7
code0001:000005EA move.w d4,d0 ; mov d0,d4
code0001:000005EC add.w d4,d0 ; add d0,d4
code0001:000005EE move.w d6,d7 ; mov serial's longitud en d7 | mov d7,d6
code0001:000005F0 sub.w d0,d7 ; sub d7,d0
code0001:000005F2 clr.w $28(a4) ; Pon un 0 en nuestra bandera de registro.
code0001:000005F6 addq.w #4,sp ; corrección de la pila | add esp,4
code0001:000005F8 cmpi.w #2,d6 ; La longitud de nuestro serial es = 2?
code0001:000005FC ble loc_0_6D8 ; Salta a mal tipo
code0001:00000600 lea $560(a4),a0 ; Mete en a0 la dirección del serial | lea a0,cualquiera
code0001:00000604 pea 2(a0) ; Pon una copia del serial en la pila
code0001:00000608 systrap StrLen()
code0001:0000060C addq.w #4,sp ; Corrección de pila
code0001:0000060E cmpi.w #2,d0 ; La longitud es de 2 caracteres?
code0001:00000612 bls loc_0_6D8 ; Salta a mal pillo
code0001:00000616 clr.w d5 ; Borra los registros de d5
code0001:00000618 move.w d4,d3 ; mov d3,d4
code0001:0000061A subq.w #1,d3 ; SUB d3,1
code0001:0000061C cmp.w d3,d6 ; is DX = nuestra longitud del serial? | cmp d6,d3
code0001:0000061E ble.s loc_0_65E ; Si ,Salta a alguna parte
code0001:00000620
code0001:00000620 loc_0_620: ; CODE XREF: sub_0_5CC+90.j
code0001:00000620 tst.w d4 ; Es d4 nulo ó 0 ? | cmp d4,0 or cmp d4,Nulo
code0001:00000622 blt.s loc_0_65E ; Si, Salta a algún lado
code0001:00000624 lea $2A0(a4),a1 ; Pon en a1 la dirección que contiene el serial generado
code0001:00000628 lea $9E0(a4),a0 ; Apuntar el username en a0
code0001:0000062C move.b (a0,d3.w),d1 ; Mover a d1 el caracter en la posición d3 en la cadena de a0 | MOV d1,BYTE PTR [a0+d3]
code0001:00000630 ext.w d1 ; El equivalente a ext.w es CBW Pero no utilizado en mi keygen
code0001:00000632 move.b (a0,d4.w),d0 ; El mismo que antes pero con otro registros
code0001:00000636 ext.w d0
code0001:00000638 ext.l d1
code0001:0000063A divs.w d0,d1 ; DIVS = IDIV. en este casi si D1 es AX entonces IDIV D0
code0001:0000063C move.l d1,d0 ; mov d0,d1
code0001:0000063E swap d0 ; swap Intercambiar las palabras en un determinado registro
code0001:00000640 move.b d0,(a1,d5.w) ; mover byte ptr [a1+d5],d0
code0001:00000644 addq.w #1,d5 ; inc d5
code0001:00000646 lea $2A0(a4),a0 ; Dirección del serial generado en a0
code0001:0000064A subq.w #1,a0 ; SUB A0,1
code0001:0000064C pea (a0,d5.w) ; Este pone el caracter a la posición d5 de la cadena a a0
code0001:00000650 bsr sub_0_594 ; Slatar a la subrutina que convierte a números ascii
code0001:00000654 addq.w #4,sp ; corrección de la pila
code0001:00000656 addq.w #1,d3 ; incrementar d3 | inc d3
code0001:00000658 subq.w #1,d4 ; decrementar d4 | dec d4
code0001:0000065A cmp.w d3,d6 ; contador = longitud? | cmp d6,d3
code0001:0000065C bgt.s loc_0_620 ; Es d4 nulo ó 0 ? | cmp d4,0 or cmp d4,NULL
code0001:0000065E
code0001:0000065E loc_0_65E: ; CODE XREF: sub_0_5CC+52.j
code0001:0000065E ; sub_0_5CC+56.j
code0001:0000065E tst.w d7 ; d7 nulo?
code0001:00000660 beq.s loc_0_692 ; Si, salta a hacer la comparación | JZ En alguna parte
code0001:00000662 lea $2A0(a4),a1 ; lea a1, Real Serial
code0001:00000666 lea $9E0(a4),a0 ; lea esi,UserName
code0001:0000066A move.b (a0),d0 ; Mover un caracter de user name a d0
code0001:0000066C ext.w d0
code0001:0000066E move.b -1(a0,d6.w),d1 ; mov d1,byte ptr [a0+d6-1]
code0001:00000672 ext.w d1 ; d1 = bx
code0001:00000674 ext.l d0 ; d0 = ax
code0001:00000676 divs.w d1,d0 ; IDIV BX
code0001:00000678 move.l d0,d1 ; mov d1,d0
code0001:0000067A swap d1
code0001:0000067C move.b d1,(a1,d5.w) ; mov word ptr[a1+d5],d1
code0001:00000680 addq.w #1,d5 ; inc d5
code0001:00000682 lea $2A0(a4),a0 ; lea a0,variable
code0001:00000686 subq.w #1,a0 ; dec a0
code0001:00000688 pea (a0,d5.w) ; Pon el caracter a la posición d5 de la cadena a a0
code0001:0000068C bsr sub_0_594 ; Saltar a la subrutina ascii
code0001:00000690 addq.w #4,sp ; corrección de la pila
code0001:00000692
code0001:00000692 loc_0_692: ; CODE XREF: sub_0_5CC+94.j
code0001:00000692 lea $2A0(a4),a2 ; Nuestro seial en a2
code0001:00000696 clr.b (a2,d5.w) ; Añadir caracter nulo | move byte ptr [a2+a5],0
code0001:0000069A pea $2A0(a4) ; Ponlo
code0001:0000069E systrap StrLen()
code0001:000006A2 addq.w #4,sp ; Correción de la pila
code0001:000006A4 cmpi.w #8,d0 ; La longitud es de 8 ? | cmp d0,8
code0001:000006A8 bls.s loc_0_6BE ; JLE en algún lugar
code0001:000006AA pea $2A0(a4) ; Conseguir su longitud
code0001:000006AE systrap StrLen()
code0001:000006B2 lsr.w #1,d0 ; Cambiar 1 a la derecha | shr d0,1
code0001:000006B4 move.w d0,d3 ; copiar a d3 | mov d3,d0
code0001:000006B6 addq.w #1,d3 ; Sumar 1 a d3 | inc d3
code0001:000006B8 clr.b (a2,d3.w) ; caracteres solo en d3 username un carácter nulo por añadir en nuestro serial | mov byte ptr [a2+d3],0
code0001:000006BC addq.w #4,sp ; add esp,4
code0001:000006BE
code0001:000006BE loc_0_6BE: ; CODE XREF: sub_0_5CC+DC.j
code0001:000006BE lea $560(a4),a0 ; Serial introducido en a0
code0001:000006C2 pea 2(a0) ; Pon esa dirección pero primero increméntalo por 2 este punto es nuestro serial
code0001:000006C6 pea $2A0(a4) ; serial generado
code0001:000006CA systrap StrCompare()
code0001:000006CE tst.w d0 ; d0 is 0? | cmp d0,0
code0001:000006D0 bne.s loc_0_6D8 ; Ramificar si no es igual Chico malo | JNZ Mal chico
code0001:000006D2 move.w #1,$28(a4) ; RegFlag colocar! | mov d4,1
code0001:000006D8
code0001:000006D8 loc_0_6D8: ; CODE XREF: sub_0_5CC+30.j
code0001:000006D8 ; sub_0_5CC+46.j ...
code0001:000006D8 movem.l var_18(a6),d3-d7/a2
code0001:000006DE unlk a6
code0001:000006E0 rts
code0001:000006E0 ; End of function sub_0_5CC
code0001:00000594 proc sub_0_594() ; CODE XREF: sub_0_5CC+84.p
code0001:00000594 link a6,#0
code0001:00000598 movea.l arg_0(a6),a0 ; Mover al parametro de la primera posición (Un caracter) a a0
code0001:0000059C move.b (a0),d0 ; mov d0,a0
code0001:0000059E cmpi.b #$A,d0 ; cmp d0,10
code0001:000005A2 bls.s loc_0_5AE ; JLE en algún lado
code0001:000005A4
code0001:000005A4 loc_0_5A4: ; CODE XREF: sub_0_594+18.j
code0001:000005A4 lsr.b #1,d0 ; shr d0,1
code0001:000005A6 move.b d0,(a0) ; mov a0,d0
code0001:000005A8 cmpi.b #$A,d0 ; cmp a0,10
code0001:000005AC bhi.s loc_0_5A4 ; JA seguir cambio
code0001:000005AE
code0001:000005AE loc_0_5AE: ; CODE XREF: sub_0_594+E.j
code0001:000005AE clr.w d0 ; xor d0,d0
code0001:000005B0 move.b (a0),d0 ; mov d0,a0
code0001:000005B2 move.w d0,d1 ; mov d1,d0
code0001:000005B4 moveq #$A,d2 ; mov d2,0ah
code0001:000005B6 andi.l #$FFFF,d1 ; and d1,0ffffh
code0001:000005BC divu.w d2,d1 ; De d1 donde AX este va a ser DIV d2
code0001:000005BE move.l d1,d0 ; mov d0,d1
code0001:000005C0 swap d0
code0001:000005C2 ori.b #$30,d0 ; '0' ; OR d0,30h
code0001:000005C6 move.b d0,(a0) ; mov a0,d0
code0001:000005C8 unlk a6 ; leave (salir)
code0001:000005CA rts ; ret (terminar)
code0001:000005CA ; End of function sub_0_594
Después
de un poco de lucha haremos un keygen en Win32Asm. Este
es el código fuente. By Latigo .
.386
.MODEL FLAT, STDCALL
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
WinMain PROTO hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD
.CONST
IDKEYGEN EQU 1000
IDC_USERNAME EQU 1001
IDC_SERIAL EQU 1002
IDM_ABOUT EQU 1
ID_ABOUTCLOSE EQU 2
SMALLICON EQU 103
.DATA
MainDlgName DB "IDD_DIALOG1",0
AboutDlgName DB "IDD_ABOUTDIALOG",0
Titulo DB "Yerly KeyGenerator by Latigo/UCF",0
NotEnuffCharsMsg DB "Longitud del Username's debe ser menor de 3 caracteres!",0
HexFormatter DB "%#04x",0
DecFormatter DB "%d",0
StringFormatter DB "%hs",0
.DATA?
hInstance DWORD ?
UserSerial DB 255 DUP (?)
RealSerial DB 255 DUP (?)
.CODE
start:
INVOKE GetModuleHandle, NULL
MOV hInstance,EAX
INVOKE WinMain, hInstance,NULL,SW_SHOWDEFAULT
INVOKE ExitProcess,EAX
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD
MOV EAX, OFFSET DlgProc
INVOKE DialogBoxParam, hInst, OFFSET MainDlgName,NULL,EAX,NULL
RET
WinMain endp
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL D5:WORD
LOCAL D3:WORD ; ptr para un carácter
LOCAL D4:WORD ; ptr para un carácter
LOCAL D6:WORD ; Contiene la longitud del UserName's
LOCAL D7:WORD
MOV EAX,uMsg
CMP EAX, WM_CLOSE
JZ _close
CMP EAX,WM_INITDIALOG
JZ _initdialog
CMP EAX,WM_COMMAND
JZ _command
xor EAX,EAX
RET
_close:
INVOKE ExitProcess,0
RET
_initdialog:
INVOKE LoadIcon,hInstance,SMALLICON
INVOKE SendMessage,hWnd,WM_SETICON,ICON_SMALL,EAX
RET
_command:
MOV EAX, wParam
CMP EAX,IDKEYGEN
JZ KeyGenIt
CMP AX,IDM_ABOUT
JZ _about
RET
_about:
MOV EAX, OFFSET AboutDlgProc
INVOKE DialogBoxParam, hInstance, OFFSET AboutDlgName,NULL,EAX,NULL
RET
KeyGenIt:
INVOKE GetDlgItemText,hWnd,IDC_USERNAME,OFFSET UserSerial,255
INVOKE lstrlen,OFFSET UserSerial
CMP EAX,2
JLE NotEnuffChars
MOV D6,AX
SHR AX,0FH
ADD AX,D6
MOV BX,AX
SHR BX,1
MOV CX,BX
MOV AX,CX
ADD AX,CX
MOV BX,D6
SUB BX,AX
MOV DX,CX
SUB DX,1
MOV D5,0
MOV D7,BX
MOV D4,CX
MOV D3,DX
CMP DX,D6
JZ Mentira
LEA EDI,RealSerial
LEA ESI,UserSerial
XOR EAX,EAX
XOR EBX,EBX
XOR EDX,EDX
NextChars:
CMP D4,0ffffh ; (or NULL)
JZ Mentira
MOV DX,D3
MOV AL,BYTE PTR [ESI+EDX]
MOV DX,D4
MOV BL,BYTE PTR [ESI+EDX]
XOR EDX,EDX
IDIV BX
PUSH EDX
CALL AddIt
XOR ECX,ECX
MOV CX,D5
MOV BYTE PTR [EDI+ECX],DL
INC D3
MOV AX,D3
MOV BX,D6
CMP AX,BX
JZ MentiraLaMentiraMentiraLaVerdad
INC D5
DEC D4
JMP NextChars
Mentira:
CMP D7,0FFFFH
JZ MentiraLaMentiraMentiraLaVerdad
XOR EAX,EAX
XOR EBX,EBX
LEA ESI,UserSerial
MOV AL,BYTE PTR [ESI]
XOR EDX,EDX
MOV DX,D6
MOV BL,BYTE PTR [ESI+EDX-1]
XOR EDX,EDX
IDIV BX
PUSH EDX
CALL AddIt
XOR ECX,ECX
MOV CX,D5
MOV BYTE PTR [EDI+ECX],DL
MentiraLaMentiraMentiraLaVerdad:
LEA ESI,RealSerial
XOR EAX,EAX
MOV AX,D5
INC AX
ADD ESI,EAX
MOV BYTE PTR [ESI],NULL
INVOKE lstrlen,OFFSET RealSerial
CMP EAX,8
JLE NoNeedToChop
SHR EAX,1
LEA ESI,RealSerial
ADD ESI,EAX
ADD ESI,1
MOV BYTE PTR [ESI],NULL
NoNeedToChop:
INVOKE SetDlgItemText,hWnd,IDC_SERIAL,OFFSET RealSerial
RET
NotEnuffChars:
INVOKE MessageBox,0,OFFSET NotEnuffCharsMsg,0,MB_OK
RET
DlgProc endp
AddIt PROC Char:DWORD
CMP DL,10
JLE EsMenorADiez
GoOnShifting:
SHR DL,1
CMP DL,10
JA GoOnShifting
EsMenorADiez:
MOV BX,10
MOV AL,DL
XOR DX,DX
DIV BX
OR DL,30H
RET
AddIt ENDP
AboutDlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
MOV EAX,uMsg
CMP EAX, WM_CLOSE
JZ about_close
CMP EAX,WM_COMMAND
JZ about_command
xor EAX,EAX
RET
about_close:
INVOKE EndDialog,hWnd,0
RET
about_command:
MOV EAX, wParam
CMP EAX,ID_ABOUTCLOSE
JZ about_close
RET
AboutDlgProc ENDP
END start
The end.
|