.
Cita de: LeandroA en 14 Octubre 2010, 02:33 AM
Hola, como estas, che una pregunta si no te molesta, podrias compartir el codigo que utilizas en
http://infrangelux.sytes.net/FileX/?file=Basic_API_Decompiler.exe&dir=/BlackZeroX/programas/Semi%20Decompiladores
me gustaria saber como haces para listar las apis de una aplicación
Saludos.
Se puede aun extraer mas informacion; como son los procesos, y sus parametros (con sus tipos de datos), Complementos (OCX), Formularios, Modulos, mm bueno TODO...
Este codigo solo se limita a la extraccion de las APIS de un Ejecutable en VB6
'
' /////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este codigo siempre y cuando //
' // no se eliminen los creditos originales de este codigo //
' // No importando que sea modificado/editado o engrandecido //
' // o achicado, si es en base a este codigo //
' /////////////////////////////////////////////////////////////
Option Explicit
Private Const MAX_PATH As Long = 260
Public Type IMAGE_DOS_HEADER
Magic As Integer
NumBytesLastPage As Integer
NumPages As Integer
NumRelocates As Integer
NumHeaderBlks As Integer
NumMinBlks As Integer
NumMaxBlks As Integer
SSPointer As Integer
SPPointer As Integer
Checksum As Integer
IPPointer As Integer
CurrentSeg As Integer
RelocTablePointer As Integer
Overlay As Integer
ReservedW1(3) As Integer
OEMType As Integer
OEMData As Integer
ReservedW2(9) As Integer
ExeHeaderPointer As Long
End Type
Public Type IMAGE_DATA_DIRECTORY
DataRVA As Long
DataSize As Long
End Type
Public Type IMAGE_OPTIONAL_HEADER
Magic As Integer
MajorLinkVer As Byte
MinorLinkVer As Byte
CodeSize As Long
InitDataSize As Long
unInitDataSize As Long
EntryPoint As Long
CodeBase As Long
DataBase As Long
ImageBase As Long
SectionAlignment As Long
FileAlignment As Long
MajorOSVer As Integer
MinorOSVer As Integer
MajorImageVer As Integer
MinorImageVer As Integer
MajorSSVer As Integer
MinorSSVer As Integer
Win32Ver As Long
ImageSize As Long
HeaderSize As Long
Checksum As Long
Subsystem As Integer
DLLChars As Integer
StackRes As Long
StackCommit As Long
HeapReserve As Long
HeapCommit As Long
LoaderFlags As Long
RVAsAndSizes As Long
DataEntries(15) As IMAGE_DATA_DIRECTORY
End Type
Public Type VBStart_Header
PushStartOpcode As Byte
PushStartAddress As Double
CallStartOpcode As Byte
CallStartAddress As Double
End Type
Private Type VBHeader
lSignature As Long
iRuntimeBuild As Integer
sLanguageDLLName(13) As Byte
sSecLangDLLName(13) As Byte
iRuntimeDLLVersion As Integer
lLanguageID As Long
lSecLanguageID As Long
aSubMain As Long
aProjectInfo As Long
fMDLIntObjs As Long
fMDLIntObjs2 As Long
lThreadFlags As Long
lThreadCount As Long
iGUIObjectCount As Integer
iComponentCount As Integer
lThunkCount As Long
aGUIObjectArray As Long
aComponentArray As Long
aCOMRegData As Long
oProjectExename As Long
oProjectTitle As Long
oHelpFile As Long
oProjectName As Long
End Type
Private Type tProjectInfo
Signature As Long
aObjectTable As Long
Null1 As Long
aStartOfCode As Long
aEndOfCode As Long
Flag1 As Long
ThreadSpace As Long
aVBAExceptionhandler As Long
aNativeCode As Long
oProjectLocation As Integer
Flag2 As Integer
Flag3 As Integer
OriginalPathName(MAX_PATH * 2) As Byte
NullSpacer As Byte
aExternalTable As Long
ExternalCount As Long
End Type
Public Type tAPIList
strLibraryName As String
strFunctionName As String
End Type
Type ExternalTable
flag As Long
aExternalLibrary As Long
End Type
Type ExternalLibrary
aLibraryName As Long
aLibraryFunction As Long
End Type
Private St_DosHeader As IMAGE_DOS_HEADER
Private St_OptHeader As IMAGE_OPTIONAL_HEADER
Private St_VBStHeader As VBStart_Header
Private St_VBHeader As VBHeader
Private St_PInfo As tProjectInfo
Private St_ETable As ExternalTable
Private St_ELibrary As ExternalLibrary
Private int_NTFile As Integer
Public Function ExtractApisEXEVB6(StrPath As String) As tAPIList()
On Error GoTo End_:
Dim Tmp_APIList() As tAPIList
Dim Strs As String * 1024
Dim lng_PosNull As Long
Dim Lng_index As Long
Dim Lng_CantApis As Long
Dim NBytes(1 To 10) As Byte
If Dir(StrPath, vbArchive) = "" Then Exit Function
int_NTFile = FreeFile
Open StrPath For Binary As int_NTFile
If LOF(int_NTFile) > 0 Then
Get int_NTFile, , St_DosHeader
Get int_NTFile, _
St_DosHeader.ExeHeaderPointer + &H19, _
St_OptHeader ' // 20 <-> LenB(Header) + 5 => &H19
Get int_NTFile, St_OptHeader.EntryPoint + 1, NBytes
With St_VBStHeader
.PushStartOpcode = NBytes(1)
.PushStartAddress = GetDWord(NBytes(2), NBytes(3), NBytes(4), NBytes(5))
.CallStartOpcode = NBytes(6)
.CallStartAddress = GetDWord(NBytes(7), NBytes(8), NBytes(9), NBytes(10))
End With
Get int_NTFile, _
(St_VBStHeader.PushStartAddress - St_OptHeader.ImageBase + 1), _
St_VBHeader
Get int_NTFile, _
St_VBHeader.aProjectInfo + 1 - St_OptHeader.ImageBase, _
St_PInfo
Lng_CantApis = 0
With St_PInfo
For Lng_index = 0 To .ExternalCount - 1
Get int_NTFile, _
.aExternalTable + 1 + (Lng_index * 8) - St_OptHeader.ImageBase, _
St_ETable
If .ExternalCount > 0 And St_ETable.flag <> 6 Then
With St_ETable
Get int_NTFile, _
.aExternalLibrary + 1 - St_OptHeader.ImageBase, _
St_ELibrary
With St_ELibrary
If .aLibraryFunction <> 0 Then
ReDim Preserve Tmp_APIList(Lng_CantApis)
Seek int_NTFile, .aLibraryFunction + 1 - St_OptHeader.ImageBase
With Tmp_APIList(Lng_CantApis)
Do
Get int_NTFile, , Strs
lng_PosNull = InStr(1, Strs, Chr(0), vbBinaryCompare) - 1
.strFunctionName = .strFunctionName & Mid$(Strs, 1, lng_PosNull)
Loop Until lng_PosNull > 0
End With
Seek int_NTFile, .aLibraryName + 1 - St_OptHeader.ImageBase
With Tmp_APIList(Lng_CantApis)
Do
Get int_NTFile, , Strs
lng_PosNull = InStr(1, Strs, Chr(0), vbBinaryCompare) - 1
.strLibraryName = .strLibraryName & Mid$(Strs, 1, lng_PosNull)
Loop Until lng_PosNull > 0
End With
Lng_CantApis = Lng_CantApis + 1
End If
End With
End With
End If
Next Lng_index
End With
End If
Close 1
ExtractApisEXEVB6 = Tmp_APIList
Exit Function
End_:
On Error GoTo 0
Call Err.Clear
End Function
Private Function GetDWord(ByVal B1 As Byte, ByVal B2 As Byte, ByVal B3 As Byte, ByVal B4 As Byte) As Double
GetDWord# = GetWord(B1, B2) + 65536# * GetWord(B3, B4)
End Function
Private Function GetWord(ByVal B1 As Byte, ByVal B2 As Byte) As Double
GetWord# = B1 + 256# * B2
End Function
ejemplo:
Sub Main()
Dim St_APIList() As tAPIList
Dim Lng_index As Variant
St_APIList = ExtractApisEXEVB6("c:\a.exe")
If (Not St_APIList) = -1 Then Exit Sub
Debug.Print "Funciones", "Librerias"
For Lng_index = LBound(St_APIList) To UBound(St_APIList)
With St_APIList(Lng_index)
Debug.Print .strFunctionName, .strLibraryName
End With
Next
End Sub
Dulce Infierno Lunar!¡.
Muchas Gracias BlackZeroX, es una lastima que no liste de cualquier ejecutable osea solo los de vb6, porque esta muy piola para ver que apis utilizan cada programa, yo tengo que andar con un editor hexadecimal y es medio hincha ir buscando la sección donde están y es incomodo.
seguramente se debe poder, pero esta medio complicado, por lo menos para mi.
Saludos.
Muy buen trabajo, hace tiempo estuve investigando sin exito, muchas gracias, ya puedo acabar un modulito que tengo a medias por ahi ;)
Cita de: LeandroA en 14 Octubre 2010, 05:58 AM
Muchas Gracias BlackZeroX, es una lastima que no liste de cualquier ejecutable osea solo los de vb6, porque esta muy piola para ver que apis utilizan cada programa, yo tengo que andar con un editor hexadecimal y es medio hincha ir buscando la sección donde están y es incomodo.
seguramente se debe poder, pero esta medio complicado, por lo menos para mi.
Saludos.
Si te interesa listar de cualquier ejecutable simplemente has de listar las funciones importadas en la IAT.
Se agradece el aporte, lo estaba buscando para un Proyectito :)
Cita de: LeandroA en 14 Octubre 2010, 05:58 AM
Muchas Gracias BlackZeroX, es una lastima que no liste de cualquier ejecutable osea solo los de vb6, porque esta muy piola para ver que apis utilizan cada programa, yo tengo que andar con un editor hexadecimal y es medio hincha ir buscando la sección donde están y es incomodo.
seguramente se debe poder, pero esta medio complicado, por lo menos para mi.
Saludos.
Para otros ejecutables puedes usar PEExplorer LeandroA, este programa te muestra las llamadas a la DLL así como las funciones, Procedimientos propios del programa, además tiene otras funciones más este programa.
SaluDOS!!!
Excelente código BlackZeroX...
Cita de LeandroA: yo tengo que andar con un editor hexadecimal y es medio hincha ir buscando la sección donde están y es incomodo
-Para los programas en Visual Basic 6 las API utilizadas las puedes encontrar con el excelente código de BlackZeroX o con programas específicos de VB como VB Decompiler Lite etc...
En los demás compiladores no suele ser necesario hacer esa búsqueda (lo digo de forma general...) ya que los programas en VB dependen de su librería y en la Tabla de importaciones sólo llaman a su librería MSVBVM60.dll. Sin embargo, lo normal con otros compiladores distintos de VB6 es que las API utilizadas estén directamente en la Tabla de import..(por ej. ASM, C, C++...) y esto se puede ver con cualquier programa específico de formato PE: como PE Explorer, PE Editor, Lord PE, Stud PE y largo etc... Y para extraer dicha tabla estoy convencido que hay muchos códigos...
No sé mucho del tema pero parece buena oportunidad para aprender !!!
"Grandioso" "Grandiabloso" ;)
Perdonden la igorancia (el que no pregunta no aprende) pero en en Pe Explorer en donde se fijan que api utiliza, alguna captura de imagen?
sAludos.
.
--> Boton Dependence Scanner
(http://infrangelux.sytes.net/FileX/view.php?InfraFile=/BlackZeroX/Imagenes/Foro%20Elhacker/PeExplorer%20Dependence%20Scanner.PNG) (http://infrangelux.sytes.net/FileX/index.php?dir=/BlackZeroX/Imagenes/Foro%20Elhacker&file=PeExplorer%20Dependence%20Scanner.PNG)
Dulce Infierno Lunar!¡.
no pero no es lo mismo,el Pe Explorer muestra las dependencias pero no las apis utilizadas es decir si abrimos iexplorer.exe nos mostrara advapi32.dll, kernel32.dll, gdi32.dll etc etc. pero no que apis en cuestión esta utilizando de todas esas dll, para los ejecutables de vb6 solo muestra msvbvm60.dll
ahora si abro el iexplorer.exe con un editor hexadecimal en la posición DF96 puedo ver
RegCloseKey, RegQueryValueExW, RegOpenKeyExW .etc
Saludos.
Creo que dices el Import Viewer ;D
(http://img810.imageshack.us/img810/2959/nuevaimagendemapadebitsh.jpg)
La tabla de importaciones.
En PE Explorer está como dice burbu_1 aquí:
(http://img710.imageshack.us/img710/4519/23633329.png)
Por ejemplo en el LorPE (programa gratuito que puedes descargar desde aquí:
http://www.woodmann.com/collaborative/tools/index.php/LordPE (http://www.woodmann.com/collaborative/tools/index.php/LordPE)), está aquí:
(http://img232.imageshack.us/img232/2223/53927326.png)
.
Me equivoque re Feo xP
Dulces Lunas!¡.
.
Ahora si, muchas gracias