MINOTAURO MAGAZINE #10

                          Numeros ordinales de APIs
                                 por Trurl

    En la VLAD 5 sali¢ una nota muy interesante que tra¡a todos los numeros
ordinales de las APIs de KERNEL. Aparentemente Quantum iba cambiando a mano
los numeros en el file y viendo que API produc¡an, hasta que termino la lista.
Yo no tuve mejor idea que hacer un programita que te muestra todas las
funciones exportadas de un ejecutable, con sus numeros, y me di cuenta de que
se le habian escapado algunas API, porque paro en el n£mero F0h y hay APIs
exportadas en KRNL386.EXE hasta 160h. As¡ que les mando de nuevo una lista
mejor; y adem s de yapa el programa que te muestra los exports de un EXE de
Windows, de modo que con solo usar el programa pueden descubrir ustedes mismo
los numeros ordinales de todos los exports de GDI, USER, o de hecho de
cualquier DLL o EXE (o DRV incluso) que se les cruce por adelante.

    Los ordinales son (est n en orden creciente):

File: krnl386.exe
Nombre descriptivo: Microsoft Windows Kernel Interface Version 3.10 (0000)
Nombre del modulo: KERNEL (0000)

    FATALEXIT (0001)
    EXITKERNEL (0002)
    GETVERSION (0003)
    LOCALINIT (0004)
    LOCALALLOC (0005)
    LOCALREALLOC (0006)
    LOCALFREE (0007)
    LOCALLOCK (0008)
    LOCALUNLOCK (0009)
    LOCALSIZE (000A)
    LOCALHANDLE (000B)
    LOCALFLAGS (000C)
    LOCALCOMPACT (000D)
    LOCALNOTIFY (000E)
    GLOBALALLOC (000F)
    GLOBALREALLOC (0010)
    GLOBALFREE (0011)
    GLOBALLOCK (0012)
    GLOBALUNLOCK (0013)
    GLOBALSIZE (0014)
    GLOBALHANDLE (0015)
    GLOBALFLAGS (0016)
    LOCKSEGMENT (0017)
    UNLOCKSEGMENT (0018)
    GLOBALCOMPACT (0019)
    GLOBALFREEALL (001A)
    1B : Indefinida
    GLOBALMASTERHANDLE (001C)
    YIELD (001D)
    WAITEVENT (001E)
    POSTEVENT (001F)
    SETPRIORITY (0020)
    LOCKCURRENTTASK (0021)
    SETTASKQUEUE (0022)
    GETTASKQUEUE (0023)
    GETCURRENTTASK (0024)
    GETCURRENTPDB (0025)
    SETTASKSIGNALPROC (0026)
    27 : Indefinida
    28 : Indefinida
    ENABLEDOS (0029)
    DISABLEDOS (002A)
    2B - Indefinida
    2C - Indefinida
    LOADMODULE (002D)
    FREEMODULE (002E)
    GETMODULEHANDLE (002F)
    GETMODULEUSAGE (0030)
    GETMODULEFILENAME (0031)
    GETPROCADDRESS (0032)
    MAKEPROCINSTANCE (0033)
    FREEPROCINSTANCE (0034)
    CALLPROCINSTANCE (0035)
    GETINSTANCEDATA (0036)
    CATCH (0037)
    THROW (0038)
    GETPROFILEINT (0039)
    GETPROFILESTRING (003A)
    WRITEPROFILESTRING (003B)
    FINDRESOURCE (003C)
    LOADRESOURCE (003D)
    LOCKRESOURCE (003E)
    FREERESOURCE (003F)
    ACCESSRESOURCE (0040)
    SIZEOFRESOURCE (0041)
    ALLOCRESOURCE (0042)
    SETRESOURCEHANDLER (0043)
    INITATOMTABLE (0044)
    FINDATOM (0045)
    ADDATOM (0046)
    DELETEATOM (0047)
    GETATOMNAME (0048)
    GETATOMHANDLE (0049)
    OPENFILE (004A)
    OPENPATHNAME (004B)
    DELETEPATHNAME (004C)
    RESERVED1 (004D)
    RESERVED2 (004E)
    RESERVED3 (004F)
    RESERVED4 (0050)
    _LCLOSE (0051)
    _LREAD (0052)
    _LCREAT (0053)
    _LLSEEK (0054)
    _LOPEN (0055)
    _LWRITE (0056)
    RESERVED5 (0057)
    LSTRCPY (0058)
    LSTRCAT (0059)
    LSTRLEN (005A)
    INITTASK (005B)
    GETTEMPDRIVE (005C)
    GETCODEHANDLE (005D)
    DEFINEHANDLETABLE (005E)
    LOADLIBRARY (005F)
    FREELIBRARY (0060)
    GETTEMPFILENAME (0061)
    GETLASTDISKCHANGE (0062)
    GETLPERRMODE (0063)
    VALIDATECODESEGMENTS (0064)
    NOHOOKDOSCALL (0065)
    DOS3CALL (0066)
    NETBIOSCALL (0067)
    GETCODEINFO (0068)
    GETEXEVERSION (0069)
    SETSWAPAREASIZE (006A)
    SETERRORMODE (006B)
    SWITCHSTACKTO (006C)
    SWITCHSTACKBACK (006D)
    PATCHCODEHANDLE (006E)
    GLOBALWIRE (006F)
    GLOBALUNWIRE (0070)
    __AHSHIFT (0071)
    __AHINCR (0072)
    OUTPUTDEBUGSTRING (0073)
    INITLIB (0074)
    OLDYIELD (0075)
    GETTASKQUEUEDS (0076)
    GETTASKQUEUEES (0077)
    UNDEFDYNLINK (0078)
    LOCALSHRINK (0079)
    ISTASKLOCKED (007A)
    KBDRST (007B)
    ENABLEKERNEL (007C)
    DISABLEKERNEL (007D)
    MEMORYFREED (007E)
    GETPRIVATEPROFILEINT (007F)
    GETPRIVATEPROFILESTRING (0080)
    WRITEPRIVATEPROFILESTRING (0081)
    FILECDR (0082)
    GETDOSENVIRONMENT (0083)
    GETWINFLAGS (0084)
    GETEXEPTR (0085)
    GETWINDOWSDIRECTORY (0086)
    GETSYSTEMDIRECTORY (0087)
    GETDRIVETYPE (0088)
    FATALAPPEXIT (0089)
    GETHEAPSPACES (008A)
    DOSIGNAL (008B)
    SETSIGHANDLER (008C)
    INITTASK1 (008D)
    8E - 95 : Indefinidas
    DIRECTEDYIELD (0096)
    WINOLDAPCALL (0097)
    GETNUMTASKS (0098)
    99 : Indefinida
    GLOBALNOTIFY (009A)
    GETTASKDS (009B)
    LIMITEMSPAGES (009C)
    GETCURPID (009D)
    ISWINOLDAPTASK (009E)
    GLOBALHANDLENORIP (009F)
    EMSCOPY (00A0)
    LOCALCOUNTFREE (00A1)
    LOCALHEAPSIZE (00A2)
    GLOBALLRUOLDEST (00A3)
    GLOBALLRUNEWEST (00A4)
    A20PROC (00A5)
    WINEXEC (00A6)
    GETEXPWINVER (00A7)
    DIRECTRESALLOC (00A8)
    GETFREESPACE (00A9)
    ALLOCCSTODSALIAS (00AA)
    ALLOCDSTOCSALIAS (00AB)
    ALLOCALIAS (00AC)
    __ROMBIOS (00AD)
    __A000H (00AE)
    ALLOCSELECTOR (00AF)
    FREESELECTOR (00B0)
    PRESTOCHANGOSELECTOR (00B1)
    __WINFLAGS (00B2)
    __D000H (00B3)
    LONGPTRADD (00B4)
    __B000H (00B5)
    __B800H (00B6)
    __0000H (00B7)
    GLOBALDOSALLOC (00B8)
    GLOBALDOSFREE (00B9)
    GETSELECTORBASE (00BA)
    SETSELECTORBASE (00BB)
    GETSELECTORLIMIT (00BC)
    SETSELECTORLIMIT (00BD)
    __E000H (00BE)
    GLOBALPAGELOCK (00BF)
    GLOBALPAGEUNLOCK (00C0)
    __0040H (00C1)
    __F000H (00C2)
    __C000H (00C3)
    SELECTORACCESSRIGHTS (00C4)
    GLOBALFIX (00C5)
    GLOBALUNFIX (00C6)
    SETHANDLECOUNT (00C7)
    VALIDATEFREESPACES (00C8)
    REPLACEINST (00C9)
    REGISTERPTRACE (00CA)
    DEBUGBREAK (00CB)
    SWAPRECORDING (00CC)
    CVWBREAK (00CD)
    ALLOCSELECTORARRAY (00CE)
    ISDBCSLEADBYTE (00CF)
    D0 - 135 : Indefinidas
    LOCALHANDLEDELTA (0136)
    GETSETKERNELDOSPROC (0137)
    138 - 139 : Indefinidas
    DEBUGDEFINESEGMENT (013A)
    WRITEOUTPROFILES (013B)
    GETFREEMEMINFO (013C)
    13D : Indefinida
    FATALEXITHOOK (013E)
    FLUSHCACHEDFILEHANDLE (013F)
    ISTASK (0140)
    141 : Indefinida
    ISROMMODULE (0143)
    LOGERROR (0144)
    LOGPARAMERROR (0145)
    ISROMFILE (0146)
    K327 (0147)
    _DEBUGOUTPUT (0148)
    K329 (0149)
    149 - 14B : Indefinidas
    THHOOK (014C)
    14D : Indefinida
    ISBADREADPTR (014E)
    ISBADWRITEPTR (014F)
    ISBADCODEPTR (0150)
    ISBADSTRINGPTR (0151)
    HASGPHANDLER (0152)
    DIAGQUERY (0153)
    DIAGOUTPUT (0154)
    TOOLHELPHOOK (0155)
    156 : Indefinida
    REGISTERWINOLDAPHOOK (0157)
    GETWINOLDAPHOOKS (0158)
    ISSHAREDSELECTOR (0159)
    ISBADHUGEREADPTR (015A)
    ISBADHUGEWRITEPTR (015B)
    HMEMCPY (015C)
    _HREAD (015D)
    _HWRITE (015E)
    BUNNY_351 (015F)
    160 : Indefinida
    __GP (0156) [Nota: Esta est  en la resident name table]
    LSTRCPYN (0161)
    GETAPPCOMPATFLAGS (0162)
    GETWINDEBUGINFO (0163)
    SETWINDEBUGINFO (0164)
    165 - 192 : Indefinidas
    K403 (0193)
    K404 (0194)
    195 - FFFF : Indefinidas

    Como es obvio la mayor parte de estas APIs no est n en la documentaci¢n
(son "indocumentadas"). Algunas son realmente intrigantes.. por ejemplo:
BUNNY_351. Que es eso macaya? __GP, ser  acaso el (G)eneral (P)rotection
[Fault] Handler de Win? Hay otra que se llama HasGPHandler.. mhm. Adem s __GP
es la £nica que esta en la resident names table; las dem s son nonresident, lo
cual refuerza esta idea ya que un handler de GPF debe estar siempre en memoria
etc. Otras interesantes son las que hacen obvia alusi¢n a alg£n segmento com£n
de memoria: __0040 (Variables de BIOS), __A000 (Video), _0000 (IVT); ser n
APIs que retornan selectores que dan acceso a esas areas de memoria? Quiz .
(De todos modos yo no las usar¡a porque en la API de Win32 es casi seguro que
no est n mas).
    En cuanto a que fin practico sirve esta lista, es muy sencillo; ninguno
en principio. Pero quiz  en alg£n momento hagan un virus de Windows y necesi-
ten hacer la tabla de realocaci¢n "a mano" en el source; en ese caso van a
tener que usar esta tabla (y otra similar por cada modulo que necesiten adem s
del kernel; para lo cual les va a ser muy £til el programita). Ya se que las
posibilidades de que uds. hagan un virus de Windows en este milenio o en el
que viene son remotas, pero por algo hay que empezar. (Je Je Je). ¨Aparte,
quien invento eso de que para publicarlo en una revista tiene que ser £til?
¨Acaso el under argentino no esta poblado de revistas que prueban lo contra-
rio? (pregunta que tambi‚n puede articularse como: ¨queda alguien en la
galaxia que no haya le¡do al menos cinco art¡culos distintos sobre como hacer
una bomba ansi?)
    En fin... lindo e interesante y etc. Enjoy
                                                                        Trurl