В данной статье я вам хочу рассказать как устроены терминалы/мульти-Кассы (
программно).
Начну с того что Все знают терминалы/мульти-Кассы, и как через них можно пополнить себе баланс на мобильные телефоны и различные платёжные системы,
Как все думают что бы нелегально пополнить себе на телефон, Нужно подключиться к терминалу,Знать логин и пороль.И сидеть и пополнять на халяву.
На самом деле ребята всё подругому.Все терминалы используют обычные
XML
запросы, которые отправляются на сервер с помощью шаблонов,У каждого терминала есть свои ключи(обычно это 64 битный ключ) С помощью этого ключа терминал авторизируеться на сервер для осуществления платежей. B)
Вот реальный пример с одного из терминалов:
|
Цитата: |
|
|
|
|
|
|
|
|
<REQUEST>
<PAYMENT>
<DEALER_INFO>
<DEALER_ID>%dealer%</DEALER_ID>
<TERMINAL_ID>%terminal% </TERMINAL_ID>
</DEALER_INFO>
<PAYMENT_INFO>
<OPERATOR>%operator%</OPERATOR>
<PHONE_NUMBER>%phone%</PHONE_NUMBER>
<HOLDER_FIRST_NAME>%firstname%</HOLDER_FIRST_NAME>
<HOLDER_SECOND_NAME>%lastname%</HOLDER_SECOND_NAME>
<HOLDER_MIDDLE_NAME>%middlename%</HOLDER_MIDDLE_NAME>
<AMOUNT>%summa%</AMOUNT>
<COMMENT>%comment%</COMMENT>
</PAYMENT_INFO>
</PAYMENT>
</REQUEST> |
|
|
|
|
|
Это формы запроса на сервер для авторизации.
|
Цитата: |
|
|
|
|
|
|
|
|
<?php
class AKS {
private $dealerid = "654852";
private $terminalid = "2";
function checkValues() {
}
function encrypt($data) {
$data = base64_encode($data);
$sapKey = <<<EOF
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC6GI5uaA7hEkgeP98VHL6TSxJwwPI+Mh+rFx KQPCgarT3/nZCS
Gz1r223+gfH/adV4IDvlbYT18VQ4vSspX+QRAidFeZvsfv99FewnwNoTL3LwYp/K
r9eW5YCpCEe8Crziks0vf92PNoHgNAL0iVo0Zma1ScDBSPBlQJ oZ1UiwoQIDAP//
AoGAMs3U9+LqKsWra8V1iPYA0LCoOmY2x8dwwqKwGQY1LPWGSW VqE/z5soJ6upxu
D9sRPLtxdWRqV5p4S3GX0QRZg7Jfb9vPdHpJXtZyQ4vxMdYyRR aSDT9drCfgjLUn
0qMDHYTU0Z3qY4iiFr0HzpTa0acV0MMhnEEZ0Gc0JKKsab8CQQ Dx7yT26vHTsA/+
af6X51rhXcVakaw3Rrxw/MHkbaONiqwaEDxsWJ/ZCGRT5diwP3rRqu7o4aSIMSx4
SNx06ikpAkEAxOpWRyTByzh3gfIu+VVPP89/7526O5qdcG58JNoWufHbyTxJh3BO
naRSuVXvjA/htqv7iAXUkmvPoqVTqX2iuQJAMkE78dn9N1LglVw/s3NM7u72Rmda
qhIGhIq1HRT3NwTOBnP30QU1sT2UfJXR2WX4+/g6enAhKj9JGQFTdEh79wJASyhP
iETCr8fD/H+gh1AjqFlliKS2ufhz8V5Mhgk217z0BJkkFXJlo7ZcPRLWmUa lB3JZ
Wbq7ZYHFaDQLy2s75wJAeHsEgQSxj2idJoZltLU/HIevL2pXurBvzLKY8qgz0hoK
B1Jd1G5U8NqLsrc8C9UQBbohihTjihGHEVzKr01Tgg==
-----END RSA PRIVATE KEY-----
EOF;
$sapKeyID = openssl_get_privatekey($sapKey);
openssl_sign($data, $signature, $sapKeyID, 2);
$signature = base64_encode($signature);
return array('data' => $data,'sign' => $signature);
}
function sendRequest($data) {
$PostData = "data=". urlencode($data['data']) ."&sign=". urlencode($data['sign']);
$len = strlen($PostData);
$zapros= "POST https://217.198.178.10:8443/srv/pay HTTP/1.0\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: ". $len ."\r\n".
"Host: 217.198.178.10\r\n".
"Accept: */*\r\n".
"Accept-Encoding: gzip, deflate\r\n".
"Connection: Keep-Alive\r\n".
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)\r\n\r\n".
$PostData;
$fp = fsockopen("ssl://217.198.178.10", 8443, &$errno, &$errstr, 300);
if(!$fp) {
echo "Ошибка соединения с сервером!";
return false;
}
fputs($fp,$zapros);
while(trim(fgets($fp,1024)) != "") {
}
$otvet = '';
while(!feof($fp)) {
$otvet .= fgets($fp,1024);
}
fclose($fp);
return $otvet;
}
function sendData($tpl,$toreplace) {
// $basedir = $_SERVER['DOCUMENT_ROOT'];
$xmlf=str_replace("\\","/",dirname(__FILE__) ."/aks/". $tpl);
if(!file_exists($xmlf) || !is_readable($xmlf)) {
return false;
}
$xml = implode('',file($xmlf));
$toreplace['%dealer%'] = $this->dealerid;
$toreplace['%terminal%'] = $this->terminalid;
$xml = str_replace(array_keys($toreplace),array_values($t oreplace),$xml);
// echo "<pre>".htmlspecialchars($xml)."</pre>";
//$datasign = $this->encrypt($xml); массив с закодированными данными и подписью
$otvet = $this->sendRequest( $this->encrypt($xml) );
// echo "<pre>".htmlspecialchars($otvet)."</pre>";
if($otvet === false)
return false;
$sxe = @simplexml_load_string("<?xml version=\"1.0\" encoding=\"windows-1251\"?>".$otvet);
//file_put_contents("1.txt",var_export($otvet,true)) ;
if ($sxe === false)
return false;
return $sxe;
}
function Payment($toreplace,$tpl) {
return $this->sendData($tpl ."_pay.xml",$toreplace);
}
function checkPayment($toreplace,$tpl) {
return $this->sendData($tpl ."_check.xml",$toreplace);
}
}
?> |
|
|
|
|
|
Сдесь мы видим Скрипт конфигурации для отправки запроса на сервер с помощью шаблона,сдесь используется ключ.
--------------------------------------------------------------------------------------------------
Как мы видим,что терминал использует шаблон для построения запроса.
Думаю уже многие догадались что, даже нам не составит труда отправить такой же запрос на сервер,как вы уже догадались с помощью своих рук и головы :P
Рассмотрим шаблон запроса пополнения ОСС.
|
Цитата: |
|
|
|
|
|
|
|
|
<OPERATOR>%operator%</OPERATOR>
<PHONE_NUMBER>%phone%</PHONE_NUMBER>
<HOLDER_FIRST_NAME>%firstname%</HOLDER_FIRST_NAME>
<HOLDER_SECOND_NAME>%lastname%</HOLDER_SECOND_NAME>
<HOLDER_MIDDLE_NAME>%middlename%</HOLDER_MIDDLE_NAME>
<AMOUNT>%summa%</AMOUNT>
<COMMENT>%comment%</COMMENT> |
|
|
|
|
|
Во всех шаблонах вместо значка % подменяются данные на введённые юзером.
Сам файл настройки терминала хранит тоже очень важную информацию.
Рассмотрим его:
|
Цитата: |
|
|
|
|
|
|
|
|
[Debug]
DebugMode=1
DumpMode=1
ShowMouse=0
;DemoMode=1
[WatchDog]
; Тип сторожевого таймера (NONE при отсутствии)
Type=NONE
;Type=LISCO
;Type=ITRUS
; Таймаут обновления файла слежения или нотификации (в секундах)
Timeout=50
;*** параметры только для LISCO
; Имя сервиса
ServiceName=NONE
;ServiceName=wd_main
; Путь к файлу слежения - ПРОПИШИТЕ СВОЙ!!!!!
RunningFile=C:\1.tst
;*** параметры только для ITRUS
; Таймаут пингования модема (в секундах), если = 0 пинг не проводится
PingTimeout=600
; Количество неудачных попыток пингования модема перед принятием решения о зависании
; если = 0 пинг не проводится
MaxFailedPings=3
; К какому разъему подключен модем (USB1, USB2, RELAY), если
; не указано пинг не проводится
ModemPowerSource=RELAY
[Printer]
; Путь к dll с драйверами принтеров
Lib=PrinterPack.dll
[BillCollector]
; Тип купюроприемника
Type=Fir8999
;Type=U70
;Type=CashCode
;Type=NV9
; COM порт используемый купюроприемником
Port=1
; Набор купюр, принимаемых к оплате
Use5=0
Use10=1
Use50=1
Use100=1
Use500=1
Use1K=1
Use5K=0
Use10K=0
; Максимальное количество купюр, если 0, то не проверяется
AmountThreshold=800
[Daemon]
; Время на которое демон засыпает после обработки блока отложенных транзакций (в минутах)
SleepTime=30
; Время на которое демон засыпает, если требуется вмешательство администратора АКС (в минутах)
ProblemTime=300
; Время в течении которого транзакции хранятся в блоке отложенных транзакций (в сутках)
LifeTime=30
; Время в течении которого транзакция из блока отложенных транзакций активна (в часах)
ActiveTime=12
[Terminal]
; Логин администратора (фиктивный номер телефона)
AdminLogin=9061111111
; Пароль администратора
AdminPassword=222
; Если 0 звук есть, если 1 то звук не проигрывается
Mute=0
; Идентификатор дилера, выданный АКС
DealerId=654852
; Идентификатор терминала, выданный АКС
TerminalId=22
; Имя абонента для отображения в системе
Abonent=Абонент киоска
; Логин терминала, устанавливается администратором дилера
Login=admin
; Пароль терминала, устанавливается администратором дилера
Password=admin
; Внутренний код терминала (устанавливается дилером)
TerminalCode= Kiosk
; Количество секунд неактивности терминала для переключения на стартовую страницу
IdleTimeout=40
; Время (в секундах) в течении которого показывать сообщение о запрете сервиса
DisabledTime=2
; Степень прозрачности сообщения запрета сервиса (0-255)
DisabledBlend=90
[Connector]
; Параметры коннектора
;IP=192.168.0.1
IP=217.198.178.10
;IP=127.0.0.1
Port=8181
Encoding=ZIP
;Connection=Beeline-GPRS
Connection=
Timeout=10
[MRUOperators]
Count=4
; Megafon NW
Operator1=2
; MTC
Operator2=8
; Beeline
Operator3=5
; Skylink NW
Operator4=7
[Keys]
; Секретный ключ терминала
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCeiJPjP6w8smOZ7Icx40Epe42gex9+NB19ZG kR8MidFfPkkW0v
eBQTNO9GLq8qmu2iRpTkWiPsn1p2Tw+Vf6vrPKyr5GcWmvJwJ6 U0GZnA1I2qAJmO
Dgv43jbkxIZuSZkjpSEnVhPaqXGRzg3vwfQR36VwTG1exOkCmT crAbY15wIDAP//
AoGAGcwDHHVw1DE7Nj8bHtFBY6lmbQt141cOQ32iNnWMmlw009 4dyl8sY2x4e7wE
bMsyhiJSTJqXgxBRIKFuApmQ6s5ydC/Aip1ZhQwAoes9EOlE4718U/LYMAvTPa93
BbXghbLTjKSILUmsniAKtmcgrhOcy9AqING4D8+E/OJj7z8CQQDJrDj7rO341YQg
FFmZseALCanbKP5q8AlRMofb1xQ/69nvGA7+xrcXBq5VGva8a3Bzy/voXFt3HBYb
liLjqXbzAkEAyT1h4bV7GTWC63DU3iA0Oib9cXoCIiSlJBUGxR +97iWDp33REU+e
EAh0AJ3vUC+LpkNErp8c2yp/OnrgnisqPQJBAKeJ/MR4Fg0cFSXnbbKOqeh1SJM7
6k5qhHf7jT5bM8qpza5gT91Qm6v5lc6C+9nUrriw/o6vQB778Q2Nz7umJFkCQFG3
0prtwG44/OZ/s6/2W6uIyKsA6iavcA5a6B6rxleea1hKm1PW3FH3ALHQ06IvMLAw
OO/xZDUTMsT98nusms8CQDzD0jQRBAwE4Y/35Alaz79njiOK6hNA7U/zLoi/vNxG
/nErqNju3JcBqgpEuE5btD50dKKcaCOgn0T8YRLyiOo=
-----END RSA PRIVATE KEY-----
; Публичный ключ ACS
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALoYjm5oDuESSB4/3xUcvpNLEnDA8j4yH6sXEpA8KBqtPf+dkJIbPWvb
bf6B8f9p1XggO+VthPXxVDi9Kylf5BECJ0V5m+x+/30V7CfA2hMvcvBin8qv15bl
gKkIR7wKvOKSzS9/3Y82geA0AvSJWjRmZrVJwMFI8GVAmhnVSLChAgMA//8=
-----END RSA PUBLIC KEY----- |
|
|
|
|
|
Как мы видим что, используется сдесь 2 ключа.
1 ключ - это ключ для авторизации терминала с сервером, 2 ключ - используется для логирования на сервере отчётов.
Как из всего этого мы видим, что терминалы/Мульти-кассы не используют суппер-пупер защиту ;)
Ссори, не смогу вам рассказать как осуществить не законное пополнение Мобильного телефона :P Но каждый может догадаться и попробывать всё сам.
Информация будет дополняться.
Прошу строго не судить :rolleyes:
С наилучшими пожеланиями
throughout
Статья написана для
ProLogic.WS.