Сейчас на форуме: _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Отслеживание запросов к SQLite
Посл.ответ Сообщение

Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 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@ .
Может ли кто подсказать какой программой лучше можно просмотреть исходный код?




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 06 сентября 2011 18:11
· Личное сообщение · #2

Смотреть можно и IDA, всё равно запрос SQL. get_eay - это хранимая процедура находящаяся в базе. @eax@ и @oblid@ - параметры, которые подставляются в запрос при его формировании.

-----
Следуй за белым кроликом




Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 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 - ето Дельфи (!) процедура
ваша задача как реверсера понять весь поток событий и написать свою приладу....



Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 сентября 2011 22:30
· Личное сообщение · #4

в том то и дело что пишу на php . с делфи и другими компилируемыми языками знаком очень слабо.
по поводу параметров @eax@ и @oblid@ и процедур get_eay - как то можно отследить где и как они формируются?



Ранг: 15.1 (новичок), 5thx
Активность: 0.010
Статус: Участник

Создано: 06 сентября 2011 23:26 · Поправил: manco
· Личное сообщение · #5

Мне кажется, вы не тот запрос смотрите. Запрос, приведенный в первом посте выбирает значения из поля pri_value по заданному критерию. А вот как они дальше преобразуются или используются наверное и нужно смотреть.
по поводу oblid - суда по всему это ОблИд - идентификатор областей по-русски. Т.е. выбираются цены для определенной области, что также означает, что надо искать где-то в другом месте.

| Сообщение посчитали полезным: terantul


Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 06 сентября 2011 23:52 · Поправил: neomant
· Личное сообщение · #6

Поправлюсь. SQLite вроде как не поддерживает хранимых процедур на стороне базы. Вместо этого хранимки должны быть реализованы и зарегистрированы в самом коде приложения. То есть нужно смотреть на sqlite3_create_function, sqlite3_create_function16, sqlite3_create_function_v2 и искать по имени указатель на саму функцию. Это в помощь.

-----
Следуй за белым кроликом


| Сообщение посчитали полезным: terantul

Ранг: 0.5 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 07 сентября 2011 18:54
· Личное сообщение · #7

Занимаюсь сейчась именно этими же вопросами

pri_obl это колонка региона, насколько понятно по названию
Но её значения настараживают. Например 67108863 которая почти во всех записях, если перевести в hex это 3FFFFFF. Скорее всего цены и лежат в этой таблице только в своих форматах

Это без анализ программы, только базы



Ранг: 0.5 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 07 сентября 2011 20:20
· Личное сообщение · #8

Само отслежвание запросов можно сделать просто поправив исходники. Они открыты



Ранг: 0.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2011 10:12
· Личное сообщение · #9

LTRay пишет:
Само отслежвание запросов можно сделать просто поправив исходники. Они открыты

А вот тут пожалуйста поподробней



Ранг: 0.4 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 12 сентября 2011 19:54 · Поправил: pashadow
· Личное сообщение · #10

У меня есть соображения по поводу формулы по которой формируется Цена, зная поле PRI_EA_Y.
Code:
  1. select eso_price.PRI_EA_Y,eso_price.PRI_VALUE, eso_curr.CUR_RATE, 
  2. (eso_price.PRI_VALUE*eso_curr.CUR_RATE/1000000) as Price from eso_price
  3. inner join eso_curr on eso_price.PRI_CUR_KEY = eso_curr.CUR_KEY
  4. where eso_curr.CUR_ID = 'C' and eso_price.PRI_EA_Y = {???}

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:
  1. select * from eso_presence where PR_EA_X = 423061

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@), но как - не могу понять. Прошу помощи.

| Сообщение посчитали полезным: terantul

Ранг: 15.1 (новичок), 5thx
Активность: 0.010
Статус: Участник

Создано: 12 сентября 2011 22:23
· Личное сообщение · #11

А вы уверены, что eso_art.EA_X в eso_price.PRI_EA_Y преобразуются? по моему это идентификаторы для связи с другими таблицами. НО это только предположение, программу не смотрел. И второй запрос говорит о том, что eso_art.EA_X = so_presence.PR_EA_X.



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 12 сентября 2011 22:49
· Личное сообщение · #12

pashadow
ета функция в коде программы
ищите



Ранг: 0.4 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 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:
  1. .text:004E6C5E                 mov     eax, [ebp+var_14]
  2. .text:004E6C61                 mov     ecx, [eax]
  3. .text:004E6C63                 push    ecx
  4. .text:004E6C64                 mov     edx, [ebp+var_5C]
  5. .text:004E6C67                 mov     eax, [edx+0Ch]
  6. .text:004E6C6A                 push    eax
  7. .text:004E6C6B                 call    sqlite3_create_function

Но что в неё передается мне лично не понятно.
3. Идем другим путем, изучая описание функции "sqlite3_create_function" (пост.6) видим что вторым параметром в неё передается имя создаваемой функции.
4. Выполняем поиск по "get_eay" Находим строчку, встречается один раз
Code:
  1. 05783EC aGet_eay        db 'get_eay',0

5. Выполняем поиск по " aGet_eay" и находим интересный кусок
Code:
  1. .text:00530A01                 mov     [ebp+var_7C], offset aGet_eay ; "get_eay"
  2. .text:00530A08                 mov     [ebp+var_78], 1
  3. .text:00530A0F                 mov     [ebp+var_74], 5
  4. .text:00530A16                 mov     [ebp+var_70], 0
  5. .text:00530A1D                 mov     [ebp+var_6C], offset sub_52FFB0
  6. .text:00530A24                 mov     [ebp+var_68], 0
  7. .text:00530A2B                 mov     [ebp+var_64], 0

Похоже на параметры которые передаются функции "sqlite3_create_function"
Code:
  1. int sqlite3_create_function(
  2.   sqlite3 *db,
  3.   const char *zFunctionName,
  4.   int nArg,
  5.   int eTextRep,
  6.   void *pApp,
  7.   void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
  8.   void (*xStep)(sqlite3_context*,int,sqlite3_value**),
  9.   void (*xFinal)(sqlite3_context*)
  10. );

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:
  1. .text:0052FFB0 sub_52FFB0      proc near               ; DATA XREF: eLocalDatabaseOptimizer::Init_MainFunctions(void)+2FDo
  2. .text:0052FFB0
  3. .text:0052FFB0 arg_0           = dword ptr  8
  4. .text:0052FFB0 arg_8           = dword ptr  10h
  5. .text:0052FFB0
  6. .text:0052FFB0                 push    ebp
  7. .text:0052FFB1                 mov     ebp, esp
  8. .text:0052FFB3                 mov     eax, [ebp+arg_8]
  9. .text:0052FFB6                 mov     ecx, [eax]
  10. .text:0052FFB8                 push    ecx
  11. .text:0052FFB9                 call    sqlite3_value_int
  12. .text:0052FFBE                 add     esp, 4
  13. .text:0052FFC1                 mov     edx, dword_5A5CD4
  14. .text:0052FFC7                 mov     eax, [edx+eax*4-4]
  15. .text:0052FFCB                 push    eax
  16. .text:0052FFCC                 mov     ecx, [ebp+arg_0]
  17. .text:0052FFCF                 push    ecx
  18. .text:0052FFD0                 call    sqlite3_result_int
  19. .text:0052FFD5                 add     esp, 8
  20. .text:0052FFD8                 pop     ebp
  21. .text:0052FFD9                 retn
  22. .text:0052FFD9 sub_52FFB0      endp

7. "sqlite3_value_int" используется для доступа к параметрам, а "sqlite3_result_int"
возвращает результат, нас интересует то что между ними, но не могу понять что делает этот кусок.
Code:
  1. .text:0052FFC1                 mov     edx, dword_5A5CD4
  2. .text:0052FFC7                 mov     eax, [edx+eax*4-4]
  3. .text:0052FFCB                 push    eax
  4. .text:0052FFCC                 mov     ecx, [ebp+arg_0]
  5. .text:0052FFCF                 push    ecx


8. Направьте пожалуйста мои рассуждения в нужное русло...




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 13 сентября 2011 20:21
· Личное сообщение · #14

Это выбор значения из таблицы: mov edx, dword_5A5CD4 - начало таблицы; eax - параметр, переданный в функцию, индекс элемента начинающийся с единицы.

-----
Следуй за белым кроликом





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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




Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 сентября 2011 11:39
· Личное сообщение · #16

Возможно это будет просто подсказкой, но я вот заметил еще одно действие. В файле opt.sdb есть таблица o_int и там есть значение "q" = 610733, и если изменить это число, то и новый PR_EA_X(get_eay()) тоже уже становится другим, то-есть в расчете get_eay() используется это значение.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 сентября 2011 14:40
· Личное сообщение · #17

У кого то , какой то сдвиг в решении этой проблемы появился?



Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 октября 2011 00:21
· Личное сообщение · #18

Я извиняюсь за глупый вопрос, а кто нибудь отследил связь артикула с аналогами. Я так понял, что они ID артикула тоже как-то шифруют?



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 04 октября 2011 01:49
· Личное сообщение · #19

Sypher
таблица ESO_REPLACE в eparts
для правильной связки надо уметь доставать EA_X, EA_Y



Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 октября 2011 19:23
· Личное сообщение · #20

Если у кого то получилось достать прайс с ценами, я очень заинтересован!!! ПИШИТЕ.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 24 октября 2011 17:33
· Личное сообщение · #21

В запросах такого рода заинтересованность выражать надо.


 eXeL@B —› Вопросы новичков —› Отслеживание запросов к SQLite
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати