乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      抖音數(shù)據(jù)采集教程,Unicorn 模擬 CPU 調(diào)用 Native 函數(shù)

       頭號(hào)碼甲 2022-02-13

      抖音數(shù)據(jù)采集教程,Unicorn 模擬 CPU 調(diào)用 Native 函數(shù)

      短視頻、直播數(shù)據(jù)實(shí)時(shí)采集接口,請(qǐng)查看文檔: TiToData


      免責(zé)聲明:本文檔僅供學(xué)習(xí)與參考,請(qǐng)勿用于非法用途!否則一切后果自負(fù)。

      接口

      內(nèi)存相關(guān)

      • uc_mem_map
      • uc_mem_read
      • uc_mem_write

      寄存器相關(guān)

      • uc_reg_read
      • uc_reg_write

      指令執(zhí)行類

      • UC_HOOK_INTR
      • UC_HOOK_INSN
      • UC_HOOK_CODE
      • UC_HOOK_BLOCK

      內(nèi)存訪問類

      • UC_HOOK_MEM_READ
      • UC_HOOK_MEM_WRITE
      • UC_HOOK_MEM_FETCH
      • .....

      異常處理類

      • UC_HOOK_MEM_READ_UNMAPPED
      • UC_HOOK_MEM_WRITE_UNMAPPED
      • UC_HOOK_MEM_FETCH_UNMAPPED

      Unicorn 上手


      先自己寫個(gè) 超級(jí)簡單的app,并編譯(沒有開混淆保護(hù))

      #include <jni.h>
      #include <string>
      int add(int a, int b){
          int sum=a+b;
          return sum;
      }
      int add_six(int a,int b,int c, int d, int e,int f){
          int sum=0;
          sum=add(a,b);
          sum=add(sum,c);
          sum=add(sum,d);
          sum=add(sum,e);
          sum=add(sum,f);
          return sum;
      }
      extern "C" JNIEXPORT jstring JNICALL
      Java_com_zok_uni_MainActivity_stringFromJNI(
              JNIEnv* env,
              jobject /* this */) {
          std::string hello = "Hello from C++";
          int sum=add(3,4);
          sum=add_six(1,2,3,4,5,6);
          return env->NewStringUTF(hello.c_str());
      }
      

      C
      _ 復(fù)制_

      抹去符號(hào),讓他直接在 so 中調(diào)用 add_definitions(-fvisibility=hidden)

      32位下,參數(shù)小于4個(gè)的時(shí)候會(huì)直接通過寄存器來傳遞??!多余的只能進(jìn)入堆棧當(dāng)中(從右到左依次入棧)

      IDA 分析

      打開IDA 查看位置,為了查看方便我們配置一下, Options--general

      簡單的找到函數(shù)位置, 并改名


      動(dòng)態(tài)調(diào)試

      1. 我們動(dòng)態(tài) IDA 動(dòng)態(tài)調(diào)試看看,手機(jī)啟動(dòng) android 服務(wù)。并新啟動(dòng)一個(gè) IDA 附加進(jìn)程。打開 Modules 模塊(Debugger--DebuggerWindows--ModulesList)
      2. Modules 中搜索查看 so 的加載
        找到 stringFromJNI 的真實(shí)綁定地址就是在 C78CD628

      接下來就要看他參數(shù)的調(diào)用傳遞情況和堆棧情況

      1. F9 調(diào)試運(yùn)行
        對(duì)照靜態(tài)ida

      8646和8648 下面就是 864A 也就是 add 函數(shù)了
      所以此處對(duì)應(yīng) add 函數(shù)我們可以改名, 同理可以找到 add_six 函數(shù)

      結(jié)論

      繼續(xù)調(diào)試后總結(jié)如下:

      1. ARM32位下,參數(shù)小于4個(gè)的時(shí)候會(huì)直接通過寄存器來傳遞(R0-R3)!從右至左依次入!多余的只能進(jìn)入堆棧當(dāng)中(從右到左依次入棧)
      2. ARM64位下,參數(shù)小于8個(gè)會(huì)通過 (X0-X7)寄存器傳遞從右至左依次入棧;多余的要使用棧來傳遞剩余參數(shù)
      3. 32位下,THUMB 指令集是滿棧模式,sp 始終指向有值的內(nèi)容

      實(shí)際操作

      先記住兩個(gè)函數(shù)的偏移位置


      add 函數(shù)偏移位置 8500

      add_six 函數(shù)偏移位置 851C
      接下來就可以通過函數(shù)傳遞和堆棧布局來對(duì)這兩個(gè)函數(shù)的模擬調(diào)用

      """
      實(shí)現(xiàn)對(duì) so 中函數(shù)調(diào)用
      示例apk中兩個(gè)函數(shù)
      int add(int a, int b){
          int sum=a+b;
          return sum;
      }
      int add_six(int a,int b,int c, int d, int e,int f){
          int sum=0;
          sum=add(a,b);
          sum=add(sum,c);
          sum=add(sum,d);
          sum=add(sum,e);
          sum=add(sum,f);
          return sum;
      }
      extern "C" JNIEXPORT jstring JNICALL
      Java_com_zok_uni_MainActivity_stringFromJNI(
              JNIEnv* env,
              jobject /* this */) {
          std::string hello = "Hello from C++";
          int sum=add(3,4);
          sum=add_six(1,2,3,4,5,6);
          return env->NewStringUTF(hello.c_str());
      }
      """
      import unicorn
      import capstone
      import binascii
      import struct
      # 取出 so 內(nèi)容
      with open("so/03.so",'rb') as f:
          CODE=f.read() 
      def capstone_print(code, offset):
          """capstone 測(cè)試輸出"""
          print("\033[1;32m-------- capstone 輸出--------\033[0m")
          CP = capstone.Cs(capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB)  # 指定 THUMB 指令集
          for i in CP.disasm(code[offset:], 0, 20):  
              print('\033[1;32m地址: 0x%x | 操作碼: %s | 內(nèi)容: %s\033[0m'%(offset + i.address, i.mnemonic, i.op_str))
      def uni_add():
          """
          add(a+b)
          將匯編片段,映射到 unicorn 虛擬內(nèi)存中,將 pc 指向第一條指令處并執(zhí)行
          """
          print('-------- unicorn 執(zhí)行前--------')
          # 1. 創(chuàng)建實(shí)例
          mu = unicorn.Uc(unicorn.UC_ARCH_ARM, unicorn.UC_MODE_THUMB)  # 要指定架構(gòu)和模式, 這里用 arm 架構(gòu), 指定 THUMB 指令集
          # 2. 將代碼片段映射到模擬器的虛擬地址
          ADDRESS = 0x1000 # 映射開始地址
          SIZE = 1024*1024*10  # 分配映射大小(多分一點(diǎn))
          # 3. 開始映射
          mu.mem_map(ADDRESS, SIZE)  # 初始化映射 參數(shù)1:地址 參數(shù)2:空間大小  默認(rèn)初始化后默認(rèn)值:0
          mu.mem_write(ADDRESS, CODE)  # 寫入指令 參數(shù)1: 寫入位置 參數(shù)2:寫入內(nèi)容
          # 寫入寄存器
          # 4. 寄存器初始化 指令集涉及到 R0,R1,R2,R3 4個(gè)寄存器
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0, 0x1)  # 在 r0 寄存器上寫入 0x1
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R1, 0x2)  # 在 r1 寄存器上寫入 0x2
          # 5. 初始化堆棧,因?yàn)橐獙?duì)內(nèi)存進(jìn)行操作 設(shè)置 SP
          SP = ADDRESS+SIZE-1
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_SP,SP)
          # 6. pc 指針指向地址開始執(zhí)行 Hook (暫時(shí)屏蔽)
          # mu.hook_add(unicorn.UC_HOOK_CODE, hook_code)  # 跟蹤 cpu 執(zhí)行狀態(tài) hook 這里默認(rèn)跟蹤所有,具體也可以配置
          # mu.hook_add(unicorn.UC_HOOK_MEM_WRITE, hook_mem)  # 跟蹤 cpu 執(zhí)行內(nèi)存操作, 需要自寫回調(diào)函數(shù)
          # mu.hook_add(unicorn.UC_HOOK_INTR,hook_syscall)  # hook 系統(tǒng)調(diào)用函數(shù)
          # mu.hook_add(unicorn.UC_HOOK_BLOCK,hook_block)  # hook 基本塊   
          # 因?yàn)橛袃?nèi)存操作,hook的時(shí)候并沒有映射內(nèi)存,就會(huì)報(bào)錯(cuò)。所以要~主動(dòng)映射內(nèi)存 
          # mu.hook_add(unicorn.UC_HOOK_MEM_WRITE_UNMAPPED,hook_mem_write_unmapped)
          
          print_result(mu)  # capstone 輸出
          try: 
              add_satrt = ADDRESS+0x8500+1  # 偏移位置 ida 查看 THUMB 指令集所以要 ADDRESS +1,    
              add_end = ADDRESS+0x851A  # 因?yàn)?IDA 中 0x851A 最后一條是 LR,我們這里不需要所以不 +1 即可
              mu.emu_start(add_satrt, add_end)  # 參數(shù)1:起始位置,參數(shù)2:結(jié)束位置
              print('-------- unicorn 執(zhí)行后--------')
              print_result(mu)  # capstone 輸出
          except unicorn.UcError as e:
              print('\033[1;31mError: %s \033[0m' % e)
      def uni_add_six():
          """6個(gè)參數(shù)超過 amr32 4個(gè)寄存器,需要將多的2個(gè)參數(shù)放到堆棧當(dāng)中"""
          print('-------- unicorn 執(zhí)行前--------')
          # 1. 創(chuàng)建實(shí)例
          mu = unicorn.Uc(unicorn.UC_ARCH_ARM, unicorn.UC_MODE_THUMB)  # 要指定架構(gòu)和模式, 這里用 arm 架構(gòu), 指定 THUMB 指令集
          # 2. 將代碼片段映射到模擬器的虛擬地址
          ADDRESS = 0x1000 # 映射開始地址
          SIZE = 1024*1024*10  # 分配映射大小(多分一點(diǎn))
          # 3. 開始映射
          mu.mem_map(ADDRESS, SIZE)  # 初始化映射 參數(shù)1:地址 參數(shù)2:空間大小  默認(rèn)初始化后默認(rèn)值:0
          mu.mem_write(ADDRESS, CODE)  # 寫入指令 參數(shù)1: 寫入位置 參數(shù)2:寫入內(nèi)容
          # 寫入寄存器
          # 4. 寄存器初始化 指令集涉及到 R0,R1,R2,R3 4個(gè)寄存器
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0, 0x1)  # 在 r0 寄存器上寫入 0x1
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R1, 0x2)  # 在 r1 寄存器上寫入 0x2
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R2, 0x3)  # 在 r1 寄存器上寫入 0x3
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R3, 0x4)  # 在 r1 寄存器上寫入 0x4
          # 但是 IDA 中我們并沒有做堆棧平衡處理,要指向一個(gè)地址,他才能執(zhí)行完
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_LR,ADDRESS+0x456)  # 隨便指向 0x456 一個(gè)存在的地址
          # 5. 初始化堆棧,因?yàn)橐獙?duì)內(nèi)存進(jìn)行操作 設(shè)置 SP
          SP = ADDRESS+SIZE-16  # 多減點(diǎn),預(yù)留 sp 剩下兩個(gè)參數(shù)的位置
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_SP,SP)
          # 6. 多的兩個(gè)參數(shù),5和 6 要手動(dòng)放入堆棧當(dāng)中(從右至左)
          mu.mem_write(SP, struct.pack('I', 5))
          mu.mem_write(SP+4, struct.pack('I', 6))
          
          print_result(mu)  # capstone 輸出
          try: 
              add_satrt = ADDRESS+0x851C+1  # 偏移位置 ida 查看 THUMB 指令集所以要 ADDRESS +1,    
              add_end = ADDRESS+0x858E + 8 # 因?yàn)槲覀兪謩?dòng)平衡了內(nèi)存所以多給點(diǎn)空間
              mu.emu_start(add_satrt, add_end)  # 參數(shù)1:起始位置,參數(shù)2:結(jié)束位置
              print('-------- unicorn 執(zhí)行后--------')
              print_result(mu)  # capstone 輸出
          except unicorn.UcError as e:
              print('\033[1;31mError: %s \033[0m' % e)
      def print_result(mu):
          """調(diào)試寄存器值
          UC_ARM_REG_R0 = 66
          UC_ARM_REG_R1 = 67
          UC_ARM_REG_R2 = 68
          UC_ARM_REG_R3 = 69
          UC_ARM_REG_R4 = 70
          """
          for i in range(66,78):
              print("寄存器[R%d], hex 值:%x"%(i-66,mu.reg_read(i)))
          print("SP 值:%x" % (mu.reg_read(unicorn.arm_const.UC_ARM_REG_SP)))
          print("PC 值:%x" % (mu.reg_read(unicorn.arm_const.UC_ARM_REG_PC)))
      if __name__ == "__main__":
          # add 2 參數(shù)的相加
          print('--------------add --------------')
          capstone_print(CODE, 0x8500)
          uni_add()  # 模擬 add 函數(shù)
          print('\n-------------- add_six --------------')
          # add_six 6個(gè)參數(shù)的相加
          capstone_print(CODE, 0x851C)
          uni_add_six()
      

      Python
      _ 復(fù)制_

      調(diào)用 libc 函數(shù)

      依賴調(diào)用了其他so函數(shù)的情況下就不能像之前例子這樣調(diào)用了

      c 中函數(shù)如圖, 我們就需要在調(diào)用了外部函數(shù)的位置打 排齊

      調(diào)用位置在 859A

      """
      【依賴調(diào)用了其他so函數(shù)的情況下就不能像之前例子這樣調(diào)用了】
      實(shí)現(xiàn)對(duì) so 中函數(shù)調(diào)用
      int add_six(char* flag,int b,int c, int d, int e,int f){
          int sum=0;
          if(strstr(flag, "add")){
              sum=add(sum,c);
              sum=add(sum,d);
          }else{
              sum=add(sum,e);
              sum=add(sum,f);
          }
      }
      extern "C" JNIEXPORT jstring JNICALL
      Java_com_zok_uni_MainActivity_stringFromJNI(
              JNIEnv* env,
              jobject /* this */) {
          std::string hello = "Hello from C++";
          int sum=add(3,4);
          sum=add_six("flag",2,3,4,5,6);
          return env->NewStringUTF(hello.c_str());
      }
      """
      import unicorn
      import capstone
      import binascii
      import struct
      # 取出 so 內(nèi)容
      with open("so/callstrstr.so",'rb') as f:
          CODE=f.read() 
      def capstone_print(code, offset):
          """capstone 測(cè)試輸出"""
          print("\033[1;32m-------- capstone 輸出--------\033[0m")
          CP = capstone.Cs(capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB)  # 指定 THUMB 指令集
          for i in CP.disasm(code[offset:], 0, 20):  
              print('\033[1;32m地址: 0x%x | 操作碼: %s | 內(nèi)容: %s\033[0m'%(offset + i.address, i.mnemonic, i.op_str))
      def uni_add_six():
          """6個(gè)參數(shù)超過 amr32 4個(gè)寄存器,需要將多的2個(gè)參數(shù)放到堆棧當(dāng)中"""
          print('-------- unicorn 執(zhí)行前--------')
          # 1. 創(chuàng)建實(shí)例
          mu = unicorn.Uc(unicorn.UC_ARCH_ARM, unicorn.UC_MODE_THUMB)  # 要指定架構(gòu)和模式, 這里用 arm 架構(gòu), 指定 THUMB 指令集
          # 2. 將代碼片段映射到模擬器的虛擬地址
          ADDRESS = 0x1000 # 映射開始地址
          SIZE = 1024*1024*10  # 分配映射大小(多分一點(diǎn))
          # 3. 開始映射
          mu.mem_map(ADDRESS, SIZE)  # 初始化映射 參數(shù)1:地址 參數(shù)2:空間大小  默認(rèn)初始化后默認(rèn)值:0
          mu.mem_write(ADDRESS, CODE)  # 寫入指令 參數(shù)1: 寫入位置 參數(shù)2:寫入內(nèi)容
          """處理外部 so 調(diào)用"""
          # 此處要給,調(diào)用了外部 so 的地址寫入 nop, 然后通過添加回調(diào)函數(shù)來實(shí)現(xiàn)效果
          mu.mem_write(ADDRESS+0x859A, b'\x00\xbf\x00\xbf')  # \x00\xbf\x00\xbf 為 兩個(gè) nop, 因?yàn)?x859A處有4個(gè)字節(jié),所以用兩個(gè)nop 填充
          # 寫入寄存器
          # 4. 寄存器初始化 指令集涉及到 R0,R1,R2,R3 4個(gè)寄存器
          # 第一個(gè)參數(shù)是 string ,需要給指針、
          mu.mem_map(ADDRESS+SIZE+0x1000, 1024)  # 開辟
          mu.mem_write(ADDRESS+SIZE+0x1000, b'flag2')  # 寫入
          bytes=mu.mem_read(ADDRESS+SIZE+0x1000,5)  # 調(diào)試輸出
          print(binascii.b2a_hex(bytes))
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0, ADDRESS+SIZE+0x1000)  # 在 r0 寄存器上寫入剛剛創(chuàng)建的指針
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R1, 0x2)  # 在 r1 寄存器上寫入 0x2
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R2, 0x3)  # 在 r1 寄存器上寫入 0x3
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_R3, 0x4)  # 在 r1 寄存器上寫入 0x4
          # 但是 IDA 中我們并沒有做堆棧平衡處理,要指向一個(gè)地址,他才能執(zhí)行完
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_LR,ADDRESS+0x456)  # 隨便指向 0x456 一個(gè)存在的地址
          # 5. 初始化堆棧,因?yàn)橐獙?duì)內(nèi)存進(jìn)行操作 設(shè)置 SP
          SP = ADDRESS+SIZE-16  # 多減點(diǎn),預(yù)留 sp 剩下兩個(gè)參數(shù)的位置
          mu.reg_write(unicorn.arm_const.UC_ARM_REG_SP,SP)
          # 6. 多的兩個(gè)參數(shù),5和 6 要手動(dòng)放入堆棧當(dāng)中(從右至左)
          mu.mem_write(SP, struct.pack('I', 5))
          mu.mem_write(SP+4, struct.pack('I', 6))
          # hook 代碼
          mu.hook_add(unicorn.UC_HOOK_CODE, hook_code)
          mu.hook_add(unicorn.UC_HOOK_INTR,hook_syscall)  # hook 系統(tǒng)調(diào)用函數(shù)
          mu.hook_add(unicorn.UC_HOOK_BLOCK,hook_block)  # hook 基本塊   
          print_result(mu)  # capstone 輸出
          try: 
              add_satrt = ADDRESS+0x854C+1  # 偏移位置 ida 查看 THUMB 指令集所以要 ADDRESS +1,    
              add_end = ADDRESS+0x85D8 # 因?yàn)槲覀兪謩?dòng)平衡了內(nèi)存所以多給點(diǎn)空間
              mu.emu_start(add_satrt, add_end)  # 參數(shù)1:起始位置,參數(shù)2:結(jié)束位置
              print('-------- unicorn 執(zhí)行后--------')
              print_result(mu)  # capstone 輸出
          except unicorn.UcError as e:
              print('\033[1;31mError: %s \033[0m' % e)
      def hook_code(mu, address, size, user_data):
          """定義回調(diào)函數(shù), 在進(jìn)入?yún)R編指令之前就會(huì)先運(yùn)行這里
          mu: 模擬器
          address: 執(zhí)行地址
          size: 匯編指令大小
          user_data: 通過 hook_add 添加的參數(shù)
          """
          code=mu.mem_read(address,size)  # 讀取
          if address==0x1000+0x859A:  # 外部 so 調(diào)用地址
              """hook 兩個(gè)參數(shù)并返回正確值(自行計(jì)算)"""
              r0value=readstring(mu,mu.reg_read(unicorn.arm_const.UC_ARM_REG_R0))
              r1value = readstring(mu, mu.reg_read(unicorn.arm_const.UC_ARM_REG_R1))
              index=r0value.find(r1value)  # 用 find 的方法模擬實(shí)現(xiàn)并寫入 R0 寄存器中即可
              if index==-1:  # 沒有找到的話,就返回 0 
                  mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0,0)
              else:  # 找到的話,就返回位置
                  mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0, index)
              print("\033[1;36m執(zhí)行外部 so 函數(shù) strstr 參數(shù)1: %s, 參數(shù)2: %s\033[0m"%(r0value, r1value))
          CP = capstone.Cs(capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB)  # 指定 THUMB 指令集
          for i in CP.disasm(code, 0, len(code)):
              print('\033[1;30m【Hook cpu】 地址: 0x%x | 操作碼: %s | 內(nèi)容: %s\033[0m'%(address + i.address, i.mnemonic, i.op_str))
          return 
      def hook_syscall(mu,intno,user_data):
          print("\033[1;36mhook 系統(tǒng)調(diào)用 系統(tǒng)調(diào)用號(hào): 0x%d"%intno)
          if intno==2:  # 例子 2 是退出
              print("系統(tǒng)調(diào)用退出!!")
          print_result(mu)
          print("\033[0m")
          return
      def hook_block(mu, address, size, user_data):
          # code = mu.mem_read(address,size)
          print("\033[1;36mhook 基本塊")
          print_result(mu)
          print("\033[0m")
          return
      def print_result(mu):
          """調(diào)試寄存器值
          """
          for i in range(66,78):
              print("寄存器[R%d], hex 值:%x"%(i-66,mu.reg_read(i)))
          print("SP 值:%x" % (mu.reg_read(unicorn.arm_const.UC_ARM_REG_SP)))
          print("PC 值:%x" % (mu.reg_read(unicorn.arm_const.UC_ARM_REG_PC)))
      def readstring(mu,address):
          """讀出結(jié)果"""
          result=''
          tmp=mu.mem_read(address,1)
          while(tmp[0]!=0):
              result=result+chr(tmp[0])
              address=address+1
              tmp = mu.mem_read(address, 1)
          return result
      if __name__ == "__main__":
          print('\n-------------- add_six 延展外部 so 調(diào)用示例--------------')
          capstone_print(CODE, 0x851C)
          uni_add_six()
      

      Python
      _ 復(fù)制_

      完成模擬操作

      -------------- add_six 延展外部 so 調(diào)用示例--------------
      -------- capstone 輸出--------
      地址: 0x851c | 操作碼: movs | 內(nèi)容: r0, r0
      地址: 0x851e | 操作碼: b | 內(nèi)容: #0x124
      地址: 0x8520 | 操作碼: movs | 內(nèi)容: r0, #2
      地址: 0x8522 | 操作碼: b | 內(nèi)容: #0x128
      -------- unicorn 執(zhí)行前--------
      b'666c616732'
      寄存器[R0], hex 值:a02000
      寄存器[R1], hex 值:2
      寄存器[R2], hex 值:3
      寄存器[R3], hex 值:4
      寄存器[R4], hex 值:0
      寄存器[R5], hex 值:0
      寄存器[R6], hex 值:0
      寄存器[R7], hex 值:0
      寄存器[R8], hex 值:0
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00ff0
      PC 值:0
      hook 基本塊
      寄存器[R0], hex 值:a02000
      寄存器[R1], hex 值:2
      寄存器[R2], hex 值:3
      寄存器[R3], hex 值:4
      寄存器[R4], hex 值:0
      寄存器[R5], hex 值:0
      寄存器[R6], hex 值:0
      寄存器[R7], hex 值:0
      寄存器[R8], hex 值:0
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00ff0
      PC 值:954c
      【Hook cpu】 地址: 0x954c | 操作碼: push | 內(nèi)容: {r4, r5, r6, r7, lr}
      【Hook cpu】 地址: 0x954e | 操作碼: add | 內(nèi)容: r7, sp, #0xc
      【Hook cpu】 地址: 0x9550 | 操作碼: str | 內(nèi)容: r8, [sp, #-0x4]!
      【Hook cpu】 地址: 0x9554 | 操作碼: sub | 內(nèi)容: sp, #0x40
      【Hook cpu】 地址: 0x9556 | 操作碼: ldr.w | 內(nèi)容: ip, [r7, #0xc]
      【Hook cpu】 地址: 0x955a | 操作碼: ldr.w | 內(nèi)容: lr, [r7, #8]
      【Hook cpu】 地址: 0x955e | 操作碼: mov | 內(nèi)容: r4, r3
      【Hook cpu】 地址: 0x9560 | 操作碼: mov | 內(nèi)容: r5, r2
      【Hook cpu】 地址: 0x9562 | 操作碼: mov | 內(nèi)容: r6, r1
      【Hook cpu】 地址: 0x9564 | 操作碼: mov | 內(nèi)容: r8, r0
      【Hook cpu】 地址: 0x9566 | 操作碼: str | 內(nèi)容: r0, [sp, #0x2c]
      【Hook cpu】 地址: 0x9568 | 操作碼: str | 內(nèi)容: r1, [sp, #0x28]
      【Hook cpu】 地址: 0x956a | 操作碼: str | 內(nèi)容: r2, [sp, #0x24]
      【Hook cpu】 地址: 0x956c | 操作碼: str | 內(nèi)容: r3, [sp, #0x20]
      【Hook cpu】 地址: 0x956e | 操作碼: movs | 內(nèi)容: r0, #0
      【Hook cpu】 地址: 0x9570 | 操作碼: str | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x9572 | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x2c]
      【Hook cpu】 地址: 0x9574 | 操作碼: str | 內(nèi)容: r0, [sp, #0x34]
      【Hook cpu】 地址: 0x9576 | 操作碼: ldr | 內(nèi)容: r0, [pc, #0x64]
      【Hook cpu】 地址: 0x9578 | 操作碼: add | 內(nèi)容: r0, pc
      【Hook cpu】 地址: 0x957a | 操作碼: str | 內(nèi)容: r0, [sp, #0x30]
      【Hook cpu】 地址: 0x957c | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x34]
      【Hook cpu】 地址: 0x957e | 操作碼: ldr | 內(nèi)容: r1, [sp, #0x30]
      【Hook cpu】 地址: 0x9580 | 操作碼: str | 內(nèi)容: r0, [sp, #0x3c]
      【Hook cpu】 地址: 0x9582 | 操作碼: str | 內(nèi)容: r1, [sp, #0x38]
      【Hook cpu】 地址: 0x9584 | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x3c]
      【Hook cpu】 地址: 0x9586 | 操作碼: ldr | 內(nèi)容: r1, [sp, #0x38]
      【Hook cpu】 地址: 0x9588 | 操作碼: str.w | 內(nèi)容: ip, [sp, #0x18]
      【Hook cpu】 地址: 0x958c | 操作碼: str.w | 內(nèi)容: lr, [sp, #0x14]
      【Hook cpu】 地址: 0x9590 | 操作碼: str | 內(nèi)容: r4, [sp, #0x10]
      【Hook cpu】 地址: 0x9592 | 操作碼: str | 內(nèi)容: r5, [sp, #0xc]
      【Hook cpu】 地址: 0x9594 | 操作碼: str | 內(nèi)容: r6, [sp, #8]
      【Hook cpu】 地址: 0x9596 | 操作碼: str.w | 內(nèi)容: r8, [sp, #4]
      執(zhí)行外部 so 函數(shù) strstr 參數(shù)1: flag2, 參數(shù)2: add
      【Hook cpu】 地址: 0x959a | 操作碼: nop | 內(nèi)容: 
      【Hook cpu】 地址: 0x959c | 操作碼: nop | 內(nèi)容: 
      【Hook cpu】 地址: 0x959e | 操作碼: cmp | 內(nèi)容: r0, #0
      【Hook cpu】 地址: 0x95a0 | 操作碼: beq | 內(nèi)容: #0x1a
      hook 基本塊
      寄存器[R0], hex 值:0
      寄存器[R1], hex 值:16a2c
      寄存器[R2], hex 值:3
      寄存器[R3], hex 值:4
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:95ba
      【Hook cpu】 地址: 0x95ba | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x95bc | 操作碼: ldr | 內(nèi)容: r1, [r7, #8]
      【Hook cpu】 地址: 0x95be | 操作碼: bl | 內(nèi)容: #0xffffff72
      hook 基本塊
      寄存器[R0], hex 值:0
      寄存器[R1], hex 值:5
      寄存器[R2], hex 值:3
      寄存器[R3], hex 值:4
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:9530
      【Hook cpu】 地址: 0x9530 | 操作碼: sub | 內(nèi)容: sp, #0x14
      【Hook cpu】 地址: 0x9532 | 操作碼: mov | 內(nèi)容: r2, r1
      【Hook cpu】 地址: 0x9534 | 操作碼: mov | 內(nèi)容: r3, r0
      【Hook cpu】 地址: 0x9536 | 操作碼: str | 內(nèi)容: r0, [sp, #0x10]
      【Hook cpu】 地址: 0x9538 | 操作碼: str | 內(nèi)容: r1, [sp, #0xc]
      【Hook cpu】 地址: 0x953a | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x10]
      【Hook cpu】 地址: 0x953c | 操作碼: ldr | 內(nèi)容: r1, [sp, #0xc]
      【Hook cpu】 地址: 0x953e | 操作碼: add | 內(nèi)容: r0, r1
      【Hook cpu】 地址: 0x9540 | 操作碼: str | 內(nèi)容: r0, [sp, #8]
      【Hook cpu】 地址: 0x9542 | 操作碼: ldr | 內(nèi)容: r0, [sp, #8]
      【Hook cpu】 地址: 0x9544 | 操作碼: str | 內(nèi)容: r2, [sp, #4]
      【Hook cpu】 地址: 0x9546 | 操作碼: str | 內(nèi)容: r3, [sp]
      【Hook cpu】 地址: 0x9548 | 操作碼: add | 內(nèi)容: sp, #0x14
      【Hook cpu】 地址: 0x954a | 操作碼: bx | 內(nèi)容: lr
      hook 基本塊
      寄存器[R0], hex 值:5
      寄存器[R1], hex 值:5
      寄存器[R2], hex 值:5
      寄存器[R3], hex 值:0
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:95c2
      【Hook cpu】 地址: 0x95c2 | 操作碼: str | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x95c4 | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x95c6 | 操作碼: ldr | 內(nèi)容: r1, [r7, #0xc]
      【Hook cpu】 地址: 0x95c8 | 操作碼: bl | 內(nèi)容: #0xffffff68
      hook 基本塊
      寄存器[R0], hex 值:5
      寄存器[R1], hex 值:6
      寄存器[R2], hex 值:5
      寄存器[R3], hex 值:0
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:9530
      【Hook cpu】 地址: 0x9530 | 操作碼: sub | 內(nèi)容: sp, #0x14
      【Hook cpu】 地址: 0x9532 | 操作碼: mov | 內(nèi)容: r2, r1
      【Hook cpu】 地址: 0x9534 | 操作碼: mov | 內(nèi)容: r3, r0
      【Hook cpu】 地址: 0x9536 | 操作碼: str | 內(nèi)容: r0, [sp, #0x10]
      【Hook cpu】 地址: 0x9538 | 操作碼: str | 內(nèi)容: r1, [sp, #0xc]
      【Hook cpu】 地址: 0x953a | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x10]
      【Hook cpu】 地址: 0x953c | 操作碼: ldr | 內(nèi)容: r1, [sp, #0xc]
      【Hook cpu】 地址: 0x953e | 操作碼: add | 內(nèi)容: r0, r1
      【Hook cpu】 地址: 0x9540 | 操作碼: str | 內(nèi)容: r0, [sp, #8]
      【Hook cpu】 地址: 0x9542 | 操作碼: ldr | 內(nèi)容: r0, [sp, #8]
      【Hook cpu】 地址: 0x9544 | 操作碼: str | 內(nèi)容: r2, [sp, #4]
      【Hook cpu】 地址: 0x9546 | 操作碼: str | 內(nèi)容: r3, [sp]
      【Hook cpu】 地址: 0x9548 | 操作碼: add | 內(nèi)容: sp, #0x14
      【Hook cpu】 地址: 0x954a | 操作碼: bx | 內(nèi)容: lr
      hook 基本塊
      寄存器[R0], hex 值:b
      寄存器[R1], hex 值:6
      寄存器[R2], hex 值:6
      寄存器[R3], hex 值:5
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:95cc
      【Hook cpu】 地址: 0x95cc | 操作碼: str | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x95ce | 操作碼: b | 內(nèi)容: #2
      hook 基本塊
      寄存器[R0], hex 值:b
      寄存器[R1], hex 值:6
      寄存器[R2], hex 值:6
      寄存器[R3], hex 值:5
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:a02000
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00f98
      PC 值:95d0
      【Hook cpu】 地址: 0x95d0 | 操作碼: ldr | 內(nèi)容: r0, [sp, #0x1c]
      【Hook cpu】 地址: 0x95d2 | 操作碼: add | 內(nèi)容: sp, #0x40
      【Hook cpu】 地址: 0x95d4 | 操作碼: ldr | 內(nèi)容: r8, [sp], #4
      -------- unicorn 執(zhí)行后--------
      寄存器[R0], hex 值:b
      寄存器[R1], hex 值:6
      寄存器[R2], hex 值:6
      寄存器[R3], hex 值:5
      寄存器[R4], hex 值:4
      寄存器[R5], hex 值:3
      寄存器[R6], hex 值:2
      寄存器[R7], hex 值:a00fe8
      寄存器[R8], hex 值:0
      寄存器[R9], hex 值:0
      寄存器[R10], hex 值:0
      寄存器[R11], hex 值:0
      SP 值:a00fdc
      PC 值:95d4
      

      **

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多