purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 10:34 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: TLS Callback и Purebasic
СообщениеДобавлено: Ср фев 26, 2014 7:40 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Про существование данной возможности загрузчика Windows напомнил этот вопрос: viewtopic.php?p=20869#p20869
В общем что есть TLS можно почитать в гугле, но в кратце, TLS callback - кусок кода в программе, выполняемый до передачи управления на точку входа программы. Данная особенность используется в некоторых протекторах, дабы отучить от отладки самых маленьких хацкеров.
В общем прикручиваем коллбэк к нашему приложению на васике...
Пример кода нашего приложения program.exe. Влепил 2 коллбэка, что бы показать, что там идёт массив колбэков, хотя можно поставить и один. NULL - конец массива колбэков.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
MessageRequester("", "I`m EntryPoint! I`m run first! I think...")
End
 
Structure TLS
  StartAddressOfRawData.l
  EndAddressOfRawData.l
  AddressOfIndex.l
  AddressOfCallBacks.l
  v0.l
  callback.l[0]; NULL - end of Array Of Callbacks
EndStructure
 
Procedure TLS_Callback(handle, reason, reserved)
  Select reason
    Case #DLL_PROCESS_ATTACH
      MessageRequester("", "Hello from TLS callback!")
  EndSelect
EndProcedure
 
Procedure TLS_Callback2(handle, reason, reserved)
  Select reason
    Case #DLL_PROCESS_ATTACH
      MessageRequester("", "Hello from TLS callback 2 !")
  EndSelect
EndProcedure
 
DataSection
  TLS:
 Data.l ?a
  Data.l ?a
  Data.l ?a
  Data.l ?c
  a:
 Data.l 0
  c:
 Data.l @TLS_Callback() ; Callback number 1
  Data.l @TLS_Callback2() ; Callback number 1
  Data.l 0
EndDataSection


Компилер пурика конечно плевал, что вы там компилите в секцию данных, никакой инфы в хидере вашего program.exe не будет, и, при попытке запустить приложение вы увидите единственное сообщение I`m EntryPoint! I`m run first! I think.... Указатель на TLS структуру и её размер находится в девятом элементе массива IMAGE_DATA_DIRECTORY. Можно эти значения вбить в ручную, или через какой нибудь PE редактор, а можно использовать приведённый код ниже для поиска структуры TLS по сигнатуре в .data секции вашей program.exe
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Structure TLS
  StartAddressOfRawData.l
  EndAddressOfRawData.l
  AddressOfIndex.l
  AddressOfCallBacks.l
  v0.l
  callback.l[0]; NULL - end of Array Of Callbacks
EndStructure
 
file.s = OpenFileRequester("Select file for enable TLS callback", "", "EXE or DLL|*.exe;*.dll", 0)
If file = ""
  End
EndIf
 
If Not ReadFile(0, file)
  End
EndIf
 
f_size = Lof(0)
If f_size <=0
  End
EndIf
 
*file = AllocateMemory(f_size)
 
If Not *file
  End
EndIf
 
ReadData(0, *file, MemorySize(*file))
CloseFile(0)
 
*idh.IMAGE_DOS_HEADER = *file
#SIZE_OF_IMAGE_NT_SIGNATURE = SizeOf(LONG)
*ifh.IMAGE_FILE_HEADER = *idh + *idh\e_lfanew + #SIZE_OF_IMAGE_NT_SIGNATURE
*ioh.IMAGE_OPTIONAL_HEADER = *ifh + SizeOf(IMAGE_FILE_HEADER)
*ish.IMAGE_SECTION_HEADER = *ioh + *ifh\SizeOfOptionalHeader
 
For i = 1 To *ifh\NumberOfSections
  If PeekS(@*ish\SecName) = ".data"
    Break
  EndIf
  *ish + SizeOf(IMAGE_SECTION_HEADER)
Next
 
*start.TLS = *file + *ish\PointerToRawData
 
Repeat
  If *start\StartAddressOfRawData = *ioh\ImageBase + *ish\VirtualAddress + ((*start-*file) - *ish\PointerToRawData) + OffsetOf(TLS\v0)
    If *start\EndAddressOfRawData = *ioh\ImageBase + *ish\VirtualAddress + ((*start-*file) - *ish\PointerToRawData) + OffsetOf(TLS\v0)
      If *start\AddressOfIndex = *ioh\ImageBase + *ish\VirtualAddress + ((*start-*file) - *ish\PointerToRawData) + OffsetOf(TLS\v0)
        If *start\AddressOfCallBacks = *ioh\ImageBase + *ish\VirtualAddress + ((*start-*file) - *ish\PointerToRawData) + OffsetOf(TLS\callback)
          If *start\v0 = 0
            If *start\callback <> 0
              tls_VirtualAddress = *ish\VirtualAddress + (*start - *file) - *ish\PointerToRawData
              collback_count = 0
              While *start\callback <> 0
                collback_count + 1
                *start + SizeOf(LONG)
              Wend
              tls_Size = SizeOf(TLS) + (collback_count) * SizeOf(LONG)
              Break
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
  *start + 1
Until *start > (*file + *ish\PointerToRawData + *ish\SizeOfRawData - (SizeOf(TLS)))
 
If collback_count > 0
  MessageRequester("", "Found " + Str(collback_count) + " callbacks")
  *ioh\DataDirectory[9]\VirtualAddress = tls_VirtualAddress
  *ioh\DataDirectory[9]\Size = tls_Size
 
  out_file.s = GetPathPart(file) + GetFilePart(file, #PB_FileSystem_NoExtension) + ".TLS." + GetExtensionPart(file)
  If CreateFile(0, out_file)
    WriteData(0, *file, MemorySize(*file))
    CloseFile(0)
    MessageRequester("Enable TLS", "File created: " + out_file + " successfully!", #MB_ICONINFORMATION)
  EndIf
EndIf


Утилита сама найдёт (должна во всяком случае) структуру TLS и посчитает кол-во элементов массива колбэков, пропатчит хидер, и создаст в папке с вашей program.exe новый файл program.tls.exe.
Если всё прошло успешно, при запуске program.tls.exe должно последовательно появиться 3 сообщения
Hello from TLS callback!
Hello from TLS callback 2 !
I`m EntryPoint! I`m run first! I think...

Т.е. сообщение из точки входа появится последним, что значит, часть кода выполнилась до передачи управления на точку входа программы.
--------------
ПС. Просьба товарища Инди не ругаться NT`шными матами, и так понятно, что его могло задеть моё богохульство (NT`хульство?). В общем претензии от товарища принимаются только в иде компилируемого на PureBasic кода.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Ср фев 26, 2014 9:01 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Цитата:
ПС. Просьба товарища Инди не ругаться NT`шными матами

Боюсь, что здесь он уже не присутствует.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Ср фев 26, 2014 11:45 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Fox писал(а):
TLS callback

Как же, как же, помним эти штучки. StarForce его активно юзал. Я когда его ковырять начал, все удивлялся. Вот же блин. На OEP еще не брякнулся, а SoftIce уже спалили

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Чт фев 27, 2014 12:58 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Спасибо. Пригодится.
На VT не проверял?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Чт фев 27, 2014 1:11 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 813
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Fox писал(а):
кусок кода в программе, выполняемый до передачи управления на точку входа программы. Данная особенность используется в некоторых протекторах, дабы отучить от отладки самых маленьких хацкеров.

При наличии статических либ, можно сделать еще проще, ведь либа стартует раньше, чем родительский ехе.
Т.е при коде my.dll
Код:
1
MessageBox_(0, "I am dll", "", 0)


И коде ехе
Код:
1
2
LoadLibrary_("my.dll")
MessageBox_(0, "I am exe", "", 0)


запустив ехе, мы увидим сначала "I am dll"
Можно юзать для тех же целей, как распаковщик, итд.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Чт фев 27, 2014 2:30 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Поправка, динамических длл, т.к. статические (.lib, .obj) линкуются в сам исполняемый файл. И, чтобы код из длл был вызван первым, нужно её добавить в импорт программы. В твоём примере сначала выполняется точка входа, после которой идёт загрузка dll в строке LoadLibrary_("my.dll").
Кстати, чтобы длл была добавлена в импорт, пурик компилит либу импорта. для библиотеки my.dll будет либа my.lib. В проге эту либу юзаем через
Код:
1
2
3
4
Import "my.lib"
MyFunc()
....
EndImport


MrF, не проверял, ну их, этих параноиков. Да и вообще, бытует мнение, что после неоднократной проверки файла он может начать определяться как вирус (ну типа в базы антивирусников добавляются сигнатуры, а раз файл много раз проверялся, значит у народа на него есть подозрения).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Чт фев 27, 2014 9:13 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 813
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Fox писал(а):
Поправка, динамических длл

Ну конечно динамических, из контекста понятно, что оговорился :)
И да, пример грубоват, в ф-цию не обернут, но раз вызов DLL_PROCESS_ATTACH происходит до EP, разве не должен он выполниться раньше?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TLS Callback и Purebasic
СообщениеДобавлено: Чт фев 27, 2014 10:40 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
В общем да, DLL_PROCESS_ATTACH выполняется для библиотек раньше, чем выполняется EP, т.к. задача загрузчика подготовить библиотеки для процесса, но смысл темы то в другом, в возможности выполнения TLS callback в приложении на PureBasic.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB