Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Abstract Dynamic Api Calling [Kein Declare mehr nötig]

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 22.01.2012, 13:40    Titel: Abstract Dynamic Api Calling [Kein Declare mehr nötig] Antworten mit Zitat

Hi wollte euch mal meinen kleinen Code zeigen der es ermöglicht dynamisch apis zu callen ohne dabei auf asm coding zurück greifen zu müssen.
Noch einen Vorteil hat es da der Api Aufrufcode erst per Laufzeit und bei benutzung generiert und ausgeführt wird.
Es ist auch möglich seine Api Aufrufe auf einfache Art und Weise zu verschlüsseln.

Code:

'#############################################################################################
'Abstract Dynamic Api Calling for Freebasic
'Coder: C3lt1c
'visit: http://drunken-nanomites.org for more stuff
'
'Mit der dynamic_api_call Funktion ist es möglich eine Api ohne deklarierung aufzurufen!
'Noch einen Vorteil hat man indem die Api zur Laufzeit erst geladen und ausgeführt wird
'und das auf eine abstrakte Art und Weise :)
'
'Zur Benutzung
'dynamic_api_call (name der dll, name der funktion,anzahl der parameter der funktion,parameter,...)
'die parameter werden in hexstring angegeben also sie sollten in diesem Format sein:
'00112233 deshalb solltet ihr immer im Aufruf die Funktion HEX mit benutzen...


#Define WIN_INCLUDEALL
#Include "windows.bi

Declare Function string2asm_opcode(opcodes As String) As String
Declare Function opcodez_reverse(opcodez As String) As String
Declare Function add_push(opcodez As string) As String
Declare Function call_api(push_data As String,p_api As FARPROC) As Long

Declare Function dynamic_api_call Cdecl(ByVal As string,ByVal As String,ByVal As Integer, ...) As Long


Print "Abstract Dynamic Api Calling for Freebasic"
Print "Coder: C3lt1c
Print
Print "Test App to show msgbox's and run Calc.exe"
Print



Dim ret As Long


ret = dynamic_api_call("User32.dll", "MessageBoxA",4,"00",Hex(StrPtr("Soll der Calc gestartet werden?")),Hex(StrPtr("Frage")),Hex(MB_YESNO))

If ret = 6 Then
ret = dynamic_api_call("Shell32.dll","ShellExecuteA",6,"00",Hex(StrPtr("open")),Hex(StrPtr("calc.exe")),"00","00",Hex(SW_SHOW))
EndIf

ret = dynamic_api_call("User32.dll", "MessageBoxA",4,"00",Hex(StrPtr("C3lt1c Rockzzz")),Hex(StrPtr("Info")),Hex(MB_OK))


Sleep
End







'Die Dynamic_api_call funktion
Function dynamic_api_call Cdecl(ByVal dll As string,ByVal api As String,ByVal params_count As Integer , ...) As Long
   Dim As Any Ptr Arg = va_first()
   Dim As String PushArray(params_count-1)
   
   Dim pdll As HMODULE
   Dim papi As FARPROC
   Dim asm_data As String
   Dim asm_data_ptr As Byte Ptr
   Dim reg_eax As Long
   
   For i As Integer = 0 To params_count-1 'auslesen der params
   PushArray(i)=*va_arg( Arg, ZString Ptr )
   
   Arg = va_next( Arg, ZString Ptr )
   Next
   
   'dynamische laden der api
   pdll = LoadLibrary(dll)
   papi = GetProcAddress(pdll,api)

   Print Hex(pdll) & " " & dll
   Print Hex(papi) & " " & api
   

   
   For i As Integer = UBound(PushArray) To 0 Step - 1
      asm_data += add_push(PushArray(i))   
   Next
   
 
      
   reg_eax = call_api(asm_data,papi)
   
   Print "Return: " & reg_eax
   print
   
   Return reg_eax

End Function




