![]() |
eXeL@B —› Вопросы новичков —› Отслеживание запросов к SQLite |
Посл.ответ | Сообщение |
|
Создано: 06 сентября 2011 17:48 · Личное сообщение · #1 Доброго времени суток. Занимаюсь созданием сайта по продаже автозапчастей. У поставщика есть программа (http://autotechnics.ua/rus/online/files) в которой можно найти запчасти и цены с наличием. В БД программы есть таблица ESO_PRICE в которой по идее должны хранится цены .имеется также поле PRI_VALUE что указывает на то что это поле и содержит цены. но вместо открытых цен есть числовая запись , которая как я понял перемножается(делится?) с коефициентом где то в ехе-шнике . Выскрывал ехе шник программы через IDA Pro Free , нашел в коде запросы к бд select pri_value from eso_price where pri_ea_y = get_eay(@eax@) and ((round(pri_obl / @oblid@)) % 2 == 1) . в этом запросе неясно что означают get_eay(@eax@) , @oblid@ . Может ли кто подсказать какой программой лучше можно просмотреть исходный код? ![]() |
|
Создано: 06 сентября 2011 18:11 · Личное сообщение · #2 |
|
Создано: 06 сентября 2011 21:40 · Личное сообщение · #3 terantul на самом деле все намного интереснее вот пример как создается такая sqlite function: (Дельфи) res := sqlite3_create_function(sldb.DB, 'get_eax', 1, SQLITE_ANY, {5} nil, @get_eax_MyFunc, nil, nil); get_eax_MyFunc - ето Дельфи (!) процедура ваша задача как реверсера понять весь поток событий и написать свою приладу.... ![]() |
|
Создано: 06 сентября 2011 22:30 · Личное сообщение · #4 |
|
Создано: 06 сентября 2011 23:26 · Поправил: manco · Личное сообщение · #5 Мне кажется, вы не тот запрос смотрите. Запрос, приведенный в первом посте выбирает значения из поля pri_value по заданному критерию. А вот как они дальше преобразуются или используются наверное и нужно смотреть. по поводу oblid - суда по всему это ОблИд - идентификатор областей по-русски. Т.е. выбираются цены для определенной области, что также означает, что надо искать где-то в другом месте. ![]() |
|
Создано: 06 сентября 2011 23:52 · Поправил: neomant · Личное сообщение · #6 Поправлюсь. SQLite вроде как не поддерживает хранимых процедур на стороне базы. Вместо этого хранимки должны быть реализованы и зарегистрированы в самом коде приложения. То есть нужно смотреть на sqlite3_create_function, sqlite3_create_function16, sqlite3_create_function_v2 и искать по имени указатель на саму функцию. ----- Следуй за белым кроликом ![]() |
|
Создано: 07 сентября 2011 18:54 · Личное сообщение · #7 Занимаюсь сейчась именно этими же вопросами pri_obl это колонка региона, насколько понятно по названию Но её значения настараживают. Например 67108863 которая почти во всех записях, если перевести в hex это 3FFFFFF. Скорее всего цены и лежат в этой таблице только в своих форматах Это без анализ программы, только базы ![]() |
|
Создано: 07 сентября 2011 20:20 · Личное сообщение · #8 |
|
Создано: 08 сентября 2011 10:12 · Личное сообщение · #9 |
|
Создано: 12 сентября 2011 19:54 · Поправил: pashadow · Личное сообщение · #10 У меня есть соображения по поводу формулы по которой формируется Цена, зная поле PRI_EA_Y. Code:
1. Цену выдает в копейках. 2. Почему CUR_ID = 'C' - пока не знаю, там есть несколько вариантов (A,B,C), но правильный коэффициент только в С. 3. Для одного товара eso_art.EA_X не совпадает с eso_price.PRI_EA_Y. Данные для проверки: 1. Фильтр воздушный 15122646, цена 82.00 Код запчасти: 15122646 eso_art.EA_X = 394086 eso_price.EA_Y = 423061 eso_price.PRI_VALUE = 100000 eso_price.PRI_CUR_KEY = 3 eso_curr.CUR_KEY = 3 eso_curr.CUR_ID = 'C' eso_curr.CUR_RATE = 82000 1. Фильтр воздушный 15122304, цена 79.54 Код запчасти: 15122304 eso_art.EA_X = 273756 eso_price.EA_Y = 358141 eso_price.PRI_VALUE = 97000 eso_price.PRI_CUR_KEY = 3 eso_curr.CUR_KEY = 3 eso_curr.CUR_ID = 'C' eso_curr.CUR_RATE = 82000 Зная этот eso_price.EA_Y можно узнать и наличие на складах из таблицы eso_presence. Например так Code:
PR_W_ID - коды складов Киев-20, Днепр-2,Донецк-1,Харьков-3. PR_QTY - количество, причем '-5' значит что 'больше 5 штук'. Итак, самый главный вопрос: как преобразовывается значение eso_art.EA_X в eso_price.PRI_EA_Y и eso_presence.PR_EA_X? Возможно это делает функция get_eay(@eax@), но как - не могу понять. Прошу помощи. ![]() |
|
Создано: 12 сентября 2011 22:23 · Личное сообщение · #11 |
|
Создано: 12 сентября 2011 22:49 · Личное сообщение · #12 |
|
Создано: 13 сентября 2011 19:25 · Поправил: pashadow · Личное сообщение · #13 Итак ход моих рассуждений, результата пока нет (поправки приветствуются): 1. Как мы уже определились (исходя из записи "select ... pri_ea_y = get_eay(@eax@) ..." пост.1) "get_eay" это функция которая описана где-то в коде приложения и создается программно через sqlite3_create_function, sqlite3_create_function16, sqlite3_create_function_v2 (пост.6). 2. Из перечисленных в коде встречается только "sqlite3_create_function" Code:
Но что в неё передается мне лично не понятно. 3. Идем другим путем, изучая описание функции "sqlite3_create_function" (пост.6) видим что вторым параметром в неё передается имя создаваемой функции. 4. Выполняем поиск по "get_eay" Находим строчку, встречается один раз Code:
5. Выполняем поиск по " aGet_eay" и находим интересный кусок Code:
Похоже на параметры которые передаются функции "sqlite3_create_function" Code:
1-й mov. Имя функции 2-й mov. Количество аргументов функции 3-й mov. Кодировка параметров (#define SQLITE_ANY 5) 4-й mov. Произвольный указатель 5-й mov. Указатель на функцию xFunc 6-й mov. Указатель на функцию xStep 7-й mov. Указатель на функцию xFinal Для скалярной функции, т.е. возвращающей одно значение (коей предположительно является наша get_eay) обязательным является только xFunc, что соответствует коду, т.к. xStep и xFinal = 0 6. Значит "sub_52FFB0" и есть наша функция "get_eay" Code:
7. "sqlite3_value_int" используется для доступа к параметрам, а "sqlite3_result_int" возвращает результат, нас интересует то что между ними, но не могу понять что делает этот кусок. Code:
8. Направьте пожалуйста мои рассуждения в нужное русло... ![]() |
|
Создано: 13 сентября 2011 20:21 · Личное сообщение · #14 |
|
Создано: 13 сентября 2011 20:53 · Поправил: PE_Kill · Личное сообщение · #15 dword_5A5CD4 - массив чисел типа int, т.е. каждое число максимум 4 байта. Массив начинается с нулевого элемента, а вот результат sqlite3_value_int будет минимум 1, поэтому чтобы и нулевой элемент можно было захватить отнимается 4. На языке высокого уровня это будет типа так: dword_5A5CD4: array [0..END] of Integer = (1111,2222,3333,****); Index := sqlite3_value_int; Value := dword_5A5CD4[Index-1]; ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 14 сентября 2011 11:39 · Личное сообщение · #16 |
|
Создано: 22 сентября 2011 14:40 · Личное сообщение · #17 |
|
Создано: 04 октября 2011 00:21 · Личное сообщение · #18 |
|
Создано: 04 октября 2011 01:49 · Личное сообщение · #19 |
|
Создано: 23 октября 2011 19:23 · Личное сообщение · #20 |
|
Создано: 24 октября 2011 17:33 · Личное сообщение · #21 |
![]() |
eXeL@B —› Вопросы новичков —› Отслеживание запросов к SQLite |
Эта тема закрыта. Ответы больше не принимаются. |