 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 22.01.2012, 13:40 Titel: Abstract Dynamic Api Calling [Kein Declare mehr nötig] |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 24.01.2012, 17:13 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 24.01.2012, 17:39 Titel: |
|
|
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 |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 24.01.2012, 19:05 Titel: |
|
|
Thx fürs aufmerksam machen
Ich hoffe euch gefällt die Funktion trotzdem  |
|
Nach oben |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 25.01.2012, 12:06 Titel: |
|
|
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
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.01.2012, 14:07 Titel: |
|
|
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 |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 25.01.2012, 14:56 Titel: |
|
|
-Api Crypting
-Nerfiger zu debuggen wenn mans noch bischen bearbeitet. (RCE -Technisch)
-Leicheres laden von Dlls und der Funktionen... |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.01.2012, 15:32 Titel: |
|
|
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 (im Gegenteil) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 25.01.2012, 15:41 Titel: |
|
|
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
Wenn ich zeit hab dann code ich mal ein Beispiel dazu  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 25.01.2012, 19:47 Titel: |
|
|
Wozu sollte man die API-Calls verschlüsseln? _________________ Milch ftw  |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 25.01.2012, 21:49 Titel: |
|
|
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 |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 26.01.2012, 10:16 Titel: |
|
|
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 |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 26.01.2012, 18:24 Titel: |
|
|
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!  |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 15.02.2012, 13:48 Titel: |
|
|
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 |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 16.02.2012, 15:54 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|