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 오토핫키


오토핫키 소스보호를 위한 컴파일러를 임시 공유합니다.

특정 게임의 가드를 우회하는 기능은 존재하지 않으므로 해당 기능에 대한 문의는 받지 않습니다.



설치 방법


AHK+ 암호화 컴파일러 설치프로그램으로 원하는 타입의 오토핫키를 설치합니다.

(기존 오토핫키가 설치되어 있을 경우 기본설치 경로가 해당 위치로 지정됩니다.)

오핫플러스설치.zip



디컴파일 방해 방식


암호화된 스크립트를 한번에 복호화 하지 않고 요소별로 분해하여 각기 다른 위치에서 복호화 하도록 만들어 디컴파일을 방해하도록 하였습니다. 단 올리디버거 같은 디버깅툴을 이용해 일부 메모리 값을 바꾸는 크래킹은 막을수 없습니다.



문의사항 있으시면 아래 카톡방을 두드리세요.

https://open.kakao.com/o/slwX64Y

Posted by 오토핫키


티스토리 툴바