0 голосов
 
65 просмотров
13.09.2020 / 12:16  AgentM

Неизвестная ошибка

В общим хотел переписать CamDiscover Naik'а для своих нужд. Вышел вот такой код:
  1. package com.agentm.browser;
  2.  
  3. import android.app.*;
  4. import android.widget.*;
  5. import java.util.concurrent.*;
  6. import java.util.*;
  7. import java.util.concurrent.atomic.*;
  8. import java.io.*;
  9. import java.net.*;
  10. import android.os.*;
  11. import android.view.View.*;
  12. import android.view.*;
  13. import android.content.*;
  14.  
  15.  
  16. public class WebCamActivity extends Activity {
  17.  
  18.     private EditText ET_START_IP, ET_END_IP,
  19.                      ET_RANGE_FROM_IP, ET_RANGE_TO_IP,
  20.                      ET_PORTS, ET_TIMEOUT, ET_MAX_THREADS;
  21.     private Button START;
  22.     private ScrollView SCROLL;
  23.     private TextView LOG;
  24.  
  25.     private boolean running;
  26.     private boolean anyServers;
  27.  
  28.     private int connectTimeout = 250;
  29.     private final List <String> searchHeaders = new ArrayList <String> () {
  30.         {
  31.             add("DNVRS-Webs");
  32.             add("DVRDVS-Webs");
  33.             add("Hikvision-Webs");
  34.             add("App-webs");
  35.             add("Netwave IP Camera");
  36.             add("Webcam");
  37.             add("WebCam");
  38.             add("webCam");
  39.             add("webcam");
  40.         }
  41.     };
  42.     private int threads = 25;
  43.     private String urlPrefix;
  44.     private int[] range = {0, 255};
  45.     private ExecutorService pool;
  46.     private int requestsInThread = 32;
  47.     private final AtomicInteger mainCounter = new AtomicInteger(0);
  48.     private int requests;
  49.     private String[] ports;
  50.  
  51.     @Override
  52.     public void onCreate(Bundle savedInstanceState) {
  53.  
  54.         super.onCreate(savedInstanceState);
  55.         setContentView(R.layout.webcam);
  56.  
  57.         // ActionBar
  58.         ActionBar ActionBar = getActionBar();
  59.         ActionBar.setTitle("X-BROWSER");
  60.         ActionBar.setSubtitle("WEBCAM SCANNER");
  61.  
  62.         // Кнопка назад в ActionBar
  63.         ActionBar.setHomeButtonEnabled(true);
  64.         ActionBar.setDisplayHomeAsUpEnabled(true);
  65.  
  66.         ET_START_IP = (EditText) findViewById(R.id.start_ip);
  67.         ET_END_IP = (EditText) findViewById(R.id.end_ip);
  68.         ET_RANGE_FROM_IP = (EditText) findViewById(R.id.range_from_ip);
  69.         ET_RANGE_TO_IP = (EditText) findViewById(R.id.range_to_ip);
  70.         ET_PORTS = (EditText) findViewById(R.id.ports);
  71.         ET_TIMEOUT = (EditText) findViewById(R.id.timeout);
  72.         ET_MAX_THREADS = (EditText) findViewById(R.id.max_threads);
  73.         START = (Button) findViewById(R.id.start);
  74.         SCROLL = (ScrollView) findViewById(R.id.scroll);
  75.         LOG = (TextView) findViewById(R.id.log);
  76.  
  77.         setOnClick();
  78.  
  79.     }
  80.  
  81.  
  82.     private void setOnClick() {
  83.         START.setOnClickListener(new OnClickListener() {
  84.  
  85.         @Override
  86.         public void onClick(View view) {
  87.             if (!running) {
  88.                 START.setEnabled(false);
  89.                 LOG.append("Start\n");
  90.                 SCROLL.smoothScrollTo(0, LOG.getHeight());
  91.  
  92.                 String s1 = ET_START_IP.getText().toString();
  93.                 if (s1.isEmpty()) {
  94.                     s1 = "0";
  95.                 }
  96.  
  97.                 String s2 = ET_END_IP.getText().toString();
  98.                 if (s2.isEmpty()) {
  99.                     s2 = "0";
  100.                 }
  101.  
  102.                 urlPrefix = s1 + "." + s2 + ".";
  103.  
  104.                 s1 = ET_RANGE_FROM_IP.getText().toString();
  105.                 if (s1.isEmpty()) {
  106.                     s1 = "0";
  107.                 }
  108.  
  109.                 s2 = ET_RANGE_TO_IP.getText().toString();
  110.                 if (s2.isEmpty()) {
  111.                     s2 = "0";
  112.                 }
  113.  
  114.                 range[0] = Integer.parseInt(s1);
  115.                 range[1] = Integer.parseInt(s2);
  116.  
  117.                 s1 = ET_MAX_THREADS.getText().toString();
  118.                 if (!s1.isEmpty()) {
  119.                     threads = Integer.parseInt(s1);
  120.                 }
  121.  
  122.                 s1 = ET_TIMEOUT.getText().toString();
  123.                 if (!s1.isEmpty()) {
  124.                     connectTimeout = Integer.parseInt(s1);
  125.                 }
  126.  
  127.                 s1 = ET_PORTS.getText().toString();
  128.                 if (!s1.isEmpty()) {
  129.                     ports = s1.split("\\s+");
  130.                 } else {
  131.                     ports = new String[] {"80"};
  132.                 }
  133.  
  134.                 start();
  135.             } else {
  136.                 pool.shutdownNow();
  137.             }
  138.             running = !running;
  139.         }
  140.         });
  141.     }
  142.  
  143.  
  144.     private void start() {
  145.         mainCounter.set(0);
  146.         requests = ((range[1] - range[0] + 1) * 256);
  147.         pool = Executors.newFixedThreadPool(threads);
  148.         for (int i = range[0]; i <= range[1]; i++) {
  149.             for (int j = 0; j < 256; j++) {
  150.                 if (j % requestsInThread == 0) {
  151.                     pool.submit(new DiscoverTask(i, j));
  152.                 }
  153.             }
  154.         }
  155.         pool.shutdown();
  156.     }
  157.  
  158.     private class DiscoverTask implements Runnable {
  159.  
  160.         private int third, fromFifth;
  161.  
  162.         public DiscoverTask(int third, int fromFifth) {
  163.             this.third = third;
  164.             this.fromFifth = fromFifth;
  165.         }
  166.  
  167.         public void run() {
  168.             int num = 0;
  169.             String server;
  170.             for (int i = 0; i <= requestsInThread && fromFifth + i < 256; i++) {
  171.                 if (Thread.currentThread().isInterrupted()) {
  172.                     return;
  173.                 }
  174.                 String address = urlPrefix + third + "." + (fromFifth + i);
  175.                 String httpAddr = "http://" + address;
  176.                 for (int p = 0; p < ports.length; p++) {
  177.                     int port = Integer.parseInt(ports[p]);
  178.                     if (port == 80) {
  179.                         HttpURLConnection connect = null;
  180.                         try {
  181.                             URL url = new URL(httpAddr);
  182.                             connect = (HttpURLConnection) url.openConnection();
  183.                             connect.setReadTimeout(connectTimeout);
  184.                             connect.setConnectTimeout(connectTimeout);
  185.                             connect.connect();
  186.                             server = connect.getHeaderField("Server");
  187.  
  188.                             if (server != null) {
  189.                                 if (anyServers) {
  190.                                     LOG.append(address + " " + server + "\n");
  191.                                     SCROLL.smoothScrollTo(0, LOG.getHeight());
  192.                                 } else if (searchHeaders.contains(server)) {
  193.                                     LOG.append(address + " - " + server + "\n");
  194.                                     SCROLL.smoothScrollTo(0, LOG.getHeight());
  195.                                 }
  196.                             } else {
  197.                                 server = connect.getHeaderField("WWW-Authenticate");
  198.                                 if (server != null) {
  199.                                     if (anyServers) {
  200.                                         LOG.append(address + " - WWW-Authenticate\n");
  201.                                         SCROLL.smoothScrollTo(0, LOG.getHeight());
  202.                                     } else if (searchHeaders.contains(server)) {
  203.                                         LOG.append(address + " - WWW-Authenticate  WebCam\n");
  204.                                         SCROLL.smoothScrollTo(0, LOG.getHeight());
  205.                                     }
  206.                                 }
  207.                             }
  208.                         } catch (Exception e) {
  209.                             e.printStackTrace();
  210.                         } finally {
  211.                             connect.disconnect();
  212.                         }
  213.                     } else {
  214.                         // Другой порт, сканирование через сокет
  215.                         try {
  216.                             InetSocketAddress addr = new InetSocketAddress(address, port);
  217.                             Socket sock = new Socket();
  218.                             sock.connect(addr, connectTimeout);
  219.                             InputStream in = sock.getInputStream();
  220.                             LOG.append(address + ":" + port + " - " + readFromSocket(sock) + "\n");
  221.                             SCROLL.smoothScrollTo(0, LOG.getHeight());
  222.                             sock.close();
  223.                         } catch (Exception e) {
  224.                             e.printStackTrace();
  225.                         }
  226.                     }
  227.                 }
  228.                 num = mainCounter.incrementAndGet();
  229.                 if (num == requests) {
  230.                     START.setEnabled(true);
  231.                     LOG.append("Stop\n");
  232.                     SCROLL.smoothScrollTo(0, LOG.getHeight());
  233.                 }
  234.             }
  235.         }
  236.  
  237.     }
  238.  
  239.  
  240.  
  241.     private static String readFromSocket(Socket sock) throws Exception {
  242.         InputStream in = sock.getInputStream();
  243.         StringBuilder result = new StringBuilder(" ");
  244.         int timeout = 0;
  245.         int a;
  246.         while (true) {
  247.             a = in.available();
  248.             if (a > 0) {
  249.                 int r = in.read();
  250.                 if (r == -1) {
  251.                     break;
  252.                 }
  253.                 result.append((char) r);
  254.                 timeout = 0;
  255.             } else {
  256.                 Thread.sleep(10);
  257.                 a = in.available();
  258.                 if (a == 0) {
  259.                     timeout++;
  260.                 }
  261.                 if (timeout > 40) {
  262.                     break; // TIMEOUT
  263.                 }
  264.             }
  265.         }
  266.         return result.toString();
  267.     }
  268.  
  269.  
  270.  
  271.     @Override
  272.     public boolean onOptionsItemSelected(MenuItem item) {
  273.         switch (item.getItemId()) {
  274.             // Home //
  275.             case android.R.id.home:
  276.                 this.finish();
  277.                 return true;
  278.             // Default //
  279.             default:
  280.                 return true;
  281.         }
  282.     }
  283.  
  284.  
  285.  
  286.     public boolean onKeyDown(int keyCode, KeyEvent event) {
  287.         switch (keyCode) {
  288.             case KeyEvent.KEYCODE_BACK:
  289.                 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR && event.getRepeatCount() == 0) {
  290.                     onBackPressed();
  291.                 }
  292.         }
  293.         return super.onKeyDown(keyCode, event);
  294.     }
  295.  
  296.     public void onBackPressed() {
  297.         AlertDialog.Builder exit = new AlertDialog.Builder(this);
  298.         exit.setTitle("Выход"); // Заголовок
  299.         exit.setMessage("Вы действительно хотите выйти?"); // Текст сообщения
  300.         exit.setCancelable(false);
  301.         // Установим отрицательную кнопку, а также обработчик
  302.         exit.setPositiveButton("Нет", new DialogInterface.OnClickListener() {
  303.             @Override
  304.             public void onClick(DialogInterface p1, int p2) {
  305.             }
  306.         });
  307.         // Установим положительную кнопку, а также обработчик
  308.         exit.setNegativeButton("Да", new DialogInterface.OnClickListener() {
  309.             @Override
  310.             public void onClick(DialogInterface p1, int p2) {
  311.                 finish();
  312.             }
  313.         });
  314.         exit.create().show(); // Показываем окно
  315.     }
  316.  
  317. }

XML разметка не нужна так как ошибка не в ней. Вроде все работает но как только приложение находит камеру - то сразу крашится и в логах ничего не отображается. Может кто-то заметил ошибку в коде? Я уже не знаю в чем проблема.
13.09.2020 / 12:33  Ксакеп
Дебаг не помогает?
13.09.2020 / 13:04  AgentM
Как им пользоваться то?
14.09.2020 / 05:47  Death
Код под спойлер нужно. Даже правило такое прописано на сайте. Бан, в общем
14.09.2020 / 09:11  AgentM
Какой еще бан? Ответить никто не хочет, а вот бан дать так сразу. Эх программисты(
Ответы
 
1 голос
 
# 16.09.2020 / 19:30  Naik
Все креши есть в логах (logcat). Нужно смотреть не по тегу приложения, а все логи ошибок (Error). Там будет ответ на твой вопрос.
 
0 голосов
 
# 16.09.2020 / 19:35  Naik
Сканер кстати не очень актуален в 2020, т.к. сейчас большинство устройств уже нормально запаролены:) Раньше было забавно поиграться, часто в Европе находило камеры в квартирах даже, с возможностью управления. Но это не очень этично, лучше таким не страдать. Просто после такого опыта понимаешь, насколько нужно относиться серьезнее к таким устройствам, т.к. возможности они предоставляют безграничные, даже для любого школьника.
16.09.2020 / 20:54  Alexandr
я nmap'ом по подсетям провайдера до сих пор нахожу лол
Всего: 2

Реклама

Мы в соцсетях

vk tw tg yt