Часто используемые функции Windows API

Это функции которые можно увидеть в числе импортируемых. Немалая часть может вызываться из библиотечных функций и CRT-кода.

Многие функции могут иметь суффикс -A для ASCII-версии и -W для Unicode-версии.

• Работа с реестром (advapi32.dll): RegEnumKeyEx, RegEnumValue, RegGetValue, RegOpenKeyEx, RegQueryValueEx.

• Работа с текстовыми .ini-файлами (kernel32.dll): GetPrivateProfileString.

• Диалоговые окна (user32.dll): MessageBox, MessageBoxEx, CreateDialog, SetDlgItemText, GetDlgItemText.

• Работа с ресурсами: (user32.dll): LoadMenu.

• Работа с TCP/IP-сетью (ws2_32.dll): WSARecv, WSASend.

• Работа с файлами (kernel32.dll): CreateFile, ReadFile, ReadFileEx, WriteFile, WriteFileEx.

• Высокоуровневая работа с Internet (wininet.dll): WinHttpOpen.

• Проверка цифровой подписи исполняемого файла (wintrust.dll): WinVerifyTrust.

• Стандартная библиотека MSVC (в случае динамического связывания)(msvcr*.dll): assert, itoa, ltoa, open, printf, read, strcmp, atol, atoi, fopen, fread, fwrite, memcmp, rand, strlen, strstr, strchr.

Расширение триального периода

Функции доступа к реестру это частая цель тех, кто пытается расширить триальный период ПО, которое может сохранять дату/время инсталляции в реестре.

Другая популярная цель это функции GetLocalTime() и GetSystemTime(): триальное ПО, при каждом запуске, должно как-то проверять текущую дату/время.

Tracer: Перехват всех функций в отдельном модуле

В tracer есть поддержка точек останова INT3, хотя и срабатывающие только один раз, но зато их можно установить на все сразу функции в некоей DLL.

−−one−time−INT3−bp:somedll.dll!.*

Либо, поставим INT3-прерывание на все функции, имена которых начинаются с префикса xml :

−−one−time−INT3−bp:somedll.dll!xml.*

В качестве обратной стороны медали, такие прерывания срабатывают только один раз. Tracer покажет вызов какой-либо функции, если он случится, но только один раз. Еще один недостаток — увидеть аргументы функции также нельзя. Тем не менее, эта возможность очень удобна для тех ситуаций, когда вы знаете что некая программа использует некую DLL, но не знаете какие именно функции в этой DLL. И функций много.

Например, узнаем, что использует cygwin-утилита uptime:

tracer −l:uptime.exe −−one−time−INT3−bp:cygwin1.dll!.*

Так мы можем увидеть все функции из библиотеки cygwin1.dll, которые были вызваны хотя бы один раз, и откуда:

One−time INT3 breakpoint: cygwin1.dll!__main (called from uptime.exe!OEP+0x6d (0x40106d))

One−time INT3 breakpoint: cygwin1.dll!_geteuid32 (called from uptime.exe!OEP+0xba3 (0x401ba3))

One−time INT3 breakpoint: cygwin1.dll!_getuid32 (called from uptime.exe!OEP+0xbaa (0x401baa))

One−time INT3 breakpoint: cygwin1.dll!_getegid32 (called from uptime.exe!OEP+0xcb7 (0x401cb7))

One−time INT3 breakpoint: cygwin1.dll!_getgid32 (called from uptime.exe!OEP+0xcbe (0x401cbe))

One−time INT3 breakpoint: cygwin1.dll!sysconf (called from uptime.exe!OEP+0x735 (0x401735))

One−time INT3 breakpoint: cygwin1.dll!setlocale (called from uptime.exe!OEP+0x7b2 (0x4017b2))

One−time INT3 breakpoint: cygwin1.dll!_open64 (called from uptime.exe!OEP+0x994 (0x401994))

One−time INT3 breakpoint: cygwin1.dll!_lseek64 (called from uptime.exe!OEP+0x7ea (0x4017ea))

One−time INT3 breakpoint: cygwin1.dll!read (called from uptime.exe!OEP+0x809 (0x401809))

One−time INT3 breakpoint: cygwin1.dll!sscanf (called from uptime.exe!OEP+0x839 (0x401839))

One−time INT3 breakpoint: cygwin1.dll!uname (called from uptime.exe!OEP+0x139 (0x401139))

One−time INT3 breakpoint: cygwin1.dll!time (called from uptime.exe!OEP+0x22e (0x40122e))

One−time INT3 breakpoint: cygwin1.dll!localtime (called from uptime.exe!OEP+0x236 (0x401236))

One−time INT3 breakpoint: cygwin1.dll!sprintf (called from uptime.exe!OEP+0x25a (0x40125a))

One−time INT3 breakpoint: cygwin1.dll!setutent (called from uptime.exe!OEP+0x3b1 (0x4013b1))

One−time INT3 breakpoint: cygwin1.dll!getutent (called from uptime.exe!OEP+0x3c5 (0x4013c5))

One−time INT3 breakpoint: cygwin1.dll!endutent (called from uptime.exe!OEP+0x3e6 (0x4013e6))

One−time INT3 breakpoint: cygwin1.dll!puts (called from uptime.exe!OEP+0x4c3 (0x4014c3))

Текстовые строки

Си/Си++

Обычные строки в Си заканчиваются нулем (ASCIIZ-строки).

Borland Delphi

Когда кодируются строки в Pascal и Delphi, сама строка предваряется 8-битным или 32-битным значением, в котором закодирована длина строки.

Например:

CODE:00518AC8 dd 19h

CODE:00518ACC aLoading___Plea db 'Loading... , please wait.',0

...

CODE:00518AFC dd 10h

CODE:00518B00 aPreparingRun__ db 'Preparing run...',0

Unicode

Уникод — это стандарт, присваивающий номер каждому символу многих письменностей мира, но не описывающий способ кодирования. Наиболее популярные способы кодирования: UTF-8 (наиболее часто используется в Интернете и *NIX-системах) и UTF-16LE (используется в Windows).

UTF-8 это один из очень удачных способов кодирования символов. Все символы латиницы кодируются так же, как и в ASCII-кодировке, а символы, выходящие за пределы ASCII-7-таблицы, кодируются несколькими байтами. 0 кодируется, как и прежде, нулевыми байтом, так что все стандартные функции Си продолжают работать с UTF-8-строками так же как и с обычными строками.

Посмотрим, как символы из разных языков кодируются в UTF-8 (Рис.3) и как это выглядит в FAR, в кодировке 437 (Рис.4):

Рисунок.3 Наборы символов на разных языках.

Рисунок.4 вид символов в FAR, в кодировке 437

Видно, что строка на английском языке выглядит точно так же, как и в ASCII-кодировке. В венгерском языке используются латиница плюс латинские буквы с диакритическими знаками. Здесь видно, что эти буквы кодируются несколькими байтами, они подчеркнуты красным. То же самое с исландским и польским языками. В самом начале имеется также символ валюты «Евро», который кодируется тремя байтами. Остальные системы письма здесь никак не связаны с латиницей. По крайней мере о русском, арабском, иврите и хинди мы можем сказать, что здесь видны повторяющиеся байты, что не удивительно, ведь, обычно буквы из одной и той же системы письменности расположены в одной или нескольких таблицах уникода, поэтому часто их коды начинаются с одних и тех же цифр.

В самом начале, перед строкой «How much?», видны три байта, которые на самом деле BOM2. BOM показывает, какой способ кодирования будет сейчас использоваться.

Наши рекомендации