Просмотр полной версии : Работаем с anti-captcha.com на ассемблере
По просьбе некоторых участников форума написал на ассемблере несколько процедур для работы с сервисом anti-captcha.com, спроектировал процедуры так, чтобы они могли в несколько потоков одновременно работать.
Для теста написал программу, которая может распознавать капчи в несколько потоков:
http://kaimi.ru/wp-content/uploads/2009/05/ac.png
Скачать исходники + exe (http://kaimi.ru/wp-content/uploads/2009/05/ac.zip)
Подробное описание кода (http://kaimi.ru/2009/05/anticaptcha-assembler/)
Hellsp@wn
10.05.2009, 15:35
мне кажется, лучше бы было сделать dll, в экспорт вывести пару функций и приложить подробное описание, чтобы можно было бы заюзать в любом софте. было бы полезнее :)
мне кажется, лучше бы было сделать dll, в экспорт вывести пару функций и приложить подробное описание, чтобы можно было бы заюзать в любом софте. было бы полезнее
Собрал dll и дополнительную версию проги для тестирования, которая работает с этой dll. Немного оптимизировал функции по размеру, dll получилась всего 4кб.
Описание функций, экспортируемых dll:
AntiCaptchaInit - вызывается для инициализации работы с антикапчей, ей не надо передавать параметры, вернет 0 в случае успеха.
AntiCaptcha - вызывается для отправки изображения на сервер. Вернет 0 в случае успеха или код ошибки.
Параметры:
AntiCaptcha PROC,
[указатель на память, куда записывать ID капчи - буфер не менее 30 байт, туда будет записана строка],
[указатель на строку с ключом антикапчи],
[1 или 0 - состоит ли капча из нескольких слов],
[1 или 0 - регистрозависима ли капча],
[1 или 0 - состоит ли капча только из цифр],
[минимальная длина капчи],
[максимальная длина капчи],
[указатель на строку с расширением, например, "jpg"],
[указатель на строку с типом, например "image/jpeg"],
[размер картинки в байтах],
[указатель на память, где загружена картинка]
Все параметры - DWORD.
AntiCaptchaAnswer - вызывается для получения распознанного варианта или статуса распознавания. Вернет 0 в случае успеха или код ошибки.
Параметры:
AntiCaptchaAnswer PROC,
[указатель на память, куда записать ответ],
[указатель на память с ID капчи, полученный с помощью предыдущей функции],
[указатель на строку с ключом антикапчи]
Все параметры - DWORD.
Коды возвращаемых функциями ошибок:
1 - ошибка при создании сокета
2 - ошибка при подключении
4 - ошибка при создании запроса
5 - ошибка при отправке данных
6 - ошибка при получении данных
7 - слишком большой ответ сервера
10 - капча пока не распознана
11 - неверный ключ
12 - все работники пока заняты
13 - нулевой баланс на аккаунте
14 - несуществующий ID капчи
20 - неопределенная ошибка
Еще две функции - SocketInit и SocketCleanup (им не надо передавать параметры) - это простые переходники для функций Win32api WSAStartup и WSACleanup, на всякий случай.
Скачать можно по той же ссылке в первом посте.
извините за оффтоп но можно сделать автособиратель на http://rublik.ru ?
опиши что вообще делает эта программа? для чего она?
Есть ресурс такой, anti-captcha.com, достаточно известный, для распознавания капч. У них есть свое api, и я написал несколько процедур для работы с ним. Программа - просто для теста их работы, зато прилагается еще dll, которая может работать с любым языком.
Для чего нужно распознавать капчи - догадайся сам-)
Вообще, код с описанием в образовательных целях хорошо пойдет - там мьютексы, потоки, сокеты...
перечитал стаью в поисках ошибок... вроде ничего кроме непонятного мне цикла с virtualAlloc в самом начале. дааа d_x ты маньяк!!! :D у меня конечно тоже есть программы в ~1000 строк кода на winAPI (помню делал собственную прорисовку всего интерфейса - скин, кнопочки цвет меняют все в общем крута
http://zona-chat.narod.ru/skin.gif
exe (http://zona-chat.narod.ru/skinapi.exe) )
но чтобы такое да на асме вай верх ппц :)
теперь научись делать UNICODE версии прог, потомучто все операции со строкам выше win9X ядро венды производит в UNICODE,а функции с дополнением *A (MessageBoxA...) затрачивают время на выделение памяти и конвертирование строк в UNICODE
я вот думаю если извращатся то уж по полной ! не юзать invoke, констант, описывать все нужные экспортируемые функции и тд :) изучаю fasm хех
разницы между размером exe миимальной winAPI проги в masm32 и VS2008 я не заметил (ну конечно надо с бубном танцевать там долго чтобы получить результат)... дело вкуса! ;)
2 d_x : я тебя сделаю! :) я накатал ща на masm-е пакетный сниффер в 3,5 кило хехе (правда функциональности в нем пока ноль, но уже уммет скидывать дамп входящего - исходнящего траффика на диск)
вопрос в асме есть указатели? или придется вот таким тупым макаром структуры разбирать
mov eax,offset buf
mov eax,[eax+2]
??? а то я как бе не знаю ) хех
Ну я как бы ни с кем не соревнуюсь, я просто ради интереса и практики софт писал, недавно изучив асм.
вопрос в асме есть указатели? или придется вот таким тупым макаром структуры разбирать
mov eax,offset buf
mov eax,[eax+2]
Что ты здесь подразумеваешь под указателями? Они там конечно есть, они постоянно используются, offset buf - это указатель.
Насчет структур - можно так (привожу кусок своего кода):
.data?
AC_SocketAddress sockaddr_in <>
;...
.code
MOV AC_SocketAddress.sin_addr,EAX
invoke htons,80
mov AC_SocketAddress.sin_port,AX
MOV AC_SocketAddress.sin_family,AF_INET
ну я имею ввиду нечто вроде
typedef struct gg
{
unsigned long a;
unsigned long b;
unsigned char c[16];
}
gg;
gg *ukaz;
ukaz=(gg *)(buffer);
printf("%d",ukaz->a);
чтобы как бы удобненько пользоватся. для снифака это особено актуально структуры пакетов, заголовки и тд
такое можно реализовать на асме?
А я что постом выше написал в блоке кода?)
ну это я тоже знаю, что можно делать структуры данных и туда значения заносить.
но допустим буффер - 50000 байт
заголовок пакета 44
unsigned char buffer[50000]; // 50000 выделеные в памяти (.data? buffer db 50000 dup(?))
str_paket *paket; // указатель на структуру пакета
paket=(str_paket *)&buffer[0]; // теперь указатель ссылкается на смещение buffer в памяти (offset buffer)
и мы можем крута и удобно юзать структуру ниче не перемещая не копируя и не заполняя
pkaet->zagolovok будет эквивалентно по offset buffer + 4
pkaet->zagolovok2 offset buffer + 8 там и тд
.... эм вопрос все тот же
Я, видимо, не настолько хорошо знаю си, чтобы найти какое-либо существенное отличие этого кода от того, что я написал. Да и зачем структуре в 44 байта буфер в 50000?
лан закроем тему нашу :)
пока нашел вот нечно подобное что я хочу получить
Применить определенную Вами структуру можно также и к набору дан-
ных, который создан не Вами. Например, получить доступ к первым
22 байтам PSP (префикс программного сегмента), которые MS-DOS по-
мещает в начало выполняемых файлов, можно через следующую струк-
туру:
PSP STRUC
INT32 DB 2 DUP (?) ; 2 байта
MemSize DW (?) ; 1 слово
Reserved DB (?) ; 1 байт
DOSCall DB 5 DUP (?) ; 5 байтов
TermVctr DW 2 DUP (?) ; 2 слова
BreakVctr DW 2 DUP (?) ; 2 слова
ErrorVctr DW 2 DUP (?) ; 2 слова
PSP ENDS
Получить доступ к PSP можно при помощи следующего программного
фрагмента:
mov di,0 ; PSP начинается со смещения 0
push cs ; сегмент PSP в cs
pop ds ; сегмент PSP -> ds
mov si,[di].MemSize ; размер памяти программы ->
; экстра сегмент
но вот как заставить ссылатся структуру другой адрес пока не придумал ) а тут тупо копирование ( похоже...
простым языком я хочу "наложить" свою структуру на уже имеющиеся данные ...
эх бум искать, уже хоть что-то
Как вариант придумал такое (не очень удобно, но копирования не производится и в масме работает):
s STRUCT ;описание структуры
aaaa WORD ?
bbbb WORD ?
cccc BYTE ?
dddd DWORD ?
eeee BYTE 8 dup(?)
s ENDS
.data ;имеющиеся у нас данные
buf db "aa"
db "bb"
db "c"
db "dddd"
db "eeeeeeee"
data ?
temp db 10 dup(?)
.code
start:
mov edi,offset buf
add edi,offset s.eeee ;получили доступ к последнему полю без какого-либо копирования данных
;это указывает на байты "eeeeeeee".
;или
mov edi,offset buf+offset s.bbbb
;если где-то нужно использовать структуру из памяти целиком, то можно написать просто offset buf...
Наверняка можно как-то более красиво написать)
лан закроем тему нашу :)
но вот как заставить ссылатся структуру другой адрес пока не придумал ) а тут тупо копирование ( похоже...
простым языком я хочу "наложить" свою структуру на уже имеющиеся данные ...
эх бум искать, уже хоть что-то
Доо, это прям анреальная задача. xD
Все что тебе нужно знать - это как работают перфикс rep и команды loads[b,d,w]/stos[b,d,w] или аналогичные movs[b,d,w].
2 SmanxX1
это конечно все хорошо, но одна закавыка - данные копируются...
мне правда очень понравилась функция SCAS - полезная
2 d_x
пока ниче круче констант equ не придумал... например
psp_INT32 equ 0
psp_MemSize equ 2
psp_Reserved equ 4
потом
lea esi,buffer
mov eax,[esi+psp_MemSize]
тоесть описывать смещения в структуре... наглядно выходит, но не очень удобно
всеравно все сводится к работе с регистрами а туда больше 4 байт запихнуть не получится... а так хоть наглядно
а в твоем примере драгоценные байты и такты тратятся на add
хм а можно интересно offset buff + offset s.eee
оказывается можно!!!
mov edi,offset buf + offset s.eee
работает!! )
а в твоем примере драгоценные байты и такты тратятся на add
хм а можно интересно offset buff + offset s.eee
оказывается можно!!!
mov edi,offset buf + offset s.eee
работает!! )
Ты посты невнимательно читаешь)
это конечно все хорошо, но одна закавыка - данные копируются...
И что? Ты представляешь себе альтернативный способ, хотябы в теории? Память все же не абстрактное пространство, в любом случаее, если что-то куда-то "перенести", то на прежднем месте что-нибудь останится, пусть даже те же нули.
...работе с регистрами а туда больше 4 байт запихнуть не получится
А как же 8ми битные регистры в 64ех разрядной архитектуре? (rax,rbx,rcx,rdx и т.д.). Пора бы их задействовать, т.к. процессоры с 32ух разрядной архитектурой уже как бэ давно не выпускаются.
(ну и что, что полно юзеров с древними компами, нужно двигать прогресс и неи**т D)
А как же 8ми битные регистры в 64ех разрядной архитектуре? (rax,rbx,rcx,rdx и т.д.). Пора бы их задействовать, т.к. процессоры с 32ух разрядной архитектурой уже как бэ давно не выпускаются.
Ну и зачем это? Автор добивался наоборот, что бы каждый заюзать мог. Да и написанное под 32 будет нормально пахать и под 64.
PS: ТС ты мазахист :) Большое спс за ддлку
2 SmanxX1 мы тут уже разабрались, а задача была не перенести а попытатся на одно и то же смещение повесть 2 разные переменные )
как оказалось в асме это не реально (я читал про union ...), но реально сделать таблицу смещений в виде структуры (как я и хотел изначально).
ну практических применений куча - PE заголовок, Секторы диска, заголовки сетевых пакетов и тд и тп.
асм мне начинает нравицццааа ы
Наверняка можно как-то более красиво написать)
наверняка можно ;)
mov ebx, NdisProtoHandle
assume ebx : ptr NDIS_PROTOCOL_BLOCK
mov ebx, [ebx].Next
kusanagi
27.08.2009, 17:10
подскажите вы использовати платные распознавания для теста программы или же есть бесплатный пакет для тестирования сервиса?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot