Получение функций из DLL

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Получение функций из DLL

Сообщение FireFenix » 17.05.2009 (Вс) 20:47

Искал по форуму и в гугле - реализации на вб ненашёл =\
Может кто поделться кодом как получить из dll список её функций и что ещё можно из неё достать?

p.s. получить список внутренностей программно
Вложения
dll.rar
Вроде этого написанного на делфи
(170.11 Кб) Скачиваний: 110

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Получение функций из DLL

Сообщение Debugger » 17.05.2009 (Вс) 21:14

Список внутренностей можно получить из
1) tlb-шки, которая пришита к (или в) dll-ке. Извлекай ресурсы.
2) Посмотреть, какие функции вызывает какая-нибудь программа, использующая эту библиотеку. Как сделать программно - не знаю. Спроси у Dependency walker'а.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 17.05.2009 (Вс) 21:20

Искал по форуму и в гугле - реализации на вб ненашёл =\

Ничего не стоит написать её.

что ещё можно из неё достать?

А что ещё тебе нужно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 17.05.2009 (Вс) 21:27

Хакер писал(а):
Искал по форуму и в гугле - реализации на вб ненашёл =\

Ничего не стоит написать её.


Ммммм.... ну без понимания как это делается, особенно на вб, это выливается в проблемку =\, да и реализацию нашёл только на дельфи, что прикрепленно

Хакер писал(а):
что ещё можно из неё достать?

А что ещё тебе нужно?


Ну если обьявлены константы, перечисления и прочий подручный материал, тоже не плохо было бы получить
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение функций из DLL

Сообщение iGrok » 17.05.2009 (Вс) 21:28

Debugger писал(а):Спроси у Dependency walker'а.

А чего там спрашивать... Таблицу экспорта он читает.

Константы, перечисления, объекты - искать в ресурсах tlb.
Функции - искать таблицу экспорта. Читать про формат PE-файла.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 17.05.2009 (Вс) 21:34

ну без понимания как это делается

Если понимания нет совсем, то советую прочитать и понять документацию по PE-формату. Многое станет на свои места. Только читать надо качественный материал. Одним из показателей качественности материала без оценки самого материала может быть тот факт, что материал оформлен в виде PDF. На этом форуме давалсь ссылка на мануал от Криса Касперски. Он (материал) грамотный, там только проблема с терминологией.

особенно на вб

Т.к. дело делается чтением файлов и анализом прочитанной информации, нет никакой разницы, на каком языке решается задача. Так как все языки программирования читают данные из файлов в равной степени хорошо.

Ну если обьявлены константы, перечисления и прочий подручный материал, тоже не плохо было бы получить
[/quote]
Это уже TLB. Если в ресурсах у PE-файла лежит TLB, то её оттуда можно достать. Для работы с TLB в OleApi уже есть нужный функционал. Для этого надо использовать функцию LoadTypeLibEx (именно Ex с флагом об отмене регистрации).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 17.05.2009 (Вс) 23:12

На сколько я понял из прочитанных доков, чтобы выдрать полезное из длл, нужно :
- прочитать заголовок PE
- парисим заголовок на адрес начала таблицы импорта/экспорта и размер таблицы
- считываем все элементы таблицы, с ссылок элементов таблицы получаем имя и адресс функции для дальнейших вызовов
а для перечеслений, констант и т.п. как я понял нужно парсить таблицу ресурсов или обрабатывать с помощью ole api?

И ещё хотелось бы узнать.... для .NET тоже нужно парсить? или есть встроенные решения?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Получение функций из DLL

Сообщение Nord777 » 18.05.2009 (Пн) 17:58

И ещё хотелось бы узнать.... для .NET тоже нужно парсить?
Нужно.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 18.05.2009 (Пн) 18:00

Nord777, не бывает же дотнет-длл-библиотек, экспортирующих функции обычным способом? (Я не знаю, это вопрос)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Получение функций из DLL

Сообщение Nord777 » 18.05.2009 (Пн) 18:46

не бывает же дотнет-длл-библиотек, экспортирующих функции обычным способом?
Не совсем тебя понял. Написать нетовскую библу с таблицей экспорта как у нативной библы? Скорее всего нет. У нетовской dll таблица экспорта пуста(если смотреть w32dasm). Насчёт вручную - не знаю.
А что тебя сподвигло на такой вопрос? Внедрение нативного кода?

И ещё хотелось бы узнать.... для .NET тоже нужно парсить? или есть встроенные решения?
Если речь идет о .Net dll, то есть рефлексия, если речь идет о том, чтобы средствами .Net получить инфу о нативной библиотеке - это парсить.
Последний раз редактировалось Nord777 18.05.2009 (Пн) 19:11, всего редактировалось 1 раз.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 18.05.2009 (Пн) 19:02

Nord777 писал(а):Написать нетовскую библу с таблицей экспорта как у нативной библы? Скорее всего нет. У нетовской dll таблица экспорта пуста(если смотреть w32dasm). Насчёт вручную - не знаю.
А что тебя сподвигло на такой вопрос? Внедрение нативного кода?

