ADB shell screencap 명령으로 디바이스 내부에 별도이미지파일 저장없이 바로 HBITMAP 이미지로 가져오는 방법 (32비트 오토핫키용)


테스트 에뮬레이터 - [MOMO]앱플레이어




;--------------------------------------------------------------------

#SingleInstance Force

#include Gdip.ahk  ;https://autohotkey.com/board/topic/29449-gdi-standard-library-145-by-tic/


;MCode Func

AdjustScreencapData := MCode("2,x86:VVdWU4tsJBSLRCQYjXQF/zn1d1ONfv6NTQGJ6usRZpCJyIPCAYhZ/4PBATnydyI51w+2GnbqgPsNdeWAegENdd8PtloCgPsKdBa7DQAAAOvPKehbXl9dw5CNtCYAAAAAiciDwgPrvjHA6+iQkJCQkA==")

ScreencapToDIB := MCode("2,x86:VVdWU4PsDItEJCiLdCQkhcB+fY0EtQAAAACLVCQsxwQkAAAAAMdEJAQAAAAA99iJRCQIi0QkKIPoAQ+vxo08goX2fjuLRCQgi0wkBDHbjSyIi0SdDInCweoQD7bKicIlAP8AAMHiEIHiAAD/AAnKCdCJBJ+DwwE53nXWAXQkBIMEJAEDfCQIiwQkOUQkKHWwg8QMW15fXcOQkJCQkJCQkA==")



^\::ExitApp


F1::

  RegRead, MomoDir, HKCU, Software\NOXGAMES\MOMO, InstallDir

  adb_path = %MomoDir%adb.exe

  Runwait, "%adb_path%" devices


  sCmd = "%adb_path%" -s "127.0.0.1:5555" shell screencap  ;127.0.0.1:5555 = MoMo 기본 앱플레이어

  if hBitmap := ADBScreenCapStdOutToHBitmap( sCmd )

  {

    SaveHBITMAPToFile(hBitmap, "_testImage.bmp")

    DllCall("DeleteObject", Ptr,hBitmap)

  }

  MsgBox, % hBitmap? "screen cap 이미지 추출성공":"실패"

return


;--------------------------------------------------------------------

;https://autohotkey.com/board/topic/96903-simplified-versions-of-seans-stdouttovar/

ADBScreenCapStdOutToHBitmap( sCmd ) {

  global AdjustScreencapData, ScreencapToDIB


  DllCall( "CreatePipe", UIntP,hPipeRead, UIntP,hPipeWrite, UInt,0, UInt,0 )

  DllCall( "SetHandleInformation", UInt,hPipeWrite, UInt,1, UInt,1 )


  VarSetCapacity( STARTUPINFO, 68,  0 )      ; STARTUPINFO          ;  http://goo.gl/fZf24

  NumPut( 68,         STARTUPINFO,  0 )      ; cbSize

  NumPut( 0x100,      STARTUPINFO, 44 )      ; dwFlags    =>  STARTF_USESTDHANDLES = 0x100 

  NumPut( hPipeWrite, STARTUPINFO, 60 )      ; hStdOutput

  NumPut( hPipeWrite, STARTUPINFO, 64 )      ; hStdError


  VarSetCapacity( PROCESS_INFORMATION, 16 )  ; PROCESS_INFORMATION  ;  http://goo.gl/b9BaI      


  If ! DllCall( "CreateProcess", UInt,0, UInt,&sCmd, UInt,0, UInt,0 ;  http://goo.gl/USC5a

              , UInt,1, UInt,0x08000000, UInt,0, UInt,0

              , UInt,&STARTUPINFO, UInt,&PROCESS_INFORMATION ) 

    Return "" 

    , DllCall( "CloseHandle", UInt,hPipeWrite ) 

    , DllCall( "CloseHandle", UInt,hPipeRead )

    , DllCall( "SetLastError", Int,-1 )


  hProcess := NumGet( PROCESS_INFORMATION, 0 )                 

  hThread  := NumGet( PROCESS_INFORMATION, 4 )                      


  DllCall( "CloseHandle", UInt,hPipeWrite )


  block := {}, blockIndex := 0, allSize := 0, nPipeAvail := 4096

  loop

  {

    ++blockIndex

    block[blockIndex] := {data:"", size:0, addr:0}

    ObjSetCapacity(block[blockIndex], "data", nPipeAvail)

    block[blockIndex].addr := ObjGetAddress(block[blockIndex], "data")

    

    nSz := 0

    if !DllCall( "ReadFile", UInt,hPipeRead, UInt,block[blockIndex].addr, UInt,nPipeAvail, UIntP,nSz, UInt,0 )

      break

    block[blockIndex].size := nSz, allSize += nSz

  }


  DllCall( "GetExitCodeProcess", UInt,hProcess, UIntP,ExitCode )

  DllCall( "CloseHandle", UInt,hProcess  )

  DllCall( "CloseHandle", UInt,hThread   )

  DllCall( "CloseHandle", UInt,hPipeRead )


  if allSize

  {

    VarSetCapacity( bin, allSize, 0 ), tar := &bin

    for k,v in block

      if v.size

        DllCall("RtlMoveMemory", "UPTR",tar, "UPTR",v.addr, "UInt",v.size), tar += v.size

    allSize := DllCall(AdjustScreencapData, "UPTR",&bin, "UInt",allSize, "cdecl")

    width  := NumGet(&bin, 0, "uint"), height := NumGet(&bin, 4, "uint")

    hBM := CreateDIBSection(width, height,"",32, ppvBits)  

    DllCall(ScreencapToDIB, "UPtr",&bin, "UInt",width, "UInt",height, "UPtr",ppvBits, "cdecl")

    return hBM

  }

  

}

 

;--------------------------------------------------------------------

MCode(mcode) {

static e := {1:4, 2:1}, c := (A_PtrSize=8) ? "x64" : "x86"

if (!regexmatch(mcode, "^([0-9]+),(" c ":|.*?," c ":)([^,]+)", m))

return

if (!DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", 0, "uint*", s, "ptr", 0, "ptr", 0))

return

p := DllCall("GlobalAlloc", "uint", 0, "ptr", s, "ptr")

if (c="x64")

DllCall("VirtualProtect", "ptr", p, "ptr", s, "uint", 0x40, "uint*", op)

if (DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", p, "uint*", s, "ptr", 0, "ptr", 0))

return p

DllCall("GlobalFree", "ptr", p)

    return

}


SaveHBITMAPToFile(hBitmap, sFile)

{

  VarSetCapacity(DIBSECTION, A_PtrSize=8? 104:84, 0)

  NumPut(40, DIBSECTION, A_PtrSize=8? 32:24,"UInt") ;dsBmih.biSize

  DllCall("GetObject", "UPTR", hBitmap, "int", A_PtrSize=8? 104:84, "UPTR", &DIBSECTION)

  hFile:= DllCall("CreateFile", "UPTR", &sFile, "Uint", 0x40000000, "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)

  DllCall("WriteFile", "UPTR", hFile, "int64P", 0x4D42|14+40+(biSizeImage:=NumGet(DIBSECTION, A_PtrSize=8? 52:44, "UInt"))<<16, "Uint", 6, "UintP", 0, "Uint", 0)

  DllCall("WriteFile", "UPTR", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)

  DllCall("WriteFile", "UPTR", hFile, "UPTR", &DIBSECTION + (A_PtrSize=8? 32:24), "Uint", 40, "UintP", 0, "Uint", 0)

  DllCall("WriteFile", "UPTR", hFile, "Uint", NumGet(DIBSECTION, A_PtrSize=8? 24:20, "UPtr"), "Uint", biSizeImage, "UintP", 0, "Uint", 0)

  DllCall("CloseHandle", "UPTR", hFile)

}







저작자 표시
신고
Posted by 오토핫키

 

스테가노그래피(Steganography) 기법으로 이미지에 문자열 숨기기

 

스테가노그래피란? https://bpsecblog.wordpress.com/2016/08/21/amalmot_4/

 

 

 

Test_스테가노.zip

 

                    1.BMP                                          2.BMP

 

                 3.BMP

 

 

 

1.BMP 와 2.BMP 는 같은 그림처럼 보이지만 2.BMP에는 이미지를 설명할수 있는 문자열이 특수한 형태로 숨겨서 저장되어 있으며 테스트파일을 실행 후 F1을 눌러보면 숨겨진 스테가노그래피 문자열을 확인 할 수 있습니다.

 

3.BMP는 스테가노그래피가 적용된 영역을 시각적으로 표시하기 위해 1.BMP 이미지와 2.BMP 이미지를 비교한 결과를 출력해본 것입니다. (픽셀값이 1비트라도 다른경우 흰색으로 표시)

 

 


< AHK+ 소스코드 >

 

;-------------------------------------------------------------------
;
;이 스크립트는 기존 오토핫키에서는 동작하지 않습니다.
;
;스테가노그래피 기법을 이용하면 이미지에 대한 간단한 정보를 별도
;파일에 기록하지 않고 이미지 자체에 바로 저장할수 있겠다 싶어서
;재미로 추가해 본 기능입니다.
;
;-------------------------------------------------------------------


#SingleInstance Force
srcFile = 1.bmp  ;원본 이미지
tarFile = 2.bmp  ;스테가노그래피 형태의 문자열을 저장할 이미지
txtFile = %tarFile%_에서추출한문자열.txt  ;추출한 스테가노그래피 문자열 저장용 텍스트 파일
MsgBox, 클립보드에 저장된 문자열을 스테가노그래피 형태로`n%srcFile% 이미지에 적용해 %tarFile% 파일로 저장합니다.`n`nF1 : %tarFile% 에 적용된 스테가노그래피 문자열 추출`nF2 : 스테가노그래피 적용(문자열 + %srcFile% -> %tarFile%)`n`nESC 키를 누르면 테스트가 종료됩니다.

 

;이미지에서 스테가노그래피 형태로 저장된 문자열을 추출한다.
F1::
  ImageGet,,,,,, tarFile, *SteganoRead, result
  if ErrorLevel
  {
    MsgBox, "%tarFile%" 이미지에 적용된 스테가노그래피 문자열이 없습니다.
    return
  }
  FileDelete, % txtFile
  FileAppend, % result.stegano, % txtFile
  MsgBox % "< """ tarFile """ 이미지에 숨겨진 문자열 >`n`n" result.stegano
return

 

;클립보드에 있는 문자열을 스테가노그래피 형태로 이미지에 저장한다.
F2::
  str = %Clipboard%
  ImageGet, hBitmap,,,,, srcFile, *SteganoWrite%str%
  if hBitmap
  {
    SaveHBitmapToFile(hBitmap, tarFile), DllCall("DeleteObject", "Ptr",hBitmap)
    MsgBox, 스테가노그래피 적용 성공`n`n"%tarFile%"에 저장 되었습니다.
  }
  else
    MsgBox, 스테가노그래피 적용 실패
return

 

;테스트 종료
Esc::
  MsgBox, 스테가노그래피 테스트를 종료합니다.
ExitApp


;----------------------------------------------------------------------------------
SaveHBITMAPToFile(hBitmap, sFile)
{
  VarSetCapacity(DIBSECTION, A_PtrSize=8? 104:84, 0)
  NumPut(40, DIBSECTION, A_PtrSize=8? 32:24,"UInt") ;dsBmih.biSize
  DllCall("GetObject", "UPTR", hBitmap, "int", A_PtrSize=8? 104:84, "UPTR", &DIBSECTION)
  hFile:= DllCall("CreateFile", "UPTR", &sFile, "Uint", 0x40000000, "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)
  DllCall("WriteFile", "UPTR", hFile, "int64P", 0x4D42|14+40+(biSizeImage:=NumGet(DIBSECTION, A_PtrSize=8? 52:44, "UInt"))<<16, "Uint", 6, "UintP", 0, "Uint", 0)
  DllCall("WriteFile", "UPTR", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)
  DllCall("WriteFile", "UPTR", hFile, "UPTR", &DIBSECTION + (A_PtrSize=8? 32:24), "Uint", 40, "UintP", 0, "Uint", 0)
  DllCall("WriteFile", "UPTR", hFile, "Uint", NumGet(DIBSECTION, A_PtrSize=8? 24:20, "UPtr"), "Uint", biSizeImage, "UintP", 0, "Uint", 0)
  DllCall("CloseHandle", "UPTR", hFile)
}

저작자 표시
신고

'쓸데없는것들' 카테고리의 다른 글

스테가노그래피 적용 테스트  (0) 2017.06.16
Posted by 오토핫키

모바일게임 히트같은 경우 녹스와 블루스택에서 색상이 다르게 나옵니다. 이 때문에 한쪽에서 추출한 이미지를 다른쪽에서 활용 할 수가 없더군요.

 

1. 녹스 이미지

 

2. 블루스택 이미지

 

 

해결 방법을 찾던 중... 색상을 회색톤으로 바꾸니 녹스에서 추출한 이미지로 블루스택상의 이미지에서 이미지서치에 성공을 했습니다. 대부분 공차값 50 내에서 찾아지더군요.

 

3. 녹스이미지를 회색톤으로 바꾼 것

 

4. 블루스택 이미지를 회색톤으로 바꾼 것

 

 

이렇게 테스트한 결과를 가지고 ImageSearch 명령에서 쉽게 사용할 수 있도록 *FilterGray 옵션으로 추가 했습니다.

 


 

아래 스크립트는 녹스에서 추출한 '우편함' 이미지를 사용해 블루스택상의 이미지에서 검색하는 스크립트입니다.

 

 

 

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

ImageSearch_FilterGray옵션.zip

 

 

<스크립트>

 

imgFind = image검색.bmp
img녹스 = image녹스.bmp
img블택 = image블택.bmp

공차 = 30

 

text := "녹스 스샷에서 추출한 이미지로 이미지서치 한 결과`n`n"
text .= "`n[*FilterGray 옵션 사용 전]`n"
ImageSearch, sx,sy, 0,0,0,0, *TargetFile<%img녹스%> *%공차% %imgFind%
if !ErrorLevel
  text .= "녹스 스샷에서 검색성공 : " sx "," sy "`n"
ImageSearch, sx,sy, 0,0,0,0, *TargetFile<%img블택%> *%공차% %imgFind%
if !ErrorLevel
  text .= "블택 스샷에서 검색성공 : " sx "," sy "`n"

 

text .= "`n[*FilterGray 옵션 사용 후]`n"
ImageSearch, sx,sy, 0,0,0,0, *FilterGray *TargetFile<%img녹스%> *%공차% %imgFind%
if !ErrorLevel
  text .= "녹스 스샷에서 검색성공 : " sx "," sy "`n"
ImageSearch, sx,sy, 0,0,0,0, *FilterGray *TargetFile<%img블택%> *%공차% %imgFind%
if !ErrorLevel
  text .= "블택 스샷에서 검색성공 : " sx "," sy "`n"

 

MsgBox % text

 

 

 

 

 

 

저작자 표시
신고
Posted by 오토핫키


티스토리 툴바