'diese funktion verbindet die push's und startet die api :)
Function call_api(push_data As String, p_api As FARPROC) As Long
   Dim call_api_asm As String
   Dim run_data_ptr As Byte Ptr
   Dim reg_eax As Long
   
   call_api_asm = Chr(&hB8) 'mov eax,_______
   call_api_asm = call_api_asm & string2asm_opcode(opcodez_reverse(Hex(p_api))) ',offsets
   call_api_asm = call_api_asm & string2asm_opcode("FFD0") 'call eax
   call_api_asm = call_api_asm & Chr(&hC3) 'ret
   
   push_data = push_data & call_api_asm
   
   run_data_ptr = StrPtr(push_data)
 
   'springe zu unserem shellcode der alle offsets pushed und mit call eax die api ausführt
   Asm
   mov eax, [run_data_ptr]
   Call eax
   mov [reg_eax],eax
   End Asm
   
   Return reg_eax 'der rückgabe wert der api
   
   
End Function

'Diese Funktion fügt die push's ein
Function add_push(opcodez As string) As String
   Dim temp As String
   Dim zer0 As String
   
   'bei short code ist der push opcode ja anders deshalb wirds geändert.
   If Len(opcodez) < 3 Then
      
      'falls zer0's fehlen werden sie angehangen
      If Len(opcodez) < 2 Then
         For i As Integer = 1 To (2 - Len(opcodez))
            zer0 = zer0 & "0"
         Next
      EndIf
      
      temp = Chr(&h6A) & string2asm_opcode(zer0 & opcodez)
   Else
      
      'falls zer0's fehlen werden sie angehangen
      If Len(opcodez) < 8 Then
         For i As Integer = 1 To (8 - Len(opcodez))
            zer0 = zer0 & "0"
         Next
      EndIf
   
      temp = Chr(&h68) & string2asm_opcode(opcodez_reverse(zer0 & opcodez))
   EndIf
   
   Return temp
   
End Function


'String2asm_opcode funktion :)
'Durch meine string2asm_opcode funktion ist es möglich in freebasic einfach Opcodez
'in einem string anzugeben zb 33C0C3 = wird automatisch in xor eax,eax ret umgewandelt
'und kann in einer normalen string variablen behandelt werden.
'Damit spart man sich as H& und man kann es ja auch besser verschlüsseln da es ja erst
'zur Laufzeit in ASM-Opcodez umgewandelt wird.
Function string2asm_opcode(opcodes As String) As String
Dim hx_p As Byte Ptr
Dim hx_v As Integer
Dim opcode As String
Dim temp As String

For i As Integer = 1 To Len(opcodes) Step 2
opcode = ""
opcode = Mid(opcodes,i,2)
hx_p = StrPtr(opcode)

Asm
   Xor eax,eax
   Xor edx,edx
   mov ecx,[hx_p]
   htodw_loop:
         mov al,[ecx]
         inc ecx
         sub   al,&h30
         js   htodw_endloop
         shl   edx,4
         cmp   al,9
         jbe   htodw_addnumber
         sub   al,&h27
         jns   htodw_addnumber
         add al,&h20
         htodw_addnumber:    
         xor   dl,al
         jmp   htodw_loop
         htodw_endloop:     
         mov   eax,edx
         mov [hx_v],al
End Asm

temp += Chr(hx_v)

Next

Return temp
End Function


'Diese Funktion ist dafür da die Opcodez richtig auszurichten.
Function opcodez_reverse(opcodez As String) As String
Dim temp As String

For i As Integer = Len(opcodez)-1  To 1 Step - 2
temp = temp & Mid(opcodez,i,2)
Next

Return temp

End Function

[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 24.01.2012, 17:13    Titel: Antworten mit Zitat

Code:
  'dynamische laden der api
   pdll = LoadLibrary(dll)


Du solltest besser...

Code:
pdll = GetModuleHandle(dll)
If pdll = NULL Then pdll = LoadLibrary(dll)


verwenden, um den internen Counter nicht bei jedem API Call um 1 zu erhöhen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 24.01.2012, 17:39    Titel: Antworten mit Zitat

Wird er nicht, wenn das Modul bereits geladen ist, liefert LoadLibrary den bereits existenten Handle zurück.

/edit: Missverständnis. Der Reference Counter wird erhöht, der Handle bleibt davon aber unberührt.
Zitat:
The system maintains a per-process reference count on all loaded modules. Calling LoadLibrary increments the reference count. Calling the FreeLibrary or FreeLibraryAndExitThread function decrements the reference count. The system unloads a module when its reference count reaches zero or when the process terminates (regardless of the reference count).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 24.01.2012, 19:05    Titel: Antworten mit Zitat

Thx fürs aufmerksam machen lächeln

Ich hoffe euch gefällt die Funktion trotzdem grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 25.01.2012, 12:06    Titel: Antworten mit Zitat

Ich habe einen kleinen Fehler entdeckt.
Und zwar geht es um die add push funktion die ja bei H&80 ja die 128 grenze überschreitet und ein dword gesetzt werden muss lächeln

Hier die Bugfreie Version:


Code:

'#############################################################################################
'Abstract Dynamic Api Calling for Freebasic
'Coder: C3lt1c
'visit: http://drunken-nanomites.org for more stuff
'
'Mit der dynamic_api_call Funktion ist es möglich eine Api ohne deklarierung aufzurufen!
'Noch einen Vorteil hat man indem die Api zur Laufzeit erst geladen und ausgeführt wird
'und das auf eine abstrakte Art und Weise :)
'
'Zur Benutzung
'dynamic_api_call (name der dll, name der funktion,anzahl der parameter der funktion,parameter,...)
'die parameter werden in hexstring angegeben also sie sollten in diesem Format sein:
'00112233 deshalb solltet ihr immer im Aufruf die Funktion HEX mit benutzen...


#Define WIN_INCLUDEALL
#Include "windows.bi

Declare Function string2asm_opcode(opcodes As String) As String
Declare Function opcodez_reverse(opcodez As String) As String
Declare Function add_push(opcodez As string) As String
Declare Function call_api(push_data As String,p_api As FARPROC) As Long

Declare Function dynamic_api_call Cdecl(ByVal As string,ByVal As String,ByVal As Integer, ...) As Long


Print "Abstract Dynamic Api Calling for Freebasic"
Print "Coder: C3lt1c
Print
Print "Test App to show msgbox's and run Calc.exe"
Print



Dim ret As Long


ret = dynamic_api_call("User32.dll", "MessageBoxA",4,"00",Hex(StrPtr("Soll der Calc gestartet werden?")),Hex(StrPtr("Frage")),Hex(MB_YESNO))

If ret = 6 Then
ret = dynamic_api_call("Shell32.dll","ShellExecuteA",6,"00",Hex(StrPtr("open")),Hex(StrPtr("calc.exe")),"00","00",Hex(SW_SHOW))
EndIf

ret = dynamic_api_call("User32.dll", "MessageBoxA",4,"00",Hex(StrPtr("C3lt1c Rockzzz")),Hex(StrPtr("Info")),Hex(MB_OK))


Sleep
End







'Die Dynamic_api_call funktion
Function dynamic_api_call Cdecl(ByVal dll As string,ByVal api As String,ByVal params_count As Integer , ...) As Long
   Dim As Any Ptr Arg = va_first()
   Dim As String PushArray(params_count-1)
   
   Dim pdll As HMODULE
   Dim papi As FARPROC
   Dim asm_data As String
   Dim asm_data_ptr As Byte Ptr
   Dim reg_eax As Long
   
   For i As Integer = 0 To params_count-1 'auslesen der params
   PushArray(i)=*va_arg( Arg, ZString Ptr )
   
   Arg = va_next( Arg, ZString Ptr )
   Next
   
   'dynamische laden der api
   pdll = GetModuleHandle(dll)
   If pdll = NULL Then pdll = LoadLibrary(dll)
   papi = GetProcAddress(pdll,api)

   Print Hex(pdll) & " " & dll
   Print Hex(papi) & " " & api
   

   
   For i As Integer = UBound(PushArray) To 0 Step - 1
      asm_data += add_push(PushArray(i))   
   Next
   
 
      
   reg_eax = call_api(asm_data,papi)
   
   Print "Return: " & Hex(reg_eax)
   print
   
   Return reg_eax

End Function




'diese funktion verbindet die push's und startet die api :)
Function call_api(push_data As String, p_api As FARPROC) As Long
   Dim call_api_asm As String
   Dim run_data_ptr As Byte Ptr
   Dim reg_eax As Long
   
   call_api_asm = Chr(&hB8) 'mov eax,_______
   call_api_asm = call_api_asm & string2asm_opcode(opcodez_reverse(Hex(p_api))) ',offsets
   call_api_asm = call_api_asm & string2asm_opcode("FFD0") 'call eax
   call_api_asm = call_api_asm & Chr(&hC3) 'ret
   
   push_data = push_data & call_api_asm
   
   run_data_ptr = StrPtr(push_data)
 
 
   'springe zu unserem shellcode der alle offsets pushed und mit call eax die api ausführt
   Asm
   mov eax, [run_data_ptr]
   Call eax
   mov [reg_eax],eax
   End Asm
   
   Return reg_eax 'der rückgabe wert der api
   
   
