Palm Spanish Tutor

Programa: Yearly 3.1c + KeyGen

 

PROTECCION: ( )Serial (X)HotSync/Code ( )Trial ( )Multiprotección ( )Encriptado ( )Otro

Objetivo:

Crear Un serial tipo HotSync/Name
Dificultad:

( )NewBies ( )Intermedio (X)Avanzado ( )Master ( )Güru

DOWNLOAD: http://www.google.com
Herramientas: Desensamblador IDA, PalmDebugger, POSE Palm emuladorPrcView
Palm CRACKER:

Latigo

FECHA:    W/31/04/2005

 

 INTRODUCCION

¡Hola! Este es mi primer reversing Palm tutorial que esta enfocado al aprovechamiento de un listado muerto. Ahora la técnica usada es un tanto diferente. Usaremos un debugger para encontrar un número de serie pero no nos conformaremos con poco y también les enseñaré a hacer un KeyGen. Nuestro blanco es el programa "Yearly.prc"

                             

 AL ATAQUE

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.

 

Palm Spanish Tutor: Pagina dedicada a la divulgación de información en Castellano, sobre Ingeniería Inversa y Programación en Palm. E-mail "Colabora con tus Proyectos"