Сподвигнул интерес: зачем автору понадобилось смотреть в дотнетовую таблицу экспорта, если она заведомо пуста.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 18.05.2009 (Пн) 19:15

Ну я имел ввиду, чтобы получить средствами НЕТ внутренности dll... может там есть спец. набор, но как повидимому - нет
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 18.05.2009 (Пн) 19:57

Напомню, что "парсить" в данном случае --- абсолютно неуместный термин.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 19.05.2009 (Вт) 15:47

Раз ковыряюсь в длл, решил всю разобрать..... возник вопрос : как считать из длл байты в структуру? пробывал сериализацию, но для неё нужен заголовок. На Си для структур можно типа
Код: Выделить всё
for(i = 0; i < sizeof(Header); i++)
{
  *(((char*)Header) + i) = fgetc(exe_file);
  if(feof(exe_file)) break;
}


а как это будет выглядеть на VB или VB.NET?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 19.05.2009 (Вт) 16:30

FireFenix писал(а):
Код: Выделить всё
for(i = 0; i < sizeof(Header); i++)
{
  *(((char*)Header) + i) = fgetc(exe_file);
  if(feof(exe_file)) break;
}


Воистину дурацкий код. Должно быть так:
Код: Выделить всё
for(char* pBuf = (char*)Header; (pBuf < (char*)Header + sizeof(Header)) && !feof(exe_file); pBuf++) pBuf = fgetc(exe_file);

Это без учёта особенностей задачи, чисто по организации кода. По крайне мере *(((char*)Header) + i) читаемости ради можно заменить на ((char*)Header)[i].

а как это будет выглядеть на VB

Что? Чтение заголовка?

Код: Выделить всё
Dim header as T_HEADER
...

Get #xxx, offset, header
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 19.05.2009 (Вт) 19:09

решил делать на VB.NET, делаю :
Код: Выделить всё
Structure Dos_Header
    Dim Signature As UInt16
    Dim Count_Byte As UInt16
    ...
End Structure

FileOpen(1, "D:\D3dx9d_41.dll", OpenMode.Random)
FileGet(1, Dos_Header, 1)

Беда, компилятор ругается Ввод/вывод файла структуры с полем "Signature" типа "UInt16" является недопустимым., а если юзать тип Char - нормально, но читает только один символ, как тогда правильно считать?
Или может есть другая реализация записи в структуру?

p.s. т.к. решил делать на NET, не могли бы вы перенести топик в соответствующий раздел?
Последний раз редактировалось FireFenix 19.05.2009 (Вт) 19:21, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 19.05.2009 (Вт) 19:16

FireFenix писал(а):p.s. т.к. решил делать на NET, не могли бы вы перенести топик в соответствующий раздел?

Жаль. Перенёс.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 19.05.2009 (Вт) 19:35

Хакер писал(а):
FireFenix писал(а):p.s. т.к. решил делать на NET, не могли бы вы перенести топик в соответствующий раздел?

Жаль. Перенёс.

6ой версии нет под рукой =\, и вот стал кодить на .нет, и подумал, что задавать вопрос в теме про вб6 будет не корректно
но траблу со структурой так и не решил =\

Раскурочивая ещё один сишный исходник наткунлся на решешение в одну строчку
Код: Выделить всё
bcopy(lpFile, (LPVOID)pHeader, sizeof (IMAGE_DOS_HEADER));
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 19.05.2009 (Вт) 19:51

Я испытываю отвращение к .net, не использую и не изучаю эту технологию. Поэтому я не могу отвечать тебе дальше.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 19.05.2009 (Вт) 21:11

Хакер писал(а):Я испытываю отвращение к .net, не использую и не изучаю эту технологию. Поэтому я не могу отвечать тебе дальше.

Извиняй, как напишу на нете, обязательно транслирую на vb6. Всёравно спасибо за помощь =)

конвертацию в структуру решил методом

Код: Выделить всё
Imports System.Runtime.InteropServices

Dim Struct as MyStruct
Dim FS As System.IO.FileStream
Dim BR As System.IO.BinaryReader

FS = New System.IO.FileStream(File, IO.FileMode.Open)
BR = New System.IO.BinaryReader(FS)
BR.BaseStream.Seek(0, IO.SeekOrigin.Begin)

Struct = ToStructure(BR.ReadBytes(Marshal.SizeOf(Struct), Struct.GetType)

Private Function ToStructure(ByVal Value() As Byte, ByVal Type As System.Type)
    Dim MyGC As GCHandle = GCHandle.Alloc(Value, GCHandleType.Pinned)
    Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, Type)
    MyGC.Free()

    Return Obj
End Function
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Получение функций из DLL

Сообщение Debugger » 20.05.2009 (Ср) 14:58

Судя по смыслу, это на VB занимает 3 строчки...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Получение функций из DLL

Сообщение MIT » 20.05.2009 (Ср) 15:29

Debugger писал(а):Судя по смыслу, это на VB занимает 3 строчки...
Это какие же?

Способ FireFenix`а (который, по всей видимости, он нашел) является наиболее оптимальным при обработке Структура > Массив > Структура.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение функций из DLL

Сообщение iGrok » 21.05.2009 (Чт) 13:24

MIT писал(а):
Debugger писал(а):Судя по смыслу, это на VB занимает 3 строчки...
Это какие же?

Структура>Массив>Структура
LSet при заранее известных размерах и объявленных UDT'ах для структуры и массива.
CopyMemory для любой.

А файл>структура так вообще Get, без всяких лишних преобразований...
label:
cli
jmp label

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 21.05.2009 (Чт) 13:30

MIT писал(а):Способ FireFenix`а (который, по всей видимости, он нашел) является наиболее оптимальным при обработке Структура > Массив > Структура.

Были перечитаны манаулы и выведено путём проб и ошибок :)

iGrok писал(а):LSet при заранее известных размерах и объявленных UDT'ах для структуры и массива.
CopyMemory для любой.
А файл>структура так вообще Get, без всяких лишних преобразований...

Как я писал выше и приводил код FileOpen + FileGet, неработает для структур, в которых обьявлены элементы UInt16 типа. Поэтому сделал через маршала
Если есть другое решение, пожалуйста выложи, буду рад =)

Разбирая длл, увидел ПЕ файлы бывают структурой:
1) MZ + Stub + PE, NE, etc + ресурсы
2) PE, NE, etc + ресурсы
Кто скажет какие ещё бывают структуры? или подскажет литературу по исполняемым файлам, библиотекам и т.д.?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение функций из DLL

Сообщение iGrok » 21.05.2009 (Чт) 14:45

FireFenix писал(а):
iGrok писал(а):LSet при заранее известных размерах и объявленных UDT'ах для структуры и массива.
CopyMemory для любой.
А файл>структура так вообще Get, без всяких лишних преобразований...

Как я писал выше и приводил код FileOpen + FileGet, неработает для структур, в которых обьявлены элементы UInt16 типа. Поэтому сделал через маршала
Если есть другое решение, пожалуйста выложи, буду рад =)

Вообще-то это было ответом на пост MIT, и касалось VB6.
label:
cli
jmp label

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 29.05.2009 (Пт) 17:34

Брррр..... упорно не получается найти начало таблиц импорта/экспорта и т.д. :cry:
Как написанно в мануале - копия исполняемого файла загружается в память по Image Base адресу и позиция таблиц вычисляется как Iamge Base + RVA Table
Судя из этого, открывая файл по адресу RAV Table, должна быть таблица, но открывая хекс едитором видно, что она смещена почемуто непонятным образом и находится в меньшем адресе,чем её RVA адрес :cry:
Т.е. получается что нужно вначале грузить библиотека в память, а потом ковырять? Или же как правильно найти адреса таблиц?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 29.05.2009 (Пт) 19:56

Секции в файле расположены определённым образом. Нет абсолютно никакой гарантии, что после загрузки PE-файла они будут в памяти располагаться таким же точно образом.

Так что либо грузить, либо делать правильную трансформацию адреса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Получение функций из DLL

Сообщение FireFenix » 29.05.2009 (Пт) 20:19

Хакер писал(а):Так что либо грузить, либо делать правильную трансформацию адреса.

Мммм...... в мануалах напсианно что адресса таблиц - смещения от начала файла как бы, но на практике имеется сдвиг....
Как тогда правильно странсформировать? Или где можно почитать?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 29.05.2009 (Пт) 20:38

В мануале так о чём написано? О полях в PE-заголовке (в Data Directories)? Если да — мануал в топку.

Там пары полей: [Export Table RVA] + [Export Table Size] (и аналогично для Import). Названия первого поля говорит само за себя, т.е. без всяких мануалов всё ясно: RVA = Relative Virtual Address. Virtual означает, что речь идёт об адресе не в файле, а в памяти. Relative означает, что адрес указан относительно базы. Т.е. само по себе упоминание RVA однозначно должно говорит тебе, что речь идёт смещении каких-то данных, но смещении не в файле, а в памяти.

Как тогда правильно странсформировать?

RVA2FA? В исходниках моего FNDLL же было.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16476
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение функций из DLL

Сообщение Хакер » 29.05.2009 (Пт) 20:52

А, там нет модуля M_GEN_PEFormatRTL.

Ок. Методика такова:
  • Взять RVA и пройтись по таблице секций. Определить на отображение какой секции попадает наш RVA. Тут надо смотреть чуть более хитро: размер секции в файле может быть меньшим, чем размер секции в памяти. Тогда «недостающая часть» не будет взята из файла. Так вот, если RVA попадает на такую uninitialized область, значит ему вообще не соответствует никакой физический адрес (смещение в файле)
  • Отнять от RVA (исходного) RVA секции и прибавть значение поля PhysicalOffset этой секции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 75

    TopList