Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* This file has been generated by the Hex-Rays decompiler.
- Copyright (c) 2007-2013 Hex-Rays <info@hex-rays.com>
- Detected compiler: GNU C++
- */
- #include <defs.h>
- //-------------------------------------------------------------------------
- // Function declarations
- // int __fastcall _cxa_finalize(_DWORD); weak
- // int pthread_key_create(void); weak
- // int __fastcall close(_DWORD); weak
- // int _errno(void); weak
- // char *strerror(int);
- // int __fastcall pthread_once(_DWORD, _DWORD); weak
- // int __fastcall pthread_getspecific(_DWORD); weak
- // void *malloc(size_t);
- // int __fastcall pthread_setspecific(_DWORD, _DWORD); weak
- // int socket(void); weak
- // int snprintf(char *, size_t, const char *, ...);
- // int __fastcall _stack_chk_fail(_DWORD, _DWORD); weak
- // void *memset(void *, int, size_t);
- // void *memcpy(void *, const void *, size_t);
- // int __fastcall sendmsg(_DWORD, _DWORD, _DWORD); weak
- // int __fastcall recvmsg(_DWORD, _DWORD, _DWORD); weak
- // int __fastcall dlopen(_DWORD, _DWORD); weak
- // int __fastcall dlsym(_DWORD, _DWORD); weak
- // int __fastcall isFeatureEnabled(_DWORD); weak
- // int __fastcall pthread_mutex_lock(_DWORD); weak
- // int pthread_mutex_unlock(void); weak
- // int inet_ntop(void); weak
- // int __fastcall getpid(_DWORD); weak
- // int __fastcall getsockname(_DWORD, _DWORD, _DWORD); weak
- // int __fastcall fcntl(_DWORD, _DWORD); weak
- // char *getenv(const char *);
- // int strcmp(const char *, const char *);
- // char *strchr(const char *, int);
- // int __fastcall inet_pton(_DWORD, _DWORD, _DWORD); weak
- int sub_9DC();
- int sub_A80();
- signed int __fastcall sub_B5C(int a1, const void *a2);
- void *libnims_init();
- int libnims_init_check();
- int __fastcall bind(int a1, int a2, int a3);
- int __fastcall connect(int a1, int a2, int a3);
- int __fastcall getaddrinfo(const char *a1, int a2, int a3, int a4);
- int j_j_pthread_key_create();
- int j_pthread_key_create();
- int j_j_pthread_mutex_unlock();
- int j_pthread_mutex_unlock();
- //-------------------------------------------------------------------------
- // Data declarations
- char byte_A3D[3] = { 'H', '\x03', 'I' }; // weak
- _UNKNOWN unk_112C; // weak
- void *off_3000 = &off_3000; // weak
- _UNKNOWN unk_3004; // weak
- int dword_3008; // weak
- int (__fastcall *dword_300C)(_DWORD, _DWORD, _DWORD); // weak
- int (__fastcall *dword_3010)(_DWORD, _DWORD, _DWORD, _DWORD); // weak
- int (__fastcall *dword_3014)(_DWORD, _DWORD, _DWORD); // weak
- _UNKNOWN unk_3018; // weak
- int dword_301C; // weak
- int dword_3020; // weak
- int dword_3024; // weak
- _UNKNOWN unk_3028; // weak
- int dword_3068; // weak
- // extern _UNKNOWN _stack_chk_guard; weak
- //----- (000009DC) --------------------------------------------------------
- int sub_9DC()
- {
- return _cxa_finalize(&off_3000);
- }
- // 868: using guessed type int __fastcall _cxa_finalize(_DWORD);
- // 3000: using guessed type void *off_3000;
- //----- (00000A80) --------------------------------------------------------
- int sub_A80()
- {
- int v0; // r5@1
- void *v1; // r0@2
- int v2; // r1@2
- int v3; // r4@4
- int *v4; // r0@6
- int v5; // r0@7
- int *v6; // r0@9
- int result; // r0@11
- signed __int16 v8; // [sp+4h] [bp-8Ch]@7
- __int16 v9; // [sp+6h] [bp-8Ah]@7
- int v10; // [sp+74h] [bp-1Ch]@1
- v10 = _stack_chk_guard;
- pthread_once(&unk_3018, byte_A3D);
- v0 = pthread_getspecific(dword_3008);
- if ( !v0 )
- {
- v1 = malloc(4u);
- v0 = (int)v1;
- if ( !v1 )
- {
- v3 = -1;
- goto LABEL_11;
- }
- *(_DWORD *)v1 = -2;
- pthread_setspecific(dword_3008, v1);
- }
- v3 = *(_DWORD *)v0;
- v2 = *(_DWORD *)v0 + 2;
- if ( *(_DWORD *)v0 == -2 )
- {
- v3 = socket();
- if ( v3 == -1 )
- {
- v4 = (int *)_errno();
- strerror(*v4);
- }
- else
- {
- v8 = 1;
- v5 = snprintf((char *)&v9, 0x6Cu, (const char *)&unk_112C, "/data/connectivity/nims");
- if ( dword_3014(v3, &v8, v5 + 2) == -1 )
- {
- v6 = (int *)_errno();
- strerror(*v6);
- close(v3);
- v3 = -1;
- }
- else
- {
- *(_DWORD *)v0 = v3;
- }
- }
- }
- LABEL_11:
- result = v3;
- if ( v10 != _stack_chk_guard )
- _stack_chk_fail(v3, v2);
- return result;
- }
- // 88C: using guessed type int __fastcall close(_DWORD);
- // 898: using guessed type int _errno(void);
- // 8BC: using guessed type int __fastcall pthread_once(_DWORD, _DWORD);
- // 8C8: using guessed type int __fastcall pthread_getspecific(_DWORD);
- // 8E0: using guessed type int __fastcall pthread_setspecific(_DWORD, _DWORD);
- // 8EC: using guessed type int socket(void);
- // 904: using guessed type int __fastcall _stack_chk_fail(_DWORD, _DWORD);
- // 3008: using guessed type int dword_3008;
- // 3014: using guessed type int (__fastcall *dword_3014)(_DWORD, _DWORD, _DWORD);
- //----- (00000B5C) --------------------------------------------------------
- signed int __fastcall sub_B5C(int a1, const void *a2)
- {
- int v2; // r11@1
- const void *v3; // r10@1
- int v4; // r5@1
- signed int result; // r0@2
- int *v6; // r0@4
- int *v7; // r0@6
- __int16 *v8; // [sp+Ch] [bp-84h]@3
- int v9; // [sp+10h] [bp-80h]@3
- char v10; // [sp+14h] [bp-7Ch]@3
- int *v11; // [sp+1Ch] [bp-74h]@3
- int v12; // [sp+20h] [bp-70h]@3
- int *v13; // [sp+24h] [bp-6Ch]@3
- int v14; // [sp+28h] [bp-68h]@3
- int v15; // [sp+30h] [bp-60h]@1
- int v16; // [sp+34h] [bp-5Ch]@3
- int v17; // [sp+38h] [bp-58h]@3
- int v18; // [sp+3Ch] [bp-54h]@3
- __int16 v19; // [sp+40h] [bp-50h]@3
- __int16 v20; // [sp+42h] [bp-4Eh]@3
- int v21; // [sp+44h] [bp-4Ch]@3
- int v22; // [sp+60h] [bp-30h]@3
- int v23; // [sp+64h] [bp-2Ch]@1
- v2 = a1;
- v3 = a2;
- v23 = _stack_chk_guard;
- memset(&v15, 0, 0x10u);
- v4 = sub_A80();
- if ( v4 == -1 )
- {
- result = -1;
- goto LABEL_11;
- }
- memset(&v10, 0, 0x1Cu);
- memset(&v19, 0, 0x24u);
- v20 = 36;
- v19 = 1;
- memcpy(&v21, v3, 0x10u);
- v9 = 36;
- v22 = 16;
- v8 = &v19;
- v13 = &v15;
- v11 = (int *)&v8;
- v12 = 1;
- v16 = 1;
- v17 = 1;
- v15 = 16;
- v14 = 16;
- v18 = v2;
- if ( sendmsg(v4, &v10, 0) != 36 )
- {
- v6 = (int *)_errno();
- strerror(*v6);
- }
- memset(&v10, 0, 0x1Cu);
- v12 = 1;
- v9 = 8;
- v11 = (int *)&v8;
- v8 = &v19;
- if ( recvmsg(v4, &v10, 0) == 8 )
- {
- if ( v19 == 1 && v20 == 8 )
- {
- result = v21;
- goto LABEL_11;
- }
- }
- else
- {
- v7 = (int *)_errno();
- strerror(*v7);
- }
- result = -1;
- LABEL_11:
- if ( v23 != _stack_chk_guard )
- _stack_chk_fail(result, &_stack_chk_guard);
- return result;
- }
- // 898: using guessed type int _errno(void);
- // 904: using guessed type int __fastcall _stack_chk_fail(_DWORD, _DWORD);
- // 928: using guessed type int __fastcall sendmsg(_DWORD, _DWORD, _DWORD);
- // 934: using guessed type int __fastcall recvmsg(_DWORD, _DWORD, _DWORD);
- //----- (00000C5C) --------------------------------------------------------
- void *libnims_init()
- {
- int v0; // r5@1
- int v1; // r4@1
- int v2; // r0@1
- void *result; // r0@7
- dword_3068 = dlopen("/system/lib/libc.so", 0);
- dword_300C = (int (__fastcall *)(_DWORD, _DWORD, _DWORD))dlsym(dword_3068, "bind");
- dword_3014 = (int (__fastcall *)(_DWORD, _DWORD, _DWORD))dlsym(dword_3068, "connect");
- dword_3010 = (int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD))dlsym(dword_3068, "getaddrinfo");
- v0 = isFeatureEnabled(1);
- v1 = isFeatureEnabled(3);
- v2 = isFeatureEnabled(4);
- dword_3020 = 0;
- if ( v0 )
- {
- if ( !v1 && !v2 )
- goto LABEL_7;
- dword_3020 = 1;
- }
- if ( v2 )
- dword_301C = 1;
- LABEL_7:
- result = memset(&unk_3028, 0, 0x40u);
- dword_3024 = 1;
- return result;
- }
- // 940: using guessed type int __fastcall dlopen(_DWORD, _DWORD);
- // 94C: using guessed type int __fastcall dlsym(_DWORD, _DWORD);
- // 958: using guessed type int __fastcall isFeatureEnabled(_DWORD);
- // 300C: using guessed type int (__fastcall *dword_300C)(_DWORD, _DWORD, _DWORD);
- // 3010: using guessed type int (__fastcall *dword_3010)(_DWORD, _DWORD, _DWORD, _DWORD);
- // 3014: using guessed type int (__fastcall *dword_3014)(_DWORD, _DWORD, _DWORD);
- // 301C: using guessed type int dword_301C;
- // 3020: using guessed type int dword_3020;
- // 3024: using guessed type int dword_3024;
- // 3068: using guessed type int dword_3068;
- //----- (00000D28) --------------------------------------------------------
- int libnims_init_check()
- {
- pthread_mutex_lock(&unk_3004);
- if ( !dword_3024 )
- libnims_init();
- return j_j_pthread_mutex_unlock();
- }
- // 964: using guessed type int __fastcall pthread_mutex_lock(_DWORD);
- // 3024: using guessed type int dword_3024;
- //----- (00000D58) --------------------------------------------------------
- int __fastcall bind(int a1, int a2, int a3)
- {
- int v3; // r4@1
- int v4; // r7@1
- int v5; // r6@1
- int v6; // r0@1
- int *v7; // r0@4
- int v8; // r0@6
- int v9; // r3@6
- int v10; // r6@6
- int result; // r0@9
- int v12; // [sp+34h] [bp-1Ch]@1
- v3 = a2;
- v4 = a1;
- v5 = a3;
- v12 = _stack_chk_guard;
- libnims_init_check();
- v6 = *(_WORD *)v3;
- if ( v6 == 2 || v6 == 10 )
- {
- if ( inet_ntop() )
- {
- getpid(__rev16(*(_WORD *)(v3 + 2)));
- }
- else
- {
- v7 = (int *)_errno();
- strerror(*v7);
- }
- }
- v8 = dword_300C(v4, v3, v5);
- v9 = *(_WORD *)v3;
- v10 = v8;
- if ( v9 == 2 || v9 == 10 )
- getpid(v8);
- result = v10;
- if ( v12 != _stack_chk_guard )
- _stack_chk_fail(v10, _stack_chk_guard);
- return result;
- }
- // 300C: invalid function type has been ignored
- // 898: using guessed type int _errno(void);
- // 904: using guessed type int __fastcall _stack_chk_fail(_DWORD, _DWORD);
- // 97C: using guessed type int inet_ntop(void);
- // 988: using guessed type int __fastcall getpid(_DWORD);
- // 300C: using guessed type int (__fastcall *dword_300C)(_DWORD, _DWORD, _DWORD);
- //----- (00000DD8) --------------------------------------------------------
- int __fastcall connect(int a1, int a2, int a3)
- {
- int v3; // r5@1
- int v4; // r4@1
- int v5; // r6@1
- int (__fastcall *v6)(_DWORD, _DWORD, _DWORD); // r3@2
- signed int v7; // r8@3
- int *v8; // r0@4
- int v9; // r0@9
- __int16 *v10; // r1@9
- int v11; // r3@13
- char v12; // zf@14
- int v13; // r0@18
- int v14; // r3@18
- int v15; // lr@18
- int v16; // r2@18
- int v17; // r12@18
- int result; // r0@21
- int v19; // [sp+4h] [bp-4Ch]@3
- __int16 v20; // [sp+8h] [bp-48h]@18
- __int16 v21; // [sp+Ah] [bp-46h]@18
- int v22; // [sp+Ch] [bp-44h]@18
- __int16 v23; // [sp+18h] [bp-38h]@3
- int v24; // [sp+34h] [bp-1Ch]@1
- v3 = a1;
- v4 = a2;
- v5 = a3;
- v24 = _stack_chk_guard;
- libnims_init_check();
- if ( dword_3020 )
- {
- v19 = 28;
- v7 = getsockname(v3, &v23, &v19);
- if ( v7 )
- {
- v8 = (int *)_errno();
- strerror(*v8);
- }
- fcntl(v3, 3);
- if ( v23 == 2 )
- {
- if ( (__rev(*(_DWORD *)(v4 + 4)) & 0xFF000000) != 2130706432 )
- {
- v9 = v3;
- v10 = (__int16 *)v4;
- LABEL_19:
- v7 = sub_B5C(v9, v10);
- LABEL_20:
- if ( v7 == -2 )
- {
- *(_DWORD *)_errno() = 1;
- result = -1;
- goto LABEL_24;
- }
- goto LABEL_22;
- }
- }
- else
- {
- if ( v23 != 10 )
- goto LABEL_20;
- if ( *(_DWORD *)(v4 + 8) || *(_DWORD *)(v4 + 12) )
- goto LABEL_18;
- v11 = *(_DWORD *)(v4 + 16);
- if ( v11 == -65536 )
- {
- v12 = (__rev(*(_DWORD *)(v4 + 20)) & 0xFF000000) == 2130706432;
- }
- else
- {
- if ( v11 )
- {
- LABEL_18:
- v13 = *(_BYTE *)(v4 + 23);
- v14 = *(_BYTE *)(v4 + 22);
- v20 = 2;
- v15 = v14 | (v13 << 8);
- v16 = *(_BYTE *)(v4 + 21);
- v9 = v3;
- v17 = *(_BYTE *)(v4 + 20);
- v21 = *(_WORD *)(v4 + 2);
- v22 = v17 | ((v16 | (v15 << 8)) << 8);
- v10 = &v20;
- goto LABEL_19;
- }
- v12 = *(_DWORD *)(v4 + 20) == 0x1000000;
- }
- if ( !v12 )
- goto LABEL_18;
- }
- LABEL_22:
- v6 = dword_3014;
- goto LABEL_23;
- }
- v6 = dword_3014;
- LABEL_23:
- result = v6(v3, v4, v5);
- LABEL_24:
- if ( v24 != _stack_chk_guard )
- _stack_chk_fail(result, v24);
- return result;
- }
- // 898: using guessed type int _errno(void);
- // 904: using guessed type int __fastcall _stack_chk_fail(_DWORD, _DWORD);
- // 994: using guessed type int __fastcall getsockname(_DWORD, _DWORD, _DWORD);
- // 9A0: using guessed type int __fastcall fcntl(_DWORD, _DWORD);
- // 3014: using guessed type int (__fastcall *dword_3014)(_DWORD, _DWORD, _DWORD);
- // 3020: using guessed type int dword_3020;
- //----- (00000EE4) --------------------------------------------------------
- int __fastcall getaddrinfo(const char *a1, int a2, int a3, int a4)
- {
- const char *v4; // r4@1
- int v5; // r8@1
- int v6; // r9@1
- int v7; // r5@1
- int (__fastcall *v8)(_DWORD, _DWORD, _DWORD, _DWORD); // r6@3
- char *v9; // r0@4
- signed int v10; // r3@7
- int v11; // r2@10
- char v12; // zf@14
- signed int v13; // r11@15
- size_t v14; // r2@18
- int result; // r0@21
- int v16; // r6@26
- int *v17; // r0@28
- int *v18; // r0@30
- int v19; // [sp-10h] [bp-10h]@20
- int v20; // [sp+4h] [bp+4h]@1
- __int16 v21; // [sp+8h] [bp+8h]@27
- __int16 v22; // [sp+Ah] [bp+Ah]@27
- int v23; // [sp+Ch] [bp+Ch]@27
- __int16 *v24; // [sp+10h] [bp+10h]@27
- int v25; // [sp+14h] [bp+14h]@27
- int v26; // [sp+18h] [bp+18h]@27
- int *v27; // [sp+20h] [bp+20h]@27
- int v28; // [sp+24h] [bp+24h]@27
- int v29; // [sp+34h] [bp+34h]@1
- v4 = a1;
- v5 = a4;
- v6 = a2;
- v7 = a3;
- v29 = _stack_chk_guard;
- libnims_init_check();
- v20 = (int)&_stack_chk_guard;
- if ( dword_301C && dword_3020 )
- {
- v9 = getenv("ANDROID_DNS_MODE");
- if ( v9 && !strcmp(v9, "local") )
- {
- v8 = dword_3010;
- goto LABEL_32;
- }
- v10 = (signed int)v4;
- if ( v4 )
- v10 = 1;
- if ( v7 )
- v11 = v10 & 1;
- else
- v11 = 0;
- if ( v11 )
- {
- if ( *(_DWORD *)v7 & 4 )
- {
- v12 = strchr(v4, 58) == 0;
- v13 = v12 ? 2 : 10;
- v14 = v12 ? 4 : 16;
- memset(&v19, 0, v14);
- if ( inet_pton(v13, v4, &v19) == 1 )
- {
- result = dword_3010(v4, v6, v7, v5);
- goto LABEL_33;
- }
- }
- }
- else if ( !v10 )
- {
- LABEL_31:
- v8 = dword_3010;
- goto LABEL_32;
- }
- if ( strcmp(v4, "127.0.0.1") )
- {
- if ( strcmp(v4, "localhost") )
- {
- v16 = sub_A80();
- if ( v16 != -1 )
- {
- memset(&v26, 0, 0x1Cu);
- v21 = 2;
- v24 = &v21;
- v28 = 1;
- v23 = 0;
- v22 = 4;
- v25 = 4;
- v27 = (int *)&v24;
- if ( sendmsg(v16, &v26, 0) != 4 )
- {
- v17 = (int *)_errno();
- strerror(*v17);
- }
- memset(&v26, 0, 0x1Cu);
- v28 = 1;
- v25 = 8;
- v27 = (int *)&v24;
- v24 = &v21;
- if ( recvmsg(v16, &v26, 0) != 8 )
- {
- v18 = (int *)_errno();
- strerror(*v18);
- }
- }
- }
- }
- goto LABEL_31;
- }
- v8 = dword_3010;
- LABEL_32:
- result = v8(v4, v6, v7, v5);
- LABEL_33:
- if ( v29 != *(_DWORD *)v20 )
- _stack_chk_fail(result, *(_DWORD *)v20);
- return result;
- }
- // 3010: invalid function type has been ignored
- // 898: using guessed type int _errno(void);
- // 904: using guessed type int __fastcall _stack_chk_fail(_DWORD, _DWORD);
- // 928: using guessed type int __fastcall sendmsg(_DWORD, _DWORD, _DWORD);
- // 934: using guessed type int __fastcall recvmsg(_DWORD, _DWORD, _DWORD);
- // 9D0: using guessed type int __fastcall inet_pton(_DWORD, _DWORD, _DWORD);
- // 3010: using guessed type int (__fastcall *dword_3010)(_DWORD, _DWORD, _DWORD, _DWORD);
- // 301C: using guessed type int dword_301C;
- // 3020: using guessed type int dword_3020;
- //----- (000010A0) --------------------------------------------------------
- int j_j_pthread_key_create()
- {
- return j_pthread_key_create();
- }
- //----- (000010A4) --------------------------------------------------------
- int j_pthread_key_create()
- {
- return pthread_key_create();
- }
- // 880: using guessed type int pthread_key_create(void);
- //----- (000010C0) --------------------------------------------------------
- int j_j_pthread_mutex_unlock()
- {
- return j_pthread_mutex_unlock();
- }
- //----- (000010C4) --------------------------------------------------------
- int j_pthread_mutex_unlock()
- {
- return pthread_mutex_unlock();
- }
- // 970: using guessed type int pthread_mutex_unlock(void);
- // ALL OK, 12 function(s) have been successfully decompiled
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement