elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
11 Octubre 2008, 17:51  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++
| | |-+  Api's en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Api's en C  (Leído 351 veces)
Krackwar

Desconectado Desconectado

Mensajes: 851


Odio al hombre que rie xD


Ver Perfil
Api's en C
« en: 24 Junio 2008, 04:47 »

Hola , e estado aprendiendo C(empese hoy) y ya se ocupar las librerias que contienen las api's declaradas , pero quiero saber declarar las api's ya que encuentro que por ejemplo windows.h agrande mucho el .exe.
En línea

[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
Freeze.

Desconectado Desconectado

Mensajes: 2.455

FireSoft


Ver Perfil WWW
Re: Api's en C
« Respuesta #1 en: 24 Junio 2008, 04:56 »

Pues tienes que usar LoadLibrary con el nombre de la DLL ejemplo LoadLibrary("user32") lo que te retorne lo usas en el primer parametro de GetProcAddress y el 2do parametro lo rellenas con el nombre de la api ejemplo GetProcAddress (retvarLoadLibrary,"OpenProcess").

Creo que es de esta manera ;)

Sino aca te pongo un ejemplo de la Api-guide que acabo de conseguir:

Código
Create a new project and add this code to Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
   On Error Resume Next
   'KPD-Team 1999
   'URL: http://www.allapi.net/
   'E-Mail: KPDTeam@Allapi.net
   'We're going to call an API-function, without declaring it!
   Dim lb As Long, pa As Long
   'map 'user32' into the address space of the calling process.
   lb = LoadLibrary("user32")
   'retrieve the address of 'SetWindowTextA'
   pa = GetProcAddress(lb, "SetWindowTextA")
   'Call the SetWindowTextA-function
   CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
   'unmap the library's address
   FreeLibrary lb
End Sub
 

Esta en VB pero es fácil de traducir.

Edito: De todas maneras no veo como puedes decir que al incluir windows.h te aumenta el peso de tu ejecutable :xD
« Última modificación: 24 Junio 2008, 05:03 por Freeze. » En línea

Un nuevo CMS, pruebalo:


Krackwar

Desconectado Desconectado

Mensajes: 851


Odio al hombre que rie xD


Ver Perfil
Re: Api's en C
« Respuesta #2 en: 24 Junio 2008, 05:12 »

Pues tienes que usar LoadLibrary con el nombre de la DLL ejemplo LoadLibrary("user32") lo que te retorne lo usas en el primer parametro de GetProcAddress y el 2do parametro lo rellenas con el nombre de la api ejemplo GetProcAddress (retvarLoadLibrary,"OpenProcess").

Creo que es de esta manera ;)

Sino aca te pongo un ejemplo de la Api-guide que acabo de conseguir:

Código
Create a new project and add this code to Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
   On Error Resume Next
   'KPD-Team 1999
   'URL: http://www.allapi.net/
   'E-Mail: KPDTeam@Allapi.net
   'We're going to call an API-function, without declaring it!
   Dim lb As Long, pa As Long
   'map 'user32' into the address space of the calling process.
   lb = LoadLibrary("user32")
   'retrieve the address of 'SetWindowTextA'
   pa = GetProcAddress(lb, "SetWindowTextA")
   'Call the SetWindowTextA-function
   CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
   'unmap the library's address
   FreeLibrary lb
End Sub
 

Esta en VB pero es fácil de traducir.

Edito: De todas maneras no veo como puedes decir que al incluir windows.h te aumenta el peso de tu ejecutable :xD
Y como obtengo loadlibrary si no la tengo declarada  :xD :xD 697 KB encuentro que es mucho para este code:
]
Código
#include <windows.h>
int main()
{
 HWND resp;
//-->variables para cambiar el texto del boton
      char*Dad="Shell_TrayWnd";
     char*Child="Button";
     char*texto="rata";//<---------Texto a poner maximo 5 caracteres
 
 
 
     resp=FindWindow(Dad,0);
resp=FindWindowEx(resp,0,Child,0);
 
 
       SetWindowText(resp,texto);
}
 
 
 
Lo acabo de hacer yo  :) .
En línea

