0

我在共享库中有一个错误的功能。当 recv() 返回 0 时进入无限循环。

没有源代码。我能够在不调整函数大小的情况下反编译错误部分并更改一些处理器指令,但没有完全修复的空间。

我想用 gcc 编译新版本并将其放回库中。该函数使用一些全局变量,更糟糕的是,使用静态变量。固定功能比原来的大,所以不能放在同一个地方。

这里是:

#include <sys/types.h>
#include <stdio.h>

#define PM_ERROR_INVALID_CLIENT            210

typedef struct
{
  int   code;
  int   detail_code;
  char* message;
} pm_error;

typedef struct 
{
  char *server_name;
  int port;
  int socket_descriptor;
  int status;
  int timeout;
} pm_client;

 extern int debug;
 int pmprotocol_read(pm_client *param0_client, char *param1_data, int param2_length, pm_error *param3_error)
 {
   size_t local_bytes_received;
   size_t local_total_bytes;
   int local_status;
   char local_message[128];
   int local_retval;
   // init globals pointer
   // copy params to stack
   // pmprotocol.c:896
   if (debug > 0)
   {
     fprintf(
       stderr
       ,"pmprotocol_read:enter\n"  
       );
   }
   // pmprotocol.c:897
   // pmprotocol.c:898
   local_retval = 0;
   // pmprotocol.c:900
   local_status = 0;
   // pmprotocol.c:901
   // pmprotocol.c:902
   if (param0_client->status != 0)
   {
   // pmprotocol.c:904
     pm_error_set_internal(
       param3_error
       ,"pmprotocol_read"
       ,"function called with invalid client"
       ,PM_ERROR_INVALID_CLIENT
     );
   // pmprotocol.c:905
     return 1;
   }
   // pmprotocol.c:908
   local_retval = pmprotocol_waitfor_read(param0_client, param3_error);
   // pmprotocol.c:909
   if (local_retval != 0)
   {
     return local_retval;
   }
   // pmprotocol.c:910
   // pmprotocol.c:911
   local_total_bytes = 0;
   //pmprotocol.c:913
   while ((size_t)param2_length > local_total_bytes)
   {
     //pmprotocol.c:915
     local_bytes_received = recv(
        param0_client->socket_descriptor
        ,param1_data + local_total_bytes
        ,param2_length - local_total_bytes
        ,0
        );
     //pmprotocol.c:924
     local_total_bytes += local_bytes_received;
   }
   //pmprotocol.c:928
   if (debug > 1)
     pmutil_dump_buf(param1_data, param2_length, stderr, "From wire");
   //pmprotocol.c:929
   if (debug > 0)
     fprintf(
       stderr
       ,"pmprotocol_read:finish\n"
       );
   //pmprotocol.c:930
   return local_status;
 }

拆解:

.skip 0x697c
! typedef long long longlong_t;
! #include "../include/pmtypes.h"
! #include "../include/pmclient.h"
! extern int debug;
global_debug = 0x17c
global__iob = 0x2ac
global_LLC54 = 0x168 ! // "pmprotocol_read:enter\n"
global_LLC56 = 0x170 ! // "From wire"
global_LLC57 = 0x174 ! // "pmprotocol_read:finish\n"
global_LLC55 = 0x16c ! // "pmprotocol_read"
global_LLC38 = 0x128 ! // "function called with invalid client"

.type pmprotocol_read , STT_FUNC
.global pmprotocol_read
.align  4

! int pmprotocol_read(pm_client *param0_client, char *param1_data, int param2_length, pm_error *param3_error)
pmprotocol_read:

pmutil_dump_buf_plt = pmprotocol_read+81856
recv_plt = pmprotocol_read+83308
fprintf_plt = pmprotocol_read+81724
pm_error_set_internal_plt = pmprotocol_read+81868
pmprotocol_waitfor_read_plt = pmprotocol_read+82360

globals = 0x13f70

param0_client = 0x44
param1_data = 0x48
param2_length = 0x4c
param3_error = 0x50

! {

     auto_retval = -168

!   size_t local_bytes_received;
     local_bytes_received = -164

!   size_t local_total_bytes;
     local_total_bytes = -160

!   int local_status;
     local_status = -156

!   char local_message[128];
     local_message = -152

!   int local_retval;
     local_retval = -20

!   // init globals pointer
     0xff38691c <+0>:     save  %sp, -264, %sp
     0xff386920 <+4>:     sethi  %hi(globals), %l7
     0xff386924 <+8>:     call  .-9152
     0xff386928 <+12>:    add  %l7, %lo(globals), %l7
                                                  ! now %l7==0x13be8
                                                  ! "No function contains program counter for selected frame."
                                                  ! now %l7==0xff39a50c

!   // copy params to stack
     0xff38692c <+16>:    st  %i0, [ %fp + param0_client ]
     0xff386930 <+20>:    st  %i1, [ %fp + param1_data ]
     0xff386934 <+24>:    st  %i2, [ %fp + param2_length ]
     0xff386938 <+28>:    st  %i3, [ %fp + param3_error ]

!   // pmprotocol.c:896
!   if (debug > 0)
     0xff38693c <+32>:    sethi  %hi(0), %g1
     0xff386940 <+36>:    or  %g1, global_debug, %g1     ! global_debug
     0xff386944 <+40>:    ld  [ %l7 + %g1 ], %g1             ! (%l7 + %g1)==0xff39a688
                                                             ! now %g1==0xff39ad54
     0xff386948 <+44>:    ld  [ %g1 ], %g1
     0xff38694c <+48>:    cmp  %g1, 0
     0xff386950 <+52>:    ble  .+48 ! <pmprotocol_read+100>
     0xff386954 <+56>:    nop
!   {
!     fprintf(
!       stderr
         0xff386958 <+60>:    sethi  %hi(0), %g1
         0xff38695c <+64>:    or  %g1, global__iob, %g1     ! global__iob
         0xff386960 <+68>:    ld  [ %l7 + %g1 ], %g1
         0xff386964 <+72>:    add  %g1, 0x20, %o0

!       ,"pmprotocol_read:enter\n"  
         0xff386968 <+76>:    sethi  %hi(0), %g1
         0xff38696c <+80>:    or  %g1, global_LLC54, %g1     ! global_LLC54  
         0xff386970 <+84>:    ld  [ %l7 + %g1 ], %g1
         0xff386974 <+88>:    mov  %g1, %o1

!       );
         0xff386978 <+92>:    call  fprintf_plt
         0xff38697c <+96>:    nop
!   }

!   // pmprotocol.c:897
!   // pmprotocol.c:898
!   local_retval = 0;
     0xff386980 <+100>:   clr  [ %fp + local_retval ]
!   // pmprotocol.c:900
!   local_status = 0;
     0xff386984 <+104>:   clr  [ %fp + local_status ]

!   // pmprotocol.c:901
!   // pmprotocol.c:902
!   if (param0_client->status != 0)
     0xff386988 <+108>:   ld  [ %fp + param0_client ], %g1
     0xff38698c <+112>:   ld  [ %g1 + 0xc ], %g1
     0xff386990 <+116>:   cmp  %g1, 0
     0xff386994 <+120>:   be  .+72 ! <pmprotocol_read+192>
     0xff386998 <+124>:   nop
!   {
!   // pmprotocol.c:904
!     pm_error_set_internal(
!       param3_error
         0xff38699c <+128>:   ld  [ %fp + param3_error ], %o0

!       ,"pmprotocol_read"
         0xff3869a0 <+132>:   sethi  %hi(0), %g1
         0xff3869a4 <+136>:   or  %g1, global_LLC55, %g1     ! global_LLC55
         0xff3869a8 <+140>:   ld  [ %l7 + %g1 ], %g1
         0xff3869ac <+144>:   mov  %g1, %o1

!       ,"function called with invalid client"
         0xff3869b0 <+148>:   sethi  %hi(0), %g1
         0xff3869b4 <+152>:   or  %g1, global_LLC38, %g1     ! global_LLC38
         0xff3869b8 <+156>:   ld  [ %l7 + %g1 ], %g1
         0xff3869bc <+160>:   mov  %g1, %o2

!       ,PM_ERROR_INVALID_CLIENT
         0xff3869c0 <+164>:   mov  0xd2, %o3
!     );
       0xff3869c4 <+168>:   call  pm_error_set_internal_plt
       0xff3869c8 <+172>:   nop

!   // pmprotocol.c:905
!     return 1;
       0xff3869cc <+176>:   mov  1, %g1     ! 0x1
       0xff3869d0 <+180>:   st  %g1, [ %fp + auto_retval ]
       0xff3869d4 <+184>:   b  .+320 ! <pmprotocol_read+504>
       0xff3869d8 <+188>:   nop
!   }

!   // pmprotocol.c:908
!   local_retval = pmprotocol_waitfor_read(param0_client, param3_error);
     0xff3869dc <+192>:   ld  [ %fp + param0_client ], %o0
     0xff3869e0 <+196>:   ld  [ %fp + param3_error ], %o1
     0xff3869e4 <+200>:   call  pmprotocol_waitfor_read_plt
     0xff3869e8 <+204>:   nop
     0xff3869ec <+208>:   mov  %o0, %g1
     0xff3869f0 <+212>:   st  %g1, [ %fp + local_retval ]

!   // pmprotocol.c:909
!   if (local_retval != 0)
     0xff3869f4 <+216>:   ld  [ %fp + local_retval ], %g1
     0xff3869f8 <+220>:   cmp  %g1, 0
     0xff3869fc <+224>:   be  .+24 ! <pmprotocol_read+248>
     0xff386a00 <+228>:   nop
!   {
!     return local_retval;
       0xff386a04 <+232>:   ld  [ %fp + local_retval ], %g1
       0xff386a08 <+236>:   st  %g1, [ %fp + auto_retval ]
       0xff386a0c <+240>:   b  .+264 ! <pmprotocol_read+504>
       0xff386a10 <+244>:   nop
!   }

!   // pmprotocol.c:910
!   // pmprotocol.c:911
!   local_total_bytes = 0;
     0xff386a14 <+248>:   clr  [ %fp + local_total_bytes ]

!   //pmprotocol.c:913
!   while ((size_t)param2_length > local_total_bytes)
     0xff386a18 <+252>:   ld  [ %fp + param2_length ], %o5
     0xff386a1c <+256>:   ld  [ %fp + local_total_bytes ], %g1
     0xff386a20 <+260>:   cmp  %o5, %g1
     0xff386a24 <+264>:   bleu  .+88 ! <pmprotocol_read+352>
     0xff386a28 <+268>:   nop
!   {

!     //pmprotocol.c:915
!     local_bytes_received = recv(
         0xff386a2c <+272>:   ld  [ %fp + param0_client ], %o3
         0xff386a30 <+276>:   ld  [ %fp + param1_data ], %o5         
         0xff386a34 <+280>:   ld  [ %fp + local_total_bytes ], %g1 
         0xff386a38 <+284>:   add  %o5, %g1, %o4                
         0xff386a3c <+288>:   ld  [ %fp + param2_length ], %o5
         0xff386a40 <+292>:   ld  [ %fp + local_total_bytes ], %g1
         0xff386a44 <+296>:   sub  %o5, %g1, %g1

!        param0_client->socket_descriptor
          0xff386a48 <+300>:   ld  [ %o3 + 8 ], %o0

!        ,param1_data + local_total_bytes
          0xff386a4c <+304>:   mov  %o4, %o1                      

!        ,param2_length - local_total_bytes
          0xff386a50 <+308>:   mov  %g1, %o2

!        ,0
          0xff386a54 <+312>:   clr  %o3
!        );
          0xff386a58 <+316>:   call  recv_plt
          0xff386a5c <+320>:   nop
          0xff386a60 <+324>:   st  %o0, [ %fp + local_bytes_received ]

!     //pmprotocol.c:924
!     local_total_bytes += local_bytes_received;
       0xff386a64 <+328>:   ld  [ %fp + local_total_bytes ], %o5
       0xff386a68 <+332>:   ld  [ %fp + local_bytes_received ], %g1
       0xff386a6c <+336>:   add  %o5, %g1, %g1
       0xff386a70 <+340>:   st  %g1, [ %fp + local_total_bytes ]

!   }
     0xff386a74 <+344>:   b  .-92 ! <pmprotocol_read+252>
     0xff386a78 <+348>:   nop

!   //pmprotocol.c:928
!   if (debug > 1)
     0xff386a7c <+352>:   sethi  %hi(0), %g1
     0xff386a80 <+356>:   or  %g1, global_debug, %g1     ! global_debug
     0xff386a84 <+360>:   ld  [ %l7 + %g1 ], %g1
     0xff386a88 <+364>:   ld  [ %g1 ], %g1
     0xff386a8c <+368>:   cmp  %g1, 1
     0xff386a90 <+372>:   ble  .+56 ! <pmprotocol_read+428>
     0xff386a94 <+376>:   nop
!     pmutil_dump_buf(param1_data, param2_length, stderr, "From wire");
       0xff386a98 <+380>:   ld  [ %fp + param1_data ], %o0
       0xff386a9c <+384>:   ld  [ %fp + param2_length ], %o1
       0xff386aa0 <+388>:   sethi  %hi(0), %g1
       0xff386aa4 <+392>:   or  %g1, global__iob, %g1     ! global__iob
       0xff386aa8 <+396>:   ld  [ %l7 + %g1 ], %g1
       0xff386aac <+400>:   add  %g1, 0x20, %o2
       0xff386ab0 <+404>:   sethi  %hi(0), %g1
       0xff386ab4 <+408>:   or  %g1, global_LLC56, %g1     ! global_LLC56
       0xff386ab8 <+412>:   ld  [ %l7 + %g1 ], %g1
       0xff386abc <+416>:   mov  %g1, %o3
       0xff386ac0 <+420>:   call  pmutil_dump_buf_plt
       0xff386ac4 <+424>:   nop

!   //pmprotocol.c:929
!   if (debug > 0)
     0xff386ac8 <+428>:   sethi  %hi(0), %g1
     0xff386acc <+432>:   or  %g1, global_debug, %g1     ! global_debug
     0xff386ad0 <+436>:   ld  [ %l7 + %g1 ], %g1
     0xff386ad4 <+440>:   ld  [ %g1 ], %g1
     0xff386ad8 <+444>:   cmp  %g1, 0
     0xff386adc <+448>:   ble  .+48 ! <pmprotocol_read+496>
     0xff386ae0 <+452>:   nop
!     fprintf(
!       stderr
         0xff386ae4 <+456>:   sethi  %hi(0), %g1
         0xff386ae8 <+460>:   or  %g1, global__iob, %g1     ! global__iob
         0xff386aec <+464>:   ld  [ %l7 + %g1 ], %g1
         0xff386af0 <+468>:   add  %g1, 0x20, %o0
!       ,"pmprotocol_read:finish\n"
         0xff386af4 <+472>:   sethi  %hi(0), %g1
         0xff386af8 <+476>:   or  %g1, global_LLC57, %g1     ! global_LLC57
         0xff386afc <+480>:   ld  [ %l7 + %g1 ], %g1
         0xff386b00 <+484>:   mov  %g1, %o1
!       );
         0xff386b04 <+488>:   call  fprintf_plt
         0xff386b08 <+492>:   nop
!   //pmprotocol.c:930
!   return local_status;
     0xff386b0c <+496>:   ld  [ %fp + local_status ], %g1
     0xff386b10 <+500>:   st  %g1, [ %fp + auto_retval ]

     0xff386b14 <+504>:   ld  [ %fp + auto_retval ], %i0
     0xff386b18 <+508>:   ret
     0xff386b1c <+512>:   restore
! }
4

1 回答 1

0

使用 LD_PRELOAD 技巧:

什么是 LD_PRELOAD 技巧?

于 2013-07-07T19:06:53.797 回答