End Function

'Diese Funktion fügt die push's ein
Function add_push(opcodez As string) As String
   Dim temp As String
   Dim zer0 As String
   Dim hex_size As Integer
   
   hex_size = val("&h" & opcodez)
   
   'bei short code ist der push opcode ja anders deshalb wirds geändert.
   If Len(opcodez) < 3 And hex_size < 129  Then
      
      'falls zer0's fehlen werden sie angehangen
      If Len(opcodez) < 2 Then
         For i As Integer = 1 To (2 - Len(opcodez))
            zer0 = zer0 & "0"
         Next
      EndIf
      
      temp = Chr(&h6A) & string2asm_opcode(zer0 & opcodez)
   Else
      
      'falls zer0's fehlen werden sie angehangen
      If Len(opcodez) < 8 Then
         For i As Integer = 1 To (8 - Len(opcodez))
            zer0 = zer0 & "0"
         Next
      EndIf
   
      temp = Chr(&h68) & string2asm_opcode(opcodez_reverse(zer0 & opcodez))
   EndIf
   
   Return temp
   
End Function


'String2asm_opcode funktion :)
'Durch meine string2asm_opcode funktion ist es möglich in freebasic einfach Opcodez
'in einem string anzugeben zb 33C0C3 = wird automatisch in xor eax,eax ret umgewandelt
'und kann in einer normalen string variablen behandelt werden.
'Damit spart man sich as H& und man kann es ja auch besser verschlüsseln da es ja erst
'zur Laufzeit in ASM-Opcodez umgewandelt wird.
Function string2asm_opcode(opcodes As String) As String
Dim hx_p As Byte Ptr
Dim hx_v As Integer
Dim opcode As String
Dim temp As String
Dim tt As String = "s2o"

For i As Integer = 1 To Len(opcodes) Step 2
opcode = ""
opcode = Mid(opcodes,i,2)
hx_p = StrPtr(opcode)

Asm
   Xor eax,eax
   Xor edx,edx
   mov ecx,[hx_p]
   htodw_loop:
         mov al,[ecx]
         inc ecx
         sub   al,&h30
         js   htodw_endloop
         shl   edx,4
         cmp   al,9
         jbe   htodw_addnumber
         sub   al,&h27
         jns   htodw_addnumber
         add al,&h20
         htodw_addnumber:    
         xor   dl,al
         jmp   htodw_loop
         htodw_endloop:     
         mov   eax,edx
         mov [hx_v],al
End Asm

temp += Chr(hx_v)

Next

Return temp
End Function


'Diese Funktion ist dafür da die Opcodez richtig auszurichten.
Function opcodez_reverse(opcodez As String) As String
Dim temp As String

For i As Integer = Len(opcodez)-1  To 1 Step - 2
temp = temp & Mid(opcodez,i,2)
Next

Return temp

End Function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.01.2012, 14:07    Titel: Antworten mit Zitat

Hmm,
irgendwie habe ich den Sinn dieses Programms nicht verstanden?

Welche Vorteile hat das Programm gegenüber einfacher Api-Aufrufe?
z.B.
Code:
#Include Once "windows.bi"
If MessageBox(0, "Soll der Rechner gestartet werden?", _
"Frage", MB_YESNO) <> 6 Then End
Shell "calc.exe"
MessageBox 0, "Volta machts einfacher!", "Info", MB_OK

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 25.01.2012, 14:56    Titel: Antworten mit Zitat

-Api Crypting
-Nerfiger zu debuggen wenn mans noch bischen bearbeitet. (RCE -Technisch)
-Leicheres laden von Dlls und der Funktionen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.01.2012, 15:32    Titel: Antworten mit Zitat

C3lt1c hat Folgendes geschrieben:
-Api Crypting
-Nerfiger zu debuggen wenn mans noch bischen bearbeitet. (RCE -Technisch)
kaum, alle Infos sind leicht lesbar
Code:
dynamic_api_call("Shell32.dll","ShellExecuteA",6,"00",Hex(StrPtr("open")),Hex(StrPtr("calc.exe")),"00","00",Hex(SW_SHOW))

'.section .data
'.balign 4
'_Lt_0004:   .ascii   "Shell32.dll\0"
'.balign 4
'_Lt_0005:   .ascii   "ShellExecuteA\0"
'.balign 4
'_Lt_0006:   .ascii   "00\0"
'.balign 4
'_Lt_0007:   .ascii   "open\0"
'.balign 4
'_Lt_0009:   .ascii   "calc.exe\0"


C3lt1c hat Folgendes geschrieben:
-Leiche res laden von Dlls und der Funktionen...

nö, sehe ich nicht grinsen (im Gegenteil)
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 25.01.2012, 15:41    Titel: Antworten mit Zitat

Das ist klar das man diese in der Data Section auffindet!

Mit Api Crypting war gemeint das man die Strings verschlüsseln kann wenn man will.
2
dynamic_api_call("decrypt("fkjdjglg")",decrypt("erkfnrjke"),6,decrypt("blalbla"),Hex(StrPtr(decrypt(blalba))),Hex(StrPtr(decrypt(blalba))),"00","00",Hex(decrypt(blalba)))


function decrypt("string")
...
...
..

Gut man könnte das ganze noch mit einer in asm geschriebenen Polymorphe Trashcode Engine und auch mit ner Inline Vm_Engine noch unkenntlicher machen...

Desweiteren wäre es ja auch noch möglich über Selfmodding Code nachzudenken zwinkern

Wenn ich zeit hab dann code ich mal ein Beispiel dazu lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.01.2012, 19:47    Titel: Antworten mit Zitat

Wozu sollte man die API-Calls verschlüsseln?
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 25.01.2012, 21:49    Titel: Antworten mit Zitat

Ich verstehs auch nicht ganz. API-Aufrufe zu verschleieren halte ich für unschön. Da würde ich doch eher mit einer einfachen VM rangehen, das ist eine wesentlich elegantere Lösung imho...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 26.01.2012, 10:16    Titel: Antworten mit Zitat

zum virenschreiben sicher nicht unpraktisch, oder?
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 26.01.2012, 18:24    Titel: Antworten mit Zitat

Zitat:
zum virenschreiben sicher nicht unpraktisch, oder?


Naja dazu wurde es nicht ausgelegt.

Ich hatte mir diese Funktion für meinen kleinen Debugger geschrieben.

Da ja Skiddy's und auch Malware diese Api Reihenfolge benutzen, kam es sehr oft zu AV-Fehl-Meldungen. Da es mich sehr aufgeregt hat wenn ich mein Tool compilt hatte und es sozusagen als Virus Declariert wurde. Daraufhin habe ich mir diese Funktion gecodet damit es keine Fehlmeldungen mehr gibt und mein Tool nicht als Malware Declariert wird.

Aber was man mit diesem Code betreibt ist jedem selbst überlassen! cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 15.02.2012, 13:48    Titel: Antworten mit Zitat

Hm, es hat bei mir in so einem Fall meistens gereicht, z.B. aus...

Code:
MessageBox(NULL, "Eine Box", "Box", MB_OK)


...das hier zu machen:

Code:
Dim MessageBox_ As Function(As HWND, As LPCTSTR, As LPCTSTR, As UINT) As Integer = GetProcAddress(GetModuleHandle("user32"), "MessageBoxA")
MessageBox_(NULL, "Eine Box", "Box", MB_OK)


Zuletzt bearbeitet von Cherry am 17.02.2012, 01:53, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 16.02.2012, 15:54    Titel: Antworten mit Zitat

Ist auch ne Möglichkeit.
Ich habe mir nur aus fun diese Abstrakte Variante geschrieben.
_________________
+++Chars are my Color and Codes my Art+++

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz