Разблокировка сканирования банкнот на сканере EPSON Perfection V10/V100
Разблокировка сканирования банкнот на сканере EPSON Perfection V10/V100
На днях решил пополнить коллекцию картинок отсканированными изображениями банкнот разных стран. Сканер EPSON Perfection V10/V100 без проблем проглотил отечественные рубли, американские доллары, египетские фунты с пиастрами, китайские юани, иорданские и тунисские динары. А вот при сканировании банкнот евро вместо ожидаемого результата я внезапно получил сообщение о том, что я не имею права сканировать эти банкноты и обрабатывать их изображения. Я уже не один год спокойно пользовался штатным софтом, который идет в комплекте со сканером, поэтому такой закидон оказался для меня неожиданностью.
Сообщение об ограничении сканирования
Это просто немыслимо и не лезет вообще ни в какие ворота. Как может кусок пластика и кучка каких-то безымянных деятелей, запрограммировавших его, решать за меня, что мне можно сканировать, а что нельзя?! Я заплатил за сканер деньги, и волен засовывать в него что угодно, хоть книжки с картинками, хоть евро, да хоть жопу, если мне вдруг понадобится ее скан.
Теперь поищем, откуда это сообщение появляется. Контекстным поиском по всем файлам в папке сканерного софта была обнаружена динамическая библиотека esimgdet.dll, в которой это сообщение находится. Отправляем ее в дизассемблер, параллельно посмотрим, где и как эта строка используется. В ресурсах она одна единственная, да еще и с индексом 1.
Единственная строка в ресурсах
Искать одинокую единичку в коде - это заведомо провальное занятие. Надо попробовать какой-нибудь другой путь. При нажатии в диалоговом окне кнопки Information, открывается говносайт с подробной информацией об этих самых ограничениях. А раз открывается ссылка, значит она тоже где-то должна быть. Далеко ходить не пришлось, вот она:
Строка ссылки в файле
В дизассемблере начинаем раскручивать цепочку вызовов. Функция открытия ссылки:
Code (Assembler) : Убрать нумерацию
- ; Открыть ссылку в браузере по умолчанию
- .text:10001E40 sub_10001E40 proc near
- .text:10001E40 push 1 ; nShowCmd
- .text:10001E42 push 0 ; lpDirectory
- .text:10001E44 push offset Parameters ; "explore.exe"
- .text:10001E49 push offset File
- ; "http://www.rulesforuse.org"
- .text:10001E4E push 0 ; lpOperation
- .text:10001E50 push 0 ; hwnd
- .text:10001E52 call ds:ShellExecuteA
- .text:10001E58 retn
- .text:10001E58 sub_10001E40 endp
Code (Assembler) : Убрать нумерацию
- .text:10001E60 sub_10001E60 proc near
- .text:10001E60 mov ecx, [esp+arg_4]
- .text:10001E64 mov eax, ecx
- .text:10001E66 and eax, 0FFFFh
- .text:10001E6B cmp eax, 110h
- .text:10001E70 jg short loc_10001EB7
- .text:10001E72 jz short loc_10001E9E
- .text:10001E74 sub eax, 2
- .text:10001E77 jz short loc_10001E83
- .text:10001E79 sub eax, 29h
- .text:10001E7C jnz short loc_10001E9B
- .text:10001E7E jmp sub_10001D90
- .text:10001E83 ; --------------------------------------
- .text:10001E83 loc_10001E83:
- .text:10001E83 mov eax, hWnd
- .text:10001E88 push 1 ; nResult
- .text:10001E8A push eax ; hDlg
- .text:10001E8B call ds:EndDialog
- .text:10001E91 mov hWnd, 0
- .text:10001E9B loc_10001E9B:
- .text:10001E9B xor al, al
- .text:10001E9D retn
- .text:10001E9E ; ---------------------------------------
- .text:10001E9E loc_10001E9E:
- .text:10001E9E mov edx, [esp+arg_C]
- .text:10001EA2 mov eax, [esp+arg_8]
- .text:10001EA6 push edx
- .text:10001EA7 push eax
- .text:10001EA8 push ecx
- .text:10001EA9 mov ecx, [esp+0Ch+arg_0]
- .text:10001EAD push ecx
- .text:10001EAE call sub_10001BB0
- .text:10001EB3 add esp, 10h
- .text:10001EB6 retn
- .text:10001EB7 ; --------------------------------------------
- .text:10001EB7 loc_10001EB7:
- .text:10001EB7 cmp eax, 111h
- .text:10001EBC jnz short loc_10001E9B
- .text:10001EBE mov eax, [esp+arg_8]
- .text:10001EC2 cmp ax, 1
- .text:10001EC6 jnz short loc_10001ED0
- .text:10001EC8 call sub_10001E40
- .text:10001ECD mov al, 1
- .text:10001ECF retn
- .text:10001ED0 ; --------------------------------------------
- .text:10001ED0 loc_10001ED0:
- .text:10001ED0 cmp ax, 2
- .text:10001ED4 jnz short loc_10001E9B
- .text:10001ED6 call sub_10001B90
- .text:10001EDB mov al, 1
- .text:10001EDD retn
- .text:10001EDD sub_10001E60 endp
Code (Assembler) : Убрать нумерацию
- .text:10001920 DialogFunc proc near
- .text:10001920 mov eax, [esp+arg_C]
- .text:10001924 mov ecx, [esp+arg_8]
- .text:10001928 mov edx, [esp+arg_4]
- .text:1000192C push eax
- .text:1000192D mov eax, [esp+4+arg_0]
- .text:10001931 push ecx
- .text:10001932 push edx
- .text:10001933 push eax
- .text:10001934 call sub_10001E60
- .text:10001939 add esp, 10h
- .text:1000193C and eax, 0FFh
- .text:10001941 retn 10h
- .text:10001941 DialogFunc endp
Code (Assembler) : Убрать нумерацию
- .text:10001B20 sub_10001B20 proc near
- .text:10001B20 TemplateName = byte ptr -14h
- .text:10001B20 hWndParent = dword ptr 4
- .text:10001B20 sub esp, 14h
- .text:10001B23 push esi
- .text:10001B24 push edi
- .text:10001B25 call ds:GetUserDefaultLCID
- .text:10001B2B and eax, 0FFh
- .text:10001B30 cmp eax, 9
- .text:10001B33 jz short loc_10001B38
- .text:10001B35 cmp eax, 11h
- .text:10001B38 loc_10001B38:
- .text:10001B38 mov edi, offset aImgdetaction_a
- ; "ImgDetACTION_A"
- .text:10001B3D or ecx, 0FFFFFFFFh
- .text:10001B40 xor eax, eax
- .text:10001B42 lea edx, [esp+1Ch+TemplateName]
- .text:10001B46 repne scasb
- .text:10001B48 not ecx
- .text:10001B4A sub edi, ecx
- .text:10001B4C push 0 ; dwInitParam
- .text:10001B4E mov eax, ecx
- .text:10001B50 mov esi, edi
- .text:10001B52 mov edi, edx
- .text:10001B54 push offset DialogFunc ; lpDialogFunc
- .text:10001B59 shr ecx, 2
- .text:10001B5C rep movsd
- .text:10001B5E mov ecx, eax
- .text:10001B60 lea edx, [esp+24h+TemplateName]
- .text:10001B64 and ecx, 3
- .text:10001B67 rep movsb
- .text:10001B69 mov ecx, [esp+24h+hWndParent]
- .text:10001B6D push ecx ; hWndParent
- .text:10001B6E push edx ; lpTemplateName
- .text:10001B6F push offset ModuleName ; "EsImgDet.dll"
- .text:10001B74 call ds:GetModuleHandleA
- .text:10001B7A push eax ; hInstance
- .text:10001B7B call ds:DialogBoxParamA
- .text:10001B81 pop edi
- .text:10001B82 pop esi
- .text:10001B83 add esp, 14h
- .text:10001B86 retn
- .text:10001B86 sub_10001B20 endp
Code (Assembler) : Убрать нумерацию
- .text:10001A00 public EsImgDetSecureDetectImage
- .text:10001A00 EsImgDetSecureDetectImage proc near
- .text:10001A00
- .text:10001A00 var_1C = byte ptr -1Ch
- .text:10001A00 var_18 = dword ptr -18h
- .text:10001A00 arg_0 = dword ptr 4
- .text:10001A00 hWndParent = dword ptr 8
- .text:10001A00 arg_8 = dword ptr 0Ch
- .text:10001A00 arg_C = dword ptr 10h
- .text:10001A00
- .text:10001A00 mov eax, [esp+arg_C]
- .text:10001A04 mov ecx, [esp+arg_8]
- .text:10001A08 mov edx, dword_1000EA88
- .text:10001A0E sub esp, 1Ch
- .text:10001A11 push esi
- .text:10001A12 push eax
- .text:10001A13 push ecx
- .text:10001A14 mov ecx, dword_1000EA8C
- .text:10001A1A push edx
- .text:10001A1B call sub_100018F0
- .text:10001A20 test eax, eax
- .text:10001A22 jz short loc_10001A33
- .text:10001A24 mov eax, [esp+20h+arg_0]
- .text:10001A28 pop esi
- ; Код возврата = -1
- .text:10001A29 mov dword ptr [eax], 0FFFFFFFFh
- .text:10001A2F add esp, 1Ch
- .text:10001A32 retn
- .text:10001A33 ; ----------------------------------------
- .text:10001A33 loc_10001A33:
- .text:10001A33 mov edx, dword_1000EA88
- .text:10001A39 lea ecx, [esp+20h+arg_C]
- .text:10001A3D push ecx
- .text:10001A3E mov ecx, dword_1000EA8C
- .text:10001A44 push edx
- .text:10001A45 call sub_100013B0
- .text:10001A4A test eax, eax
- .text:10001A4C jz short loc_10001A5D
- .text:10001A4E loc_10001A4E:
- .text:10001A4E mov eax, [esp+20h+arg_0]
- .text:10001A52 pop esi
- ; Код возврата = -1
- .text:10001A53 mov dword ptr [eax], 0FFFFFFFFh
- .text:10001A59 add esp, 1Ch
- .text:10001A5C retn
- .text:10001A5D ; ---------------------------------------
- .text:10001A5D loc_10001A5D:
- .text:10001A5D mov eax, [esp+20h+arg_C]
- .text:10001A61 xor esi, esi
- .text:10001A63 test eax, eax
- .text:10001A65 jbe short loc_10001A93
- .text:10001A67 loc_10001A67:
- .text:10001A67 mov edx, dword_1000EA88
- .text:10001A6D lea ecx, [esp+20h+var_1C]
- .text:10001A71 push ecx
- .text:10001A72 mov ecx, dword_1000EA8C
- .text:10001A78 push esi
- .text:10001A79 push edx
- .text:10001A7A call sub_100013D0
- .text:10001A7F test eax, eax
- .text:10001A81 jnz short loc_10001A4E
- .text:10001A83 cmp [esp+20h+var_18], 1
- .text:10001A88 jz short loc_10001AA2
- .text:10001A8A mov eax, [esp+20h+arg_C]
- .text:10001A8E inc esi
- .text:10001A8F cmp esi, eax
- .text:10001A91 jb short loc_10001A67
- .text:10001A93 loc_10001A93:
- .text:10001A93 mov eax, [esp+20h+arg_0]
- .text:10001A97 pop esi
- ; Код возврата = 0
- .text:10001A98 mov dword ptr [eax], 0
- .text:10001A9E add esp, 1Ch
- .text:10001AA1 retn
- .text:10001AA2 ; --------------------------------------
- .text:10001AA2 loc_10001AA2:
- ; Вот тут вызывается диалоговое окно
- .text:10001AA2 mov ecx, [esp+20h+hWndParent]
- .text:10001AA6 push ecx ; hWndParent
- .text:10001AA7 call sub_10001B20
- .text:10001AAC mov edx, [esp+24h+arg_0]
- .text:10001AB0 add esp, 4
- ; Код возврата = 1
- .text:10001AB3 mov dword ptr [edx], 1
- .text:10001AB9 pop esi
- .text:10001ABA add esp, 1Ch
- .text:10001ABD retn
- .text:10001ABD EsImgDetSecureDetectImage endp
Сообщение об ошибке
Не тут-то было. Значит код возврата -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? А то отредактировать его у меня получилось, а скомпилировать измененный файл не могу :( Или подскажите чем собрать файл. Заранее благодарен
Имеется та же проблема. Можете выложить модифицированный 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>, думаю встроенное ПО не распознает что сканят.
удачи в опытах по сканированию
я так понял, что в памяти принтера зашиты изображения банкнот в горизонтальном и вертикальном положении.
попробуйте <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
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 этот самый бакс...
И немного оффтопика - на днях в автобусе по телеку видел почему доллары зовут баксами - оказывается от слов buck (самец оленя) шкурка которого стоила ровно 1 этот самый бакс...
DimitarSerg
(24.11.2013 в 15:15):
Понравилась статья. Не знал, что такое вообще есть. Полностью согласен, что не железке решать, что я могу сканировать, а что нет.
А так, пользую VueScan уже очень давно, даже не представляю, чем еще можно сканировать в винде :) (шутка, но это однозначно софт №1)
А так, пользую VueScan уже очень давно, даже не представляю, чем еще можно сканировать в винде :) (шутка, но это однозначно софт №1)
ManHunter
(19.11.2013 в 01:11):
Adobe Photoshop CS6 тоже научил хорошим манерам, так что скоро будет и статья на эту тему.
ManHunter
(18.11.2013 в 11:19):
morgot, проверил на последней версии, действительно не дает редактировать. Видимо придется и про фотошоп аналогичную статейку тиснуть :(
Isaev, запускаю в XnView сканирование, процесс сканирования занимает меньше минуты, на это время у меня тоже родительская программа подвисает и переходит в спячку. Ну и ничо, мне эта минута погоды не делает. Так что это больше дело привычки.
Isaev, запускаю в XnView сканирование, процесс сканирования занимает меньше минуты, на это время у меня тоже родительская программа подвисает и переходит в спячку. Ну и ничо, мне эта минута погоды не делает. Так что это больше дело привычки.
Isaev
(18.11.2013 в 00:50):
"Андрей (15.11.2013 в 10:09): Из любопытства: чем vuescan не нравится ?"
Вот его и пользую, более стабильно работает, чем стандартный софт
Вот его и пользую, более стабильно работает, чем стандартный софт
Isaev
(17.11.2013 в 23:51):
"Я уже не один год спокойно пользовался штатным софтом"
А как??? я например больше пары дней им пользоваться не смог) Программисты видимо совсем кривые. при сканировании сообщения не обрабатываются прога напрочь виснет и тупо ничего нельзя делать пока не закончится опирация..
В общем прогой из комплекта никак пользоваться не смог (у меня сканер тот же, только V330)
А как??? я например больше пары дней им пользоваться не смог) Программисты видимо совсем кривые. при сканировании сообщения не обрабатываются прога напрочь виснет и тупо ничего нельзя делать пока не закончится опирация..
В общем прогой из комплекта никак пользоваться не смог (у меня сканер тот же, только 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/Кольца_Омрона
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, извиняюсь, но вот так...
ManHunter, извиняюсь, но вот так...
irokkezz
(14.11.2013 в 22:25):
Красавец ) Особенно понравилось про кусок пластика и .... )))
Добавить комментарий
Заполните форму для добавления комментария