AccessibilityService: Is possible draw password on remote smartphone screen with mouse?

梦想与她 提交于 2019-12-06 10:42:59

问题


I'm working in a project similar to Team View QuickSupport and i want know if AccessibilityService allow perform a swipe on a remote screen that can be able to draw the password that protect device?

I comes trying the following code, but without success. Until now all that happens is a exception on android code that says:

java.lang.IllegalStateException: Attempting to add too many strokes to a gesture

here:

gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, time));

The current Java code is this:

    if (xline.contains("mouseswipescreen")) {

     String coords = xline.replace("mouseswipescreen", "");

     String[] tokens = coords.split(Pattern.quote("<|>"));

               float x = parseFloat(tokens[0]);
               float y = parseFloat(tokens[1]);
               String cmd = tokens[2];

     MyAccessibility.instance.Swipte((int) x, (int) y, 50, cmd);
 }

GestureDescription.Builder gestureBuilder;
Path path;

public void Swipte(int x, int y, int time, String command) {

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        System.out.println(" ======= Swipte =======");

        if (command.equalsIgnoreCase("start")) {

            gestureBuilder = new GestureDescription.Builder();
            path = new Path();

            path.moveTo(x, y);

        } else if (command.equalsIgnoreCase("move")) {

            path.lineTo(x, y);
            gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, time));

        } else if (command.equalsIgnoreCase("dispatch")) {

            dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
                @Override
                public void onCompleted(GestureDescription gestureDescription) {
                    System.out.println("SWIPTE Gesture Completed :D");
                    super.onCompleted(gestureDescription);
                }
            }, null);
        }
    }

}

Now changing this code to perform a swipe screen that stays this way:

public void Swipte(int x1, int y1, int x2, int y2, int time){

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {

            System.out.println(" ======= Swipte =======");

            GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
            Path path = new Path();
            path.moveTo(x1,y1); // "mousedown"
            path.lineTo(x2,y2); // until last position found in "mousemove"

            gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, time));
            dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
                @Override
                public void onCompleted(GestureDescription gestureDescription) {
                    System.out.println("SWIPTE Gesture Completed :D");
                    super.onCompleted(gestureDescription);
                }
            }, null);
        }

    }

The result is this:

See that is drawn a wrong password.

Lastly follows the code (Delphi) that send the coordenates (reference) based in first Java code above:

 private
    { Private declarations }
    fDown: Boolean;
    fPO: TPoint;
  public
    { Public declarations }
  end;

  ...

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Index, XTouch, YTouch, RXCoord, RYCoord: Integer;
  List: TStrings;
  RScreen, Start: String;
begin
  Index := Form1.ListView1.ItemIndex;
  if Index = -1 then
    Exit;

    List := TStringList.Create;
    RScreen := Form1.ListView1.Selected.SubItems[6]; // Remote screen resolution

    try
      ExtractStrings(['x'], [], PChar(RScreen), List); // Ex: my smartphone is 1920x1080
      RYCoord := StrToInt(List[0]);                    // 1920 (height)
      RXCoord := StrToInt(List[1]);                    // 1080 (width)
    finally
      List.Free;
    end;

    XTouch := Round((X / Image1.Width) * RXCoord);
    YTouch := Round((Y / Image1.Height) * RYCoord);

    fPO := Point(XTouch, YTouch);
    Start := 'start';
    fDown := true;

    Form1.ServerSocket1.Socket.Connections[Index].SendText(format('mouseswipescreen%d<|>%d<|>%s'#13#10, [fPO.X, fPO.Y, Start]));

  end;
end;

procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  Index, XTouch, YTouch, RXCoord, RYCoord: Integer;
  List: TStrings;
  RScreen, Move: String;
begin

  Index := Form1.ListView1.ItemIndex;
  if Index = -1 then
    Exit;

  List := TStringList.Create;
  RScreen := Form1.ListView1.Selected.SubItems[6]; // Remote screen resolution

  try
    ExtractStrings(['x'], [], PChar(RScreen), List); // Ex: my smartphone is 1920x1080
    RYCoord := StrToInt(List[0]);                    // 1920 (height)
    RXCoord := StrToInt(List[1]);                    // 1080 (width)
  finally
    List.Free;
  end;

  XTouch := Round((X / Image1.Width) * RXCoord);
  YTouch := Round((Y / Image1.Height) * RYCoord);

  if fDown then
  begin

    Move := 'move';

    Form1.ServerSocket1.Socket.Connections[Index].SendText(format('mouseswipescreen%d<|>%d<|>%s'#13#10, [fPO.X, fPO.Y, Move]));

    fPO := Point(XTouch, YTouch);

  end;

end;

procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if fDown then
    fDown := false;
end;

回答1:


OK, i answer my own question, already that the experts in AccessibilityService think that i'm building a malware and not like of help these kind of people.


ANSWER:

My approach above is right and unfortunately until this moment was saw that, not is possible achieve this goal using AccessibilityService, because exists limitation on storage of gestures, here is the official reference:

addStroke(new GestureDescription.StrokeDescription(path, 0, time));

And also, until now (in this case) AccessibilityService not is able to perform a gesture of touch "only press and not loose" in some point (of 9 points that compose the password screen) when 2 fast mouse clicks are perform and sent on:

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

before start and during drawing the password (dragging mouse), and release only when password be drawn completely and:

procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

be sent to remote device.


EDIT:

Note: Team View QuickSupport is able to this because use code of root gave to he by several vendors.



来源:https://stackoverflow.com/questions/52130267/accessibilityservice-is-possible-draw-password-on-remote-smartphone-screen-with

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!