[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
Freeze.

Desconectado Desconectado

Mensajes: 2.455

FireSoft


Ver Perfil WWW
Re: Api's en C
« Respuesta #3 en: 24 Junio 2008, 05:27 »

A mi me aparecen 16 Kbs :P
En línea

Un nuevo CMS, pruebalo:


Krackwar

Desconectado Desconectado

Mensajes: 851


Odio al hombre que rie xD


Ver Perfil
Re: Api's en C
« Respuesta #4 en: 24 Junio 2008, 05:28 »

A mi me aparecen 16 Kbs :P
Igual es mucho y a mi por que me pesa tanto?
En línea

[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
Freeze.

Desconectado Desconectado

Mensajes: 2.455

FireSoft


Ver Perfil WWW
Re: Api's en C
« Respuesta #5 en: 24 Junio 2008, 05:32 »

No te acostumbres a los pocos bytes del ASM :xD

Yo estoy compilando con el Dev C++ no se tú. :P A mi una aplicación vacia me pesa 15 KB :D
En línea

Un nuevo CMS, pruebalo:


E0N
Lab &
Colaborador

Conectado Conectado

Mensajes: 2.682



Ver Perfil WWW
Re: Api's en C
« Respuesta #6 en: 24 Junio 2008, 11:05 »

No es cuestión de librerías, es cuestión de como te configures el linker, mira este código que me pasó Robokop hace tiempo:

Citar
#pragma optimize("gsy",on)
#pragma comment(linker,"/RELEASE")
#pragma comment(linker,"/ENTRY:PuntoN")
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/MERGE:.reloc=.data")
#pragma comment(linker,"/SECTION:.text,EWR /IGNORE:4078")
#pragma comment(linker,"/FILEALIGN:0x200")
#pragma comment(linker,"/subsystem:windows")

#include <windows.h>

void PuntoN()
{
       MessageBox(0,"Programa de 1 kb","Lol",0);
}

Pesa 1KB, que es un peso razonable. O también puedes hacer estó, que lo posteó Eternal Idol:

Poner el cpp en C:\Archivos de programa\Microsoft Visual Studio\VC98\Bin y escribir en la consola: (haces cd para irte hasta esa ruta  :¬¬ )

Código:
cl /c /O1 iny.cpp

link iny.obj /NODEFAULTLIB kernel32.lib /entry:main /align:4

Todo eso se lo puedes poner al linker del VC++ en la configuración de tu proyecto para no tener que andar tirando de consola, y no te olvides de compilar en release, no en debug, que eso solo ya resta bastante peso (y de googlear :P)

Salu2
En línea
Karman

Desconectado Desconectado

Mensajes: 237



Ver Perfil WWW
Re: Api's en C
« Respuesta #7 en: 24 Junio 2008, 13:46 »

este es una versión parecida pero compilada con el DevCpp (mingw) y pesa 2 kb...

Código
#include <windows.h>
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nFunsterStil){
 MessageBox(0,"Programa de 2 kb","Lol",0);
 return 0;
}
 

para hacerlo tenés que ir a proyecto->opciones->compilador->linker y activar las últimas 2 opciones (no usar librerías standares y tira ejecutable), y luego incluir manualmente la librería "libuser32.a" en argumentos del compilador... quizás pueda hacerse que pese menos todavía, pero requeriría generar el makefile a mano...

S2
En línea

Krackwar

Desconectado Desconectado

Mensajes: 851


Odio al hombre que rie xD


Ver Perfil
Re: Api's en C
« Respuesta #8 en: 24 Junio 2008, 16:41 »

este es una versión parecida pero compilada con el DevCpp (mingw) y pesa 2 kb...

Código
#include <windows.h>
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nFunsterStil){
 MessageBox(0,"Programa de 2 kb","Lol",0);
 return 0;
}
 

para hacerlo tenés que ir a proyecto->opciones->compilador->linker y activar las últimas 2 opciones (no usar librerías standares y tira ejecutable), y luego incluir manualmente la librería "libuser32.a" en argumentos del compilador... quizás pueda hacerse que pese menos todavía, pero requeriría generar el makefile a mano...

S2
Tu ejemplo me da 17,2 KB  de peso , pero no hay en C algo como el :
Código:
data import
library kernel32,'KERNEL32.DLL'

import kernel32,\
 alias,'nombre de la api'
end data
??? solo quiero saber declarar api's manualmente nada de otro mundo el peso del ejecutable no me importa tanto es mas que quiero saber eso de declarar api's , ya que la verdad estoy aprendiendo C para pasar un code que tengo en C a otro lenguaje  :P .
PD: Antes de venir a joder busque en google y siempre asian referencias a .h .

Edit:
No te acostumbres a los pocos bytes del ASM :xD

Yo estoy compilando con el Dev C++ no se tú. :P A mi una aplicación vacia me pesa 15 KB :D
15 kb es mucho peso para una aplicaci'on vacia , por lo que yo tengo entendido en C se podian hacer aplicaciones de menos de 1kb
« Última modificación: 24 Junio 2008, 18:48 por Krackwar » En línea

[ìmg]http://img523.imageshack.us/img523/4146/dibujozx1.png [/img]
Karman

Desconectado Desconectado

Mensajes: 237



Ver Perfil WWW
Re: Api's en C
« Respuesta #9 en: 24 Junio 2008, 20:40 »

Tu ejemplo me da 17,2 KB  de peso...

No se que parámetro te debe faltar pero a mi con mingw 3.4 me da 2 kb... no habrás desactivado el uso de las librerías standares o estará en modo debug(??)

Citar
gcc.exe -c main.c -o main.o -I"D:/DevCpp/include"   -nostdlib
gcc.exe main.o  -o "genericoN.exe" -L"D:/DevCpp/lib" -mwindows ../lib/libuser32.a  -nostdlib -s
total de errores: 0
tamaño salida: 2048 Bytes (2 KB)

es más, supongo que se podría hacer que pese 1 kb si se le dijera que utilice una única sección:
Citar
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/MERGE:.reloc=.data")

pero esta parte desconozco como se hace con este compilador... y no tengo ganas de investigar... je

Lo único que no entiendo es que drama tienen con las cabeceras??? que un h defina 300 funciones no quiere decir que se vayan a compilar con el programa... las H lo único que hacen es definir el formato de las funciones / tipos, lo que define el peso del programa son las instrucciones que se ejecutan, los programas que dicen que no pesan menos de 17 kb es porque el compilador (por defecto) incluye una serie de funciones (comprueba versión de windows, administra argumentos enviados, etc), por eso, deshabilitando esa parte (como lo puse) ya se obtiene un ejecutable puro...

Además... tampoco para exagerar... no podes hacer aplicaciones de menos de 1 kb...


S2
« Última modificación: 24 Junio 2008, 20:57 por Karman » En línea

Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC
Free counter and web stats