Blog. Just Blog

Разблокировка сканирования банкнот на сканере EPSON Perfection V10/V100

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Разблокировка сканирования банкнот на сканере EPSON Perfection V10/V100
Разблокировка сканирования банкнот на сканере EPSON Perfection V10/V100

На днях решил пополнить коллекцию картинок отсканированными изображениями банкнот разных стран. Сканер EPSON Perfection V10/V100 без проблем проглотил отечественные рубли, американские доллары, египетские фунты с пиастрами, китайские юани, иорданские и тунисские динары. А вот при сканировании банкнот евро вместо ожидаемого результата я внезапно получил сообщение о том, что я не имею права сканировать эти банкноты и обрабатывать их изображения. Я уже не один год спокойно пользовался штатным софтом, который идет в комплекте со сканером, поэтому такой закидон оказался для меня неожиданностью.

Сообщение об ограничении сканирования
Сообщение об ограничении сканирования

Это просто немыслимо и не лезет вообще ни в какие ворота. Как может кусок пластика и кучка каких-то безымянных деятелей, запрограммировавших его, решать за меня, что мне можно сканировать, а что нельзя?! Я заплатил за сканер деньги, и волен засовывать в него что угодно, хоть книжки с картинками, хоть евро, да хоть жопу, если мне вдруг понадобится ее скан.

Теперь поищем, откуда это сообщение появляется. Контекстным поиском по всем файлам в папке сканерного софта была обнаружена динамическая библиотека esimgdet.dll, в которой это сообщение находится. Отправляем ее в дизассемблер, параллельно посмотрим, где и как эта строка используется. В ресурсах она одна единственная, да еще и с индексом 1.

Единственная строка в ресурсах
Единственная строка в ресурсах

Искать одинокую единичку в коде - это заведомо провальное занятие. Надо попробовать какой-нибудь другой путь. При нажатии в диалоговом окне кнопки Information, открывается говносайт с подробной информацией об этих самых ограничениях. А раз открывается ссылка, значит она тоже где-то должна быть. Далеко ходить не пришлось, вот она:

Строка ссылки в файле
Строка ссылки в файле

В дизассемблере начинаем раскручивать цепочку вызовов. Функция открытия ссылки:
  1. ; Открыть ссылку в браузере по умолчанию
  2. .text:10001E40 sub_10001E40    proc near
  3. .text:10001E40                 push    1               ; nShowCmd
  4. .text:10001E42                 push    0               ; lpDirectory
  5. .text:10001E44                 push    offset Parameters ; "explore.exe"
  6. .text:10001E49                 push    offset File     
  7. ; "http://www.rulesforuse.org"
  8. .text:10001E4E                 push    0               ; lpOperation
  9. .text:10001E50                 push    0               ; hwnd
  10. .text:10001E52                 call    ds:ShellExecuteA
  11. .text:10001E58                 retn
  12. .text:10001E58 sub_10001E40    endp
Функция обработчика диалогового окна, из которого открывается ссылка:
  1. .text:10001E60 sub_10001E60    proc near
  2. .text:10001E60                 mov     ecx, [esp+arg_4]
  3. .text:10001E64                 mov     eax, ecx
  4. .text:10001E66                 and     eax, 0FFFFh
  5. .text:10001E6B                 cmp     eax, 110h
  6. .text:10001E70                 jg      short loc_10001EB7
  7. .text:10001E72                 jz      short loc_10001E9E
  8. .text:10001E74                 sub     eax, 2
  9. .text:10001E77                 jz      short loc_10001E83
  10. .text:10001E79                 sub     eax, 29h
  11. .text:10001E7C                 jnz     short loc_10001E9B
  12. .text:10001E7E                 jmp     sub_10001D90
  13. .text:10001E83 ; --------------------------------------
  14. .text:10001E83 loc_10001E83:
  15. .text:10001E83                 mov     eax, hWnd
  16. .text:10001E88                 push    1               ; nResult
  17. .text:10001E8A                 push    eax             ; hDlg
  18. .text:10001E8B                 call    ds:EndDialog
  19. .text:10001E91                 mov     hWnd, 0
  20. .text:10001E9B loc_10001E9B:
  21. .text:10001E9B                 xor     al, al
  22. .text:10001E9D                 retn
  23. .text:10001E9E ; ---------------------------------------
  24. .text:10001E9E loc_10001E9E:
  25. .text:10001E9E                 mov     edx, [esp+arg_C]
  26. .text:10001EA2                 mov     eax, [esp+arg_8]
  27. .text:10001EA6                 push    edx
  28. .text:10001EA7                 push    eax
  29. .text:10001EA8                 push    ecx
  30. .text:10001EA9                 mov     ecx, [esp+0Ch+arg_0]
  31. .text:10001EAD                 push    ecx
  32. .text:10001EAE                 call    sub_10001BB0
  33. .text:10001EB3                 add     esp, 10h
  34. .text:10001EB6                 retn
  35. .text:10001EB7 ; --------------------------------------------
  36. .text:10001EB7 loc_10001EB7:
  37. .text:10001EB7                 cmp     eax, 111h
  38. .text:10001EBC                 jnz     short loc_10001E9B
  39. .text:10001EBE                 mov     eax, [esp+arg_8]
  40. .text:10001EC2                 cmp     ax, 1
  41. .text:10001EC6                 jnz     short loc_10001ED0
  42. .text:10001EC8                 call    sub_10001E40
  43. .text:10001ECD                 mov     al, 1
  44. .text:10001ECF                 retn
  45. .text:10001ED0 ; --------------------------------------------
  46. .text:10001ED0 loc_10001ED0:
  47. .text:10001ED0                 cmp     ax, 2
  48. .text:10001ED4                 jnz     short loc_10001E9B
  49. .text:10001ED6                 call    sub_10001B90
  50. .text:10001EDB                 mov     al, 1
  51. .text:10001EDD                 retn
  52. .text:10001EDD sub_10001E60    endp
Еще какая-то промежуточная функция:
  1. .text:10001920 DialogFunc      proc near
  2. .text:10001920                 mov     eax, [esp+arg_C]
  3. .text:10001924                 mov     ecx, [esp+arg_8]
  4. .text:10001928                 mov     edx, [esp+arg_4]
  5. .text:1000192C                 push    eax
  6. .text:1000192D                 mov     eax, [esp+4+arg_0]
  7. .text:10001931                 push    ecx
  8. .text:10001932                 push    edx
  9. .text:10001933                 push    eax
  10. .text:10001934                 call    sub_10001E60
  11. .text:10001939                 add     esp, 10h
  12. .text:1000193C                 and     eax, 0FFh
  13. .text:10001941                 retn    10h
  14. .text:10001941 DialogFunc      endp
И еще одна...
  1. .text:10001B20 sub_10001B20    proc near
  2. .text:10001B20 TemplateName    = byte ptr -14h
  3. .text:10001B20 hWndParent      = dword ptr  4
  4. .text:10001B20                 sub     esp, 14h
  5. .text:10001B23                 push    esi
  6. .text:10001B24                 push    edi
  7. .text:10001B25                 call    ds:GetUserDefaultLCID
  8. .text:10001B2B                 and     eax, 0FFh
  9. .text:10001B30                 cmp     eax, 9
  10. .text:10001B33                 jz      short loc_10001B38
  11. .text:10001B35                 cmp     eax, 11h
  12. .text:10001B38 loc_10001B38:
  13. .text:10001B38                 mov     edi, offset aImgdetaction_a
  14. ; "ImgDetACTION_A"
  15. .text:10001B3D                 or      ecx, 0FFFFFFFFh
  16. .text:10001B40                 xor     eax, eax
  17. .text:10001B42                 lea     edx, [esp+1Ch+TemplateName]
  18. .text:10001B46                 repne scasb
  19. .text:10001B48                 not     ecx
  20. .text:10001B4A                 sub     edi, ecx
  21. .text:10001B4C                 push    0               ; dwInitParam
  22. .text:10001B4E                 mov     eax, ecx
  23. .text:10001B50                 mov     esi, edi
  24. .text:10001B52                 mov     edi, edx
  25. .text:10001B54                 push    offset DialogFunc ; lpDialogFunc
  26. .text:10001B59                 shr     ecx, 2
  27. .text:10001B5C                 rep movsd
  28. .text:10001B5E                 mov     ecx, eax
  29. .text:10001B60                 lea     edx, [esp+24h+TemplateName]
  30. .text:10001B64                 and     ecx, 3
  31. .text:10001B67                 rep movsb
  32. .text:10001B69                 mov     ecx, [esp+24h+hWndParent]
  33. .text:10001B6D                 push    ecx             ; hWndParent
  34. .text:10001B6E                 push    edx             ; lpTemplateName
  35. .text:10001B6F                 push    offset ModuleName ; "EsImgDet.dll"
  36. .text:10001B74                 call    ds:GetModuleHandleA
  37. .text:10001B7A                 push    eax             ; hInstance
  38. .text:10001B7B                 call    ds:DialogBoxParamA
  39. .text:10001B81                 pop     edi
  40. .text:10001B82                 pop     esi
  41. .text:10001B83                 add     esp, 14h
  42. .text:10001B86                 retn
  43. .text:10001B86 sub_10001B20    endp
И финальный пункт наших копаний внутри этой матрешки - функция, из которой открывается диалоговое окно с текстом об ограничениях. Она даже именная и даже экспортируется наружу из этой библиотеки.
  1. .text:10001A00                 public EsImgDetSecureDetectImage
  2. .text:10001A00 EsImgDetSecureDetectImage proc near
  3. .text:10001A00
  4. .text:10001A00 var_1C          = byte ptr -1Ch
  5. .text:10001A00 var_18          = dword ptr -18h
  6. .text:10001A00 arg_0           = dword ptr  4
  7. .text:10001A00 hWndParent      = dword ptr  8
  8. .text:10001A00 arg_8           = dword ptr  0Ch
  9. .text:10001A00 arg_C           = dword ptr  10h
  10. .text:10001A00
  11. .text:10001A00                 mov     eax, [esp+arg_C]
  12. .text:10001A04                 mov     ecx, [esp+arg_8]
  13. .text:10001A08                 mov     edx, dword_1000EA88
  14. .text:10001A0E                 sub     esp, 1Ch
  15. .text:10001A11                 push    esi
  16. .text:10001A12                 push    eax
  17. .text:10001A13                 push    ecx
  18. .text:10001A14                 mov     ecx, dword_1000EA8C
  19. .text:10001A1A                 push    edx
  20. .text:10001A1B                 call    sub_100018F0
  21. .text:10001A20                 test    eax, eax
  22. .text:10001A22                 jz      short loc_10001A33
  23. .text:10001A24                 mov     eax, [esp+20h+arg_0]
  24. .text:10001A28                 pop     esi
  25. ; Код возврата = -1
  26. .text:10001A29                 mov     dword ptr [eax], 0FFFFFFFFh
  27. .text:10001A2F                 add     esp, 1Ch
  28. .text:10001A32                 retn
  29. .text:10001A33 ; ----------------------------------------
  30. .text:10001A33 loc_10001A33:
  31. .text:10001A33                 mov     edx, dword_1000EA88
  32. .text:10001A39                 lea     ecx, [esp+20h+arg_C]
  33. .text:10001A3D                 push    ecx
  34. .text:10001A3E                 mov     ecx, dword_1000EA8C
  35. .text:10001A44                 push    edx
  36. .text:10001A45                 call    sub_100013B0
  37. .text:10001A4A                 test    eax, eax
  38. .text:10001A4C                 jz      short loc_10001A5D
  39. .text:10001A4E loc_10001A4E:
  40. .text:10001A4E                 mov     eax, [esp+20h+arg_0]
  41. .text:10001A52                 pop     esi
  42. ; Код возврата = -1
  43. .text:10001A53                 mov     dword ptr [eax], 0FFFFFFFFh
  44. .text:10001A59                 add     esp, 1Ch
  45. .text:10001A5C                 retn
  46. .text:10001A5D ; ---------------------------------------
  47. .text:10001A5D loc_10001A5D:
  48. .text:10001A5D                 mov     eax, [esp+20h+arg_C]
  49. .text:10001A61                 xor     esi, esi
  50. .text:10001A63                 test    eax, eax
  51. .text:10001A65                 jbe     short loc_10001A93
  52. .text:10001A67 loc_10001A67:
  53. .text:10001A67                 mov     edx, dword_1000EA88
  54. .text:10001A6D                 lea     ecx, [esp+20h+var_1C]
  55. .text:10001A71                 push    ecx
  56. .text:10001A72                 mov     ecx, dword_1000EA8C
  57. .text:10001A78                 push    esi
  58. .text:10001A79                 push    edx
  59. .text:10001A7A                 call    sub_100013D0
  60. .text:10001A7F                 test    eax, eax
  61. .text:10001A81                 jnz     short loc_10001A4E
  62. .text:10001A83                 cmp     [esp+20h+var_18], 1
  63. .text:10001A88                 jz      short loc_10001AA2
  64. .text:10001A8A                 mov     eax, [esp+20h+arg_C]
  65. .text:10001A8E                 inc     esi
  66. .text:10001A8F                 cmp     esi, eax
  67. .text:10001A91                 jb      short loc_10001A67
  68. .text:10001A93 loc_10001A93:
  69. .text:10001A93                 mov     eax, [esp+20h+arg_0]
  70. .text:10001A97                 pop     esi
  71. ; Код возврата = 0
  72. .text:10001A98                 mov     dword ptr [eax], 0
  73. .text:10001A9E                 add     esp, 1Ch
  74. .text:10001AA1                 retn
  75. .text:10001AA2 ; --------------------------------------
  76. .text:10001AA2 loc_10001AA2:
  77. ; Вот тут вызывается диалоговое окно
  78. .text:10001AA2                 mov     ecx, [esp+20h+hWndParent]
  79. .text:10001AA6                 push    ecx             ; hWndParent
  80. .text:10001AA7                 call    sub_10001B20
  81. .text:10001AAC                 mov     edx, [esp+24h+arg_0]
  82. .text:10001AB0                 add     esp, 4
  83. ; Код возврата = 1
  84. .text:10001AB3                 mov     dword ptr [edx], 1
  85. .text:10001AB9                 pop     esi
  86. .text:10001ABA                 add     esp, 1Ch
  87. .text:10001ABD                 retn
  88. .text:10001ABD EsImgDetSecureDetectImage endp
Обратите внимание, что функция имеет несколько точек выхода, а именно четыре. Две из них возвращают код -1 (он же 0FFFFFFFFh), одна возвращает код 0 и одна, в которой открывается окно с запретом, возвращает код 1. Нетрудно догадаться, что "правильных" кодов возврата всего два - это 0 и -1. Чтобы не утруждать себя лишним кодокопанием, я просто заNOPлю условный переход по адресу 10001A22, чтобы код возврата всегда был -1. Сохраняем изменения, пытаемся сканировать.

Сообщение об ошибке
Сообщение об ошибке

Не тут-то было. Значит код возврата -1 соответствует ошибке. Остается второй вариант с нулевым кодом возврата. Заменяем аргумент функции MOV по адресу 10001A29 с -1 на 0. Сохраняем изменения, пробуем.

Банкнота успешно отсканирована
Банкнота успешно отсканирована

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

Поделиться ссылкой ВКонтакте
Просмотров: 15459 | Комментариев: 30

Метки: реверсинг
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Soiam (03.01.2022 в 12:54):
Спасибо, статья помогла. У меня библиотека более свежей версии, покопался Hiew, в результате поменял возвращаемые значения с 1 на 0 в двух местах и сделал выход из функции показа диалогового окна сразу же в ее начале, чтобы диалог не вызывался. Все работает.
ManHunter (22.04.2017 в 09:18):
Никаких ломаных файлов на этом сайте никогда не будет.
Alchemist (21.04.2017 в 22:11):
Добрый вечер!

Имеется та же проблема. Можете выложить модифицированный dll? А то отредактировать его у меня получилось, а скомпилировать измененный файл не могу :( Или подскажите чем собрать файл. Заранее благодарен
ManHunter (03.03.2016 в 12:21):
В русском языке сперва разберись, работодатель.
Tony (16.10.2015 в 00:08):
скин мне свой адрес Емаил, есть работенка если вы разберетесь в программных языках
ali (19.03.2014 в 21:05):
Спасибо за программу. Файл удалось подправить. Но вот блокировку снять не получилось.
ManHunter (19.03.2014 в 08:56):
google -> HiEW
ali (19.03.2014 в 03:16):
Отличная статья! У меня epson V350. Нашел место, где править. Но не нашел чем править. Можете помочь?
ManHunter (29.11.2013 в 11:19):
1ламер, там принцип совершенно другой. Ниже в камментах есть ссылки на "Кольца Омрона". Они не зависят от конкретной валюты, например, если их в правильном порядке нарисовать на рулоне жопной бумаги, то сканер и ее будет определять как денежку. И на банкнотах эти созвездия расположены под разным углами, специально для таких хитрых.
1ламер (29.11.2013 в 11:03):
у меня старый Эпсон. сканирует всё что попало и доллары и юани и евро.

я так понял, что в памяти принтера зашиты изображения банкнот в горизонтальном и вертикальном положении.
попробуйте <b>положить купюру по диагонали</b>, думаю встроенное ПО не распознает что сканят.
удачи в опытах по сканированию
ManHunter (27.11.2013 в 10:43):
Зачем мне чужие поделия, я и сам справлюсь :)
Compiller (25.11.2013 в 14:17):
Google выдал
http://rghost.ru/46879329
Adobe.CS6.WIN.Medicines - AIO.rar
там внутри есть вот это
adobe.photoshop.cs6.v13.0.x86.banknote.protection.removal-ismail.exe
Compiller (25.11.2013 в 14:00):
Защита подобного типа была ещё в Adobe Photoshop 8.0 CS? даже патч был помнится. Кому-то в студенческое общежитие на свадьбу баксы с лицом молодоженов печатали.
И немного оффтопика - на днях в автобусе по телеку видел почему доллары зовут баксами - оказывается от слов buck (самец оленя) шкурка которого стоила ровно 1 этот самый бакс...
DimitarSerg (24.11.2013 в 15:15):
Понравилась статья. Не знал, что такое вообще есть. Полностью согласен, что не железке решать, что я могу сканировать, а что нет.
А так, пользую VueScan уже очень давно, даже не представляю, чем еще можно сканировать в винде :) (шутка, но это однозначно софт №1)
ManHunter (19.11.2013 в 01:11):
Adobe Photoshop CS6 тоже научил хорошим манерам, так что скоро будет и статья на эту тему.
ManHunter (18.11.2013 в 11:19):
morgot, проверил на последней версии, действительно не дает редактировать. Видимо придется и про фотошоп аналогичную статейку тиснуть :(

Isaev, запускаю в XnView сканирование, процесс сканирования занимает меньше минуты, на это время у меня тоже родительская программа подвисает и переходит в спячку. Ну и ничо, мне эта минута погоды не делает. Так что это больше дело привычки.
Isaev (18.11.2013 в 00:50):
"Андрей (15.11.2013 в 10:09): Из любопытства: чем vuescan не нравится ?"
Вот его и пользую, более стабильно работает, чем стандартный софт
Isaev (17.11.2013 в 23:51):
"Я уже не один год спокойно пользовался штатным софтом"
А как??? я например больше пары дней им пользоваться не смог) Программисты видимо совсем кривые. при сканировании сообщения не обрабатываются прога напрочь виснет и тупо ничего нельзя делать пока не закончится опирация..
В общем прогой из комплекта никак пользоваться не смог (у меня сканер тот же, только V330)
morgot (17.11.2013 в 21:06):
Спасибо, полезная тема.
Кстати, в фотошопе последних версий тоже нельзя редактировать евро.
Александр (17.11.2013 в 01:22):
Спасибо, ManHunter. Столкнулся с подобной проблемой, но у принтера Epson Stylus Photo T50. Ехал в Турцию, хотел прихватить образцы купюр, чтобы легче ориентироваться. А он отказывается печатать, пишет то же самое, что твой сканер. У меня, конечно, уровень не твой, чтобы по драйверам лазить. После долгих попыток понял, что купюры с высоким разрешением распечатать не удастся. Взял картинки со 100 dpi, вставил в вордовский документ и распечатал. Черно-белые тоже можно распечатать. А цветные с высоким разрешением никак. Так что у тебя всегда хватит работы. Удачи, и еще раз спасибо за блог.
Омрон (16.11.2013 в 23:12):
Кстати, не только Евро, но и многие другие валюты имеют подобную защиту:
http://ru.wikipedia.org/wiki/С...здие_Евриона
http://ru.wikipedia.org/wiki/Кольца_Омрона
ManHunter (16.11.2013 в 20:52):
Софт вполне могут писать и не в Японии, тем более что производителей могут принуждать к вводу таких ограничений, например, путем (не)выдачи обязательных сертификатов для продажи техники на территории Европы и/или других стран.
В свое время я был на курсах менеджеров по продажам копировальной техники, там тоже стоят такие ограничения на сканирование банкнот. Причем их обойти на софтовом уровне вряд ли получится, это все зашито внутри аппарата.
Станислав (16.11.2013 в 16:21):
Очень понятно возмущение)))
Удивило другое то что мной очень уважаемый Эпсон, имеет какието дела с Евросоюзом, возможно в Европпе стоит заводик на котором без ведома Эпсона и впаривают такое заботливое по. Сомневаюсь что японцам небезразлична судьба евро...
ManHunter (15.11.2013 в 13:23):
Главное, что никаких ограничений нет и быть не должно :)
Grey (15.11.2013 в 13:21):
Раз сканировали шарик от подшипника в тусклой надежде "поймать" его диаметр. На спор сканировали компакт диск (на предмет что получится в итоге). Жопу конечно не приходилось ничью сканировать, а вот дамские сиськи можно было на сканере посмотреть...)))
Андрей (15.11.2013 в 10:24):
А... Это же "twain-драйвер"...
Андрей (15.11.2013 в 10:09):
Из любопытства: чем vuescan не нравится ?
ManHunter (15.11.2013 в 07:24):
voila, был рассержен, потому такая подача. Ослабил формулировку.
voila (15.11.2013 в 05:06):
irokkezz, правильно по сути, но неправильно (неэтично/некрасиво) подано, и не соглашусь насчет "понравилось" (к слову, большой респект и за Ваши работы)
ManHunter, извиняюсь, но вот так...
irokkezz (14.11.2013 в 22:25):
Красавец ) Особенно понравилось про кусок пластика и .... )))

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 2 (0.005 сек.) / Память: 4.5 Mb
Наверх