Сейчас на форуме: Magister Yoda (+5 невидимых)

 eXeL@B —› Основной форум —› FoxPro
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 02:05
· Личное сообщение · #1

Братва, кто хорошо знает FoxPro?
Помогите разобрать код пожалста.
В принципе код не сложный, но чет нифига не получается разобрать толком
алгоритм генерации сериала.
Вид сериала - ХХХХХХХХ-YYYYYYYYYY-XXXXXXXX
Так вот YYYYYYYYYY есть самое главное, в коде это VAL(ALLTRIM(thisform.text2.value)) - то что в едит контроле
tyu1 - это сгенеренный серийник, т.е. его часть (YYYYYYYYYY)
Попробовал тупо посчитать на калькуляторе, нифига...

Вот код из Рефокса

Code:
  1. **
  2. PROCEDURE Click
  3.  llm = 1
  4.  USE data1!table_stzatrat2 IN 0
  5.  SELECT table_stzatrat2
  6.  GOTO TOP
  7.  DO WHILE llm<1001 .AND. VAL(ALLTRIM(thisform.text1.value))<>table_stzatrat2.zat1
  8.     llm = llm+1
  9.     GOTO llm
  10.  ENDDO
  11.  IF VAL(ALLTRIM(thisform.text1.value))=table_stzatrat2.zat1 .AND. VAL(ALLTRIM(thisform.text3.value))=table_stzatrat2.zat2
  12.     llm = 44546544
  13.     GOTO 1001
  14.     SKIP -1
  15.     SKIP 1
  16.     DECLARE INTEGER GetVolumeInformation IN Win32Api STRING @, STRING @, INTEGER, INTEGER @, INTEGER @, INTEGER @, STRING @, INTEGER
  17.     rootn = SYS(5)+''
  18.     voln = '**********'
  19.     v_lenn = 10
  20.     snn = 10
  21.     kmn = 10
  22.     fln = 10
  23.     sys_fn = '**********'
  24.     s_lenn = 10
  25.     = getvolumeinformation(@rootn, @voln, v_lenn, @snn, @kmn, @fln, @sys_fn, @s_lenn)
  26.     l_sern = snn
  27.     IF l_sern<0
  28.        l_sern = 4294967296 +l_sern
  29.     ENDIF
  30.     LOCAL tyu1
  31.     tyu1 = l_sern+1234567
  32.     tyu1 = INT((tyu1/3+8754264)/10*1.94 )
  33.     IF tyu1=VAL(ALLTRIM(thisform.text2.value))
  34.        REPLACE table_stzatrat2.zat2 WITH tyu1
  35.        REPLACE table_stzatrat2.zat1 WITH llm
  36.        llm = 0
  37.        USE
  38.        _SCREEN.caption = "АРМ_ОТ"
  39.        MESSAGEBOX("Поздравляем!"+CHR(13)+"Регистрация программы прошла успешно!", 64, "Программа зарегистрирована", 10000)
  40.     ELSE
  41.        USE
  42.        ekz17 = 2
  43.        SET CLASSLIB TO timerglob.vcx
  44.        PUBLIC gosystimer
  45.        gosystimer = CREATEOBJECT('timer_glob')
  46.        gosystimer.enabled = .T.
  47.     ENDIF
  48.  ELSE
  49.     USE
  50.     ekz17 = 2
  51.     SET CLASSLIB TO timerglob.vcx
  52.     PUBLIC gosystimer
  53.     gosystimer = CREATEOBJECT('timer_glob')
  54.     gosystimer.enabled = .T.
  55.  ENDIF
  56.  thisform.release()
  57. ENDPROC
  58. **


Помогите разобраться плиз!

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 апреля 2009 09:56 · Поправил: progopis
· Личное сообщение · #2

А почему в программировании создал? Это же в общем-то тема основного форума.

А вот это что? thisform.text2.value

По функциям:
ALLTRIM - обрезать пробелы у строки слева и справа.
VAL - это получение числа из строки.
INT - округление числа до целого.
SYS(5) - если верить MSDN'у - основной раздел системы ('C:' я полагаю)

При вызове API функции параметры по значению - без префикса. Параметры по ссылке - с префиксом @

Ну так вот получают они серийный номер раздела. Если число меньше 0 прибавляют к нему MAX_LONG+1

Затем вполне очевидные операции.
tyu1 = l_sern+1234567
tyu1 = INT((tyu1/3+8754264)/10*1.94 )




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 12:33
· Личное сообщение · #3

progopis

Спасибо, попробуем..
Просто если честно проги на фокспро, как не странно, попалась первый раз...

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 апреля 2009 12:47
· Личное сообщение · #4

DaRKSiDE
А чего тут странного? На нём пишут только ребята из ГНИВЦ. Причина просто - легко и быстро можно накодить систему управления базами данных. Лично я другого не встречал.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 13:46
· Личное сообщение · #5

progopis пишет:
А почему в программировании создал? Это же в общем-то тема основного форума.

Извеняйте...

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 18:43
· Личное сообщение · #6

progopis

Нихрена ничего не выходит
Может что я так не понимаю...
Но после всех манипуляций с серийным номером раздела и его округления получается 110299573, а это 9 символов, хотя должно по идее получиться 10 символов...
Подскажи плиз, где ошибка-то...

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 18:56
· Личное сообщение · #7

Серийный номер раздела (на моем компе) - 1678166144 (l_sern)
1678166144+1234567 = 1679400711 (tyu1 = l_sern+1234567 )
1679400711/3 = 559800237
559800237+8754264 = 568554501
568554501/10 = 56855450 (единица ушла за плавающую запятую)
56855450 * 1.94 = 110299573

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 апреля 2009 19:10 · Поправил: progopis
· Личное сообщение · #8

Дык 0 допиши ведущий. А вообще ты уверен что проверка обламывается именно на уровне thisform.text2.value ?

Просто смотри. У нас есть проверка tyu1=VAL(ALLTRIM(thisform.text2.value)). Допустим tyu1=123456789 и thisform.text2.value="0123456789". С позиций проверки всё ок, так как ведущий 0 обрежется функцией VAL.

Вообще лучше поставь последний FoxPro и закинь в него сорсы. Под отладчиком проще будет понять где лаг.




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 05 апреля 2009 19:10 · Поправил: mysterio
· Личное сообщение · #9

DaRKSiDE
Возможно имеет смысл поставить лидирующий 0 (для того чтобы строка была = 10 символам)?

Add: Опередили =/

-----
Don_t hate the cracker - hate the code.




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 апреля 2009 19:20
· Личное сообщение · #10

DaRKSiDE пишет:
единица ушла за плавающую запятую


А вот это зря. Сначала считай выражение как вещественное, а уже потом округляй. Хотя в данном случае результат тот же.

568554501/10 = 56855450,1
56855450,1 * 1.94 = 110299573,194
INT(110299573,194)=110299573




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 20:02
· Личное сообщение · #11

mysterio пишет:
Возможно имеет смысл поставить лидирующий 0


Не помогло


progopis пишет:
А вообще ты уверен что проверка обламывается именно на уровне thisform.text2.value ?


Не уверен... если чесно..

Первый параметр VAL(ALLTRIM(thisform.text1.value)) и третий VAL(ALLTRIM(thisform.text3.value))
я так толком и не понял что с ними надо сделать?

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 апреля 2009 22:55
· Личное сообщение · #12

DaRKSiDE пишет:
я так толком и не понял что с ними надо сделать?


VAL(ALLTRIM(thisform.text3.value))=table_stzatrat2.zat2

Третья часть серийника фиксированная и лежит в базе данных. Стало быть надо копать там.



Ранг: 123.0 (ветеран), 10thx
Активность: 0.060
Статус: Участник

Создано: 05 апреля 2009 23:23 · Поправил: Ultras
· Личное сообщение · #13

Да там и первая и третья части в базе, а середина считается от серийника раздела.
Первая: VAL(ALLTRIM(thisform.text1.value))=table_stzatrat2.zat1
Третья: VAL(ALLTRIM(thisform.text3.value))=table_stzatrat2.zat2
Таблицу table_stzatrat2 в студию

При расчете второй части вы забываете про проверку на отрицат. код серийника раздела:
l_sern = snn
IF l_sern<0
l_sern = 4294967296 +l_sern // 429496729 = 0x100000000
ENDIF

А чтобы узнать отриц. он или нет надо посмотреть границы числового типа в фоксе.
На этом же фоксе можно и скомпилять генератор, рипнув алго, если лень считать

-----
.[ rE! p0w4 ].





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 05 апреля 2009 23:56
· Личное сообщение · #14

Ultras пишет:
Таблицу table_stzatrat2 в студию


Да без проблем, только где там что искать... х.з.

f6b9_05.04.2009_CRACKLAB.rU.tgz - table_stzatrat2.dbf

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 06 апреля 2009 00:10 · Поправил: progopis
· Личное сообщение · #15

Ultras
Вообще-то мы учитывали что число 1678166144 > 0.

Ultras пишет
Первая: VAL(ALLTRIM(thisform.text1.value))=table_stzatrat2.zat1


Ты точно знаешь Visual FoxPro?

Code:
  1. llm = 1
  2.  USE data1!table_stzatrat2 IN 0
  3.  SELECT table_stzatrat2
  4.  GOTO TOP
  5.  DO WHILE llm<1001 .AND. VAL(ALLTRIM(thisform.text1.value))<>table_stzatrat2.zat1
  6.     llm = llm+1
  7.     GOTO llm
  8.  ENDDO


Что делает этот код понимаешь? Он перебирает первую часть по базе среди 1000 фиксированных возможных значений. GOTO в FoxPro не тоже самое что, например, в VB. Это оператор управления базой данных. Читаем здесь:

http://www.alvechurchdata.co.uk/fox101goto.htm

DaRKSiDE
Что-то база твоя база у меня не хочет открываться. Можешь перевыложить на обменник?




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 06 апреля 2009 00:26
· Личное сообщение · #16

Все... ЗАРАБОТАЛО!!!
Так и есть, 1 и 3 параметр из таблици, причем можно в рендоме выбирать номер и 2-й параметр с нулем впереди ...
Можно типа кейгена накропать теперь ... хе..хе..
Спасибо всем огромное...

-----
aLL rIGHTS rEVERSED!




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 06 апреля 2009 00:37
· Личное сообщение · #17

Тогда думаю можно закрыть. Если надо будет открыть - пиши в личку.


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