Advertisement
Guest User

Untitled

a guest
May 26th, 2017
545
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 55.46 KB | None | 0 0
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.    Copyright (c) 2007-2010 Hex-Rays <info@hex-rays.com>
  3.  
  4.    Detected compiler: GNU C++
  5. */
  6.  
  7. #include <defs.h>
  8.  
  9. #include <stdarg.h>
  10.  
  11.  
  12. //-------------------------------------------------------------------------
  13. // Data declarations
  14.  
  15. extern _UNKNOWN start; // weak
  16. extern char format[]; // idb
  17. extern char aUnableToCreate[]; // idb
  18. extern char aUnableToSetReu[]; // idb
  19. extern char aUnableToBindSo[]; // idb
  20. extern char aUnableToListen[]; // idb
  21. extern char aFailedToFindUs[]; // idb
  22. extern char aDrop_privsFail[]; // idb
  23. extern char aSetgidCurrentG[]; // idb
  24. extern char aSetgidCurrentU[]; // idb
  25. extern char a02x[]; // idb
  26. extern char aMd5TimeTrial_P[]; // idb
  27. extern char aIsDigestOfTest[]; // idb
  28. extern char aSecondsToProce[]; // idb
  29. extern char aCharactersProc[]; // idb
  30. extern char aS[]; // idb
  31. extern char modes[]; // idb
  32. extern char aSCanTBeOpened_[]; // idb
  33. extern char aS_0[]; // idb
  34. extern char aNodeX[]; // idb
  35. extern char aChickensU[]; // idb
  36. extern char aEggsU[]; // idb
  37. extern char aMoniesU[]; // idb
  38. extern char aIdU[]; // idb
  39. extern char aUsernameS[]; // idb
  40. extern char aInfoS[]; // idb
  41. extern char aOfficeS[]; // idb
  42. extern char aPasswordS[]; // idb
  43. extern char aPermU[]; // idb
  44. extern char aNextX[]; // idb
  45. extern char aPrevX[]; // idb
  46. extern char aLcggedIn[]; // idb
  47. extern char s[]; // idb
  48. extern char aEnterNewUserna[]; // idb
  49. extern char aEnterNewInfo[]; // idb
  50. extern char aEnterNewOffice[]; // idb
  51. extern char aEnterNewPass[]; // idb
  52. extern char aInsertFailed_[]; // idb
  53. extern char aYouCurrentlyHa[]; // idb
  54. extern char aMarketPriceFor[]; // idb
  55. extern char aWouldYouLikeTo[]; // idb
  56. extern char aHowMany_[]; // idb
  57. extern char aUSold[]; // idb
  58. extern char aNotEnoughEggs[]; // idb
  59. extern char aYouCurrently_0[]; // idb
  60. extern char aWouldYouLike_0[]; // idb
  61. extern char aHowMuch_[]; // idb
  62. extern char aUBurntToACrisp[]; // idb
  63. extern char aOhSnapItSAllGo[]; // idb
  64. extern char aYouCurrently_1[]; // idb
  65. extern char aMarketPriceF_0[]; // idb
  66. extern char aWouldYouLike_1[]; // idb
  67. extern char aUPurchased[]; // idb
  68. extern char aNotEnoughMoney[]; // idb
  69. extern char aWouldYouLike_2[]; // idb
  70. extern char aWouldYouLike_3[]; // idb
  71. extern char aWouldYouLike_4[]; // idb
  72. extern char aWouldYouLike_5[]; // idb
  73. extern char aWouldYouLike_6[]; // idb
  74. extern char aEnterNewUid[]; // idb
  75. extern char aWouldYouLike_7[]; // idb
  76. extern char aEnterNewEggCou[]; // idb
  77. extern char aYouDonTHaveEno[]; // idb
  78. extern char aWouldYouLike_8[]; // idb
  79. extern char aEnterNewChicke[]; // idb
  80. extern char aYouDonTHaveE_0[]; // idb
  81. extern char aWouldYouLike_9[]; // idb
  82. extern char aEnterNewMonies[]; // idb
  83. extern char aYouDonTHaveE_1[]; // idb
  84. extern char aWouldYouLik_10[]; // idb
  85. extern char aEnterNewPerm[]; // idb
  86. extern char aYouDonTHaveE_2[]; // idb
  87. extern char aFinishedUpdate[]; // idb
  88. extern char aEnterUsername[]; // idb
  89. extern char aEnterPassword[]; // idb
  90. extern char aBadUsernameOrP[]; // idb
  91. extern char aFantasyChicken[]; // idb
  92. extern char aMenuS[]; // idb
  93. extern char aLLogout[]; // idb
  94. extern char aBBuyChickens[]; // idb
  95. extern char aIIncinerateMon[]; // idb
  96. extern char aSSellEggs[]; // idb
  97. extern char aPDisplayMyInfo[]; // idb
  98. extern char aUUpdateMyInfo[]; // idb
  99. extern char aPPrintUserlist[]; // idb
  100. extern char aMenu[]; // idb
  101. extern char aCCreateAccount[]; // idb
  102. extern char aLLogin[]; // idb
  103. extern char aQQuit[]; // idb
  104. extern char s2[]; // idb
  105. extern char aUser[]; // idb
  106. extern char aAttemptedS_[]; // idb
  107. extern char aCya[]; // idb
  108. extern char aCanTAllocateUs[]; // idb
  109. extern char aHomeFcflUser_d[]; // idb
  110. extern char aCanTReadUserDb[]; // idb
  111. extern char aDS[]; // idb
  112. extern char aThatSNotAValid[]; // idb
  113. extern char aC[2]; // weak
  114. extern char asc_804D115[2]; // weak
  115. extern char aS_1[2]; // weak
  116. extern char aI[2]; // weak
  117. extern char aB[2]; // weak
  118. extern char aU[2]; // weak
  119. extern char aP[2]; // weak
  120. extern char asc_804D121[2]; // weak
  121. extern char aP_0[2]; // weak
  122. extern char a6[2]; // weak
  123. extern char filename[]; // idb
  124. extern char aQ[2]; // weak
  125. extern int dword_804E1D8; // weak
  126. extern int dword_804E1E0[]; // weak
  127. extern _UNKNOWN unk_804E1E4; // weak
  128. extern int dword_804E1E8; // weak
  129. extern _UNKNOWN unk_804E3C0; // weak
  130. extern int dword_804E400; // weak
  131. extern __int16 word_804E404; // weak
  132. extern char name[]; // idb
  133. extern char dword_804E40C[]; // idb
  134. extern char dword_804E410[]; // idb
  135. extern char byte_804E418; // weak
  136. extern int dword_804E41C; // weak
  137. extern int dword_804E420; // weak
  138. extern int dword_804E424; // weak
  139. extern char s1; // idb
  140. // extern _UNKNOWN _gmon_start__; weak
  141.  
  142. //-------------------------------------------------------------------------
  143. // Function declarations
  144.  
  145. int __cdecl init_proc();
  146. int sprintf(char *s, const char *format, ...);
  147. void srand(unsigned int seed);
  148. void err(int status, const char *format, ...);
  149. __sighandler_t signal(int sig, __sighandler_t handler);
  150. int __gmon_start__(void); // weak
  151. char *strncpy(char *dest, const char *src, size_t n);
  152. int listen(int fd, int n);
  153. void *memset(void *s, int c, size_t n);
  154. uint16_t htons(uint16_t hostshort);
  155. int setegid(__gid_t gid);
  156. __pid_t wait4(__pid_t pid, void *stat_loc, int options, struct rusage *usage);
  157. ssize_t read(int fd, void *buf, size_t nbytes);
  158. int __cdecl setresuid(_DWORD, _DWORD); // weak
  159. int __cdecl setresgid(_DWORD, _DWORD); // weak
  160. int accept(int fd, struct sockaddr *addr, socklen_t *addr_len);
  161. int socket(int domain, int type, int protocol);
  162. int fclose(FILE *stream);
  163. int setuid(__uid_t uid);
  164. size_t strlen(const char *s);
  165. FILE *fopen(const char *filename, const char *modes);
  166. char *strcpy(char *dest, const char *src);
  167. __gid_t getegid(void);
  168. int printf(const char *format, ...);
  169. int chdir(const char *path);
  170. int bind(int fd, const struct sockaddr *addr, socklen_t len);
  171. __uid_t getuid(void);
  172. int atoi(const char *nptr);
  173. int close(int fd);
  174. int initgroups(const char *, __gid_t group);
  175. time_t time(time_t *timer);
  176. void *malloc(size_t size);
  177. char *strcat(char *dest, const char *src);
  178. ssize_t send(int fd, const void *buf, size_t n, int flags);
  179. int vasprintf(char **, const char *, va_list);
  180. int puts(const char *s);
  181. __pid_t fork(void);
  182. int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
  183. int rand(void);
  184. void bzero(void *s, size_t n);
  185. int strncmp(const char *s1, const char *s2, size_t n);
  186. size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
  187. int seteuid(__uid_t uid);
  188. int setgid(__gid_t gid);
  189. struct passwd *getpwnam(const char *name);
  190. int strcmp(const char *s1, const char *s2);
  191. void exit(int status);
  192. __gid_t getgid(void);
  193. __uid_t geteuid(void);
  194. void __cdecl sub_8048CB0();
  195. int __cdecl sub_8048D10();
  196. int __cdecl sub_8048D34();
  197. __pid_t __cdecl handler();
  198. int __cdecl sub_8048E0A(int fd, int a2, unsigned int a3, char a4);
  199. signed int __cdecl sub_8048E75(int fd, const char *s, int a3);
  200. signed int __cdecl sub_8048EB2(int fd, int a2, unsigned int a3);
  201. int sub_8048F10(int fd, const char *a2, ...);
  202. int __cdecl sub_8048F7A(uint16_t a1);
  203. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD));
  204. int __cdecl sub_804915E(const char *name);
  205. int __cdecl sub_80491BE(int a1);
  206. int __cdecl sub_804935C(int a1);
  207. char __cdecl sub_804939E(int a1, int a2, unsigned int a3);
  208. int __cdecl sub_80494D4(int a1);
  209. int __cdecl sub_8049649(int a1, int a2);
  210. int __cdecl sub_804A296(int a1);
  211. int __cdecl sub_804A2D0();
  212. int __cdecl sub_804A3DC(const char *s);
  213. int __cdecl sub_804A443(const char *filename);
  214. char *__cdecl sub_804A60A(int a1, char *dest);
  215. char *__cdecl sub_804A666(const char *s, char *dest);
  216. int __cdecl sub_804A6C0(int fd, int a2);
  217. int __cdecl sub_804A820(int fd, int); // idb
  218. int __cdecl sub_804A855(int fd, int); // idb
  219. int __cdecl sub_804A8A1(int fd, char *a2, const char *s1, const char *s);
  220. void __cdecl sub_804A988();
  221. signed int __cdecl sub_804A9CB(int a1, const char *s2);
  222. int __cdecl sub_804AA10(int fd, int); // idb
  223. signed int __cdecl sub_804AA9F(int fd, const char *s, int a3);
  224. int __cdecl sub_804ACFC(int fd, const char *nptr, int a3);
  225. int __cdecl sub_804AE76(int fd, const char *nptr, int a3);
  226. int __cdecl sub_804AFC6(int fd, const char *nptr, int a3);
  227. int __cdecl sub_804B148(int fd, const char *nptr, int a3);
  228. int __cdecl sub_804B6F5(int fd, int s1, char *a3);
  229. int __cdecl sub_804B7E0(int fd); // idb
  230. int __cdecl sub_804B90A(FILE *stream, int a2, unsigned int a3, char a4);
  231. void *__cdecl sub_804B9E6(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11);
  232. signed int __cdecl sub_804BAB7(const char *filename, int a2, int fd);
  233. void __cdecl sub_804C067(int fd);
  234. int __cdecl sub_804C09F(int a1);
  235. void __cdecl sub_804C18B(int fd);
  236. void __cdecl sub_804C5F0();
  237. int *__cdecl sub_804C600();
  238. void __cdecl sub_804C65A();
  239. void (*__cdecl sub_804C660())(void);
  240. void __cdecl term_proc();
  241.  
  242.  
  243. //----- (08048900) --------------------------------------------------------
  244. int __cdecl init_proc()
  245. {
  246.   int v1; // ST04_4@3
  247.  
  248.   if ( &_gmon_start__ )
  249.     __gmon_start__();
  250.   sub_8048D10();
  251.   sub_804C660();
  252.   return v1;
  253. }
  254. // 8048980: using guessed type int __gmon_start__(void);
  255.  
  256. //----- (08048C80) --------------------------------------------------------
  257. #error "8048C83: positive sp value has been found (funcsize=2)"
  258.  
  259. //----- (08048CB0) --------------------------------------------------------
  260. void __cdecl sub_8048CB0()
  261. {
  262.   int v0; // eax@2
  263.   int i; // ebx@2
  264.  
  265.   if ( !byte_804E418 )
  266.   {
  267.     v0 = dword_804E41C;
  268.     for ( i = ((signed int)(&unk_804E1E4 - (_UNKNOWN *)dword_804E1E0) >> 2) - 1;
  269.           dword_804E41C < (unsigned int)i;
  270.           v0 = dword_804E41C )
  271.     {
  272.       dword_804E41C = v0 + 1;
  273.       ((void (*)(void))dword_804E1E0[dword_804E41C])();
  274.     }
  275.     byte_804E418 = 1;
  276.   }
  277. }
  278. // 804E1E0: using guessed type int dword_804E1E0[];
  279. // 804E418: using guessed type char byte_804E418;
  280. // 804E41C: using guessed type int dword_804E41C;
  281.  
  282. //----- (08048D10) --------------------------------------------------------
  283. int __cdecl sub_8048D10()
  284. {
  285.   int result; // eax@1
  286.  
  287.   result = dword_804E1E8;
  288.   if ( dword_804E1E8 )
  289.     result = 0;
  290.   return result;
  291. }
  292. // 804E1E8: using guessed type int dword_804E1E8;
  293.  
  294. //----- (08048D34) --------------------------------------------------------
  295. int __cdecl sub_8048D34()
  296. {
  297.   int v1; // ST1C_4@1
  298.  
  299.   v1 = sub_8048F7A(word_804E404);
  300.   sub_804915E("fcfl");
  301.   sub_80490D0(v1, (int (__cdecl *)(_DWORD))sub_804C18B);
  302.   return 0;
  303. }
  304. // 804E404: using guessed type __int16 word_804E404;
  305.  
  306. //----- (08048D78) --------------------------------------------------------
  307. __pid_t __cdecl handler()
  308. {
  309.   __pid_t result; // eax@1
  310.   char stat_loc; // [sp+1Ch] [bp-Ch]@1
  311.  
  312.   do
  313.     result = wait4(-1, &stat_loc, 1, 0);
  314.   while ( result > 0 );
  315.   return result;
  316. }
  317.  
  318. //----- (08048E0A) --------------------------------------------------------
  319. int __cdecl sub_8048E0A(int fd, int a2, unsigned int a3, char a4)
  320. {
  321.   char buf; // [sp+2Bh] [bp-Dh]@2
  322.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  323.  
  324.   for ( i = 0; ; ++i )
  325.   {
  326.     if ( read(fd, &buf, 1u) <= 0 )
  327.       return -1;
  328.     if ( buf == a4 )
  329.       return i;
  330.     if ( i >= a3 )
  331.       break;
  332.     *(_BYTE *)(i + a2) = buf;
  333.   }
  334.   return -1;
  335. }
  336.  
  337. //----- (08048E75) --------------------------------------------------------
  338. signed int __cdecl sub_8048E75(int fd, const char *s, int a3)
  339. {
  340.   unsigned int v3; // eax@2
  341.   size_t v5; // [sp+1Ch] [bp-Ch]@1
  342.  
  343.   v5 = strlen(s);
  344.   if ( a3 )
  345.     v3 = v5 + 1;
  346.   else
  347.     v3 = v5;
  348.   return sub_8048EB2(fd, (int)s, v3);
  349. }
  350.  
  351. //----- (08048EB2) --------------------------------------------------------
  352. signed int __cdecl sub_8048EB2(int fd, int a2, unsigned int a3)
  353. {
  354.   unsigned int i; // [sp+18h] [bp-10h]@1
  355.   ssize_t v5; // [sp+1Ch] [bp-Ch]@2
  356.  
  357.   for ( i = 0; i < a3; i += v5 )
  358.   {
  359.     v5 = send(fd, (const void *)(a2 + i), a3 - i, 0);
  360.     if ( !v5 )
  361.       return -1;
  362.   }
  363.   return i;
  364. }
  365.  
  366. //----- (08048F10) --------------------------------------------------------
  367. int sub_8048F10(int fd, const char *a2, ...)
  368. {
  369.   char *s; // [sp+18h] [bp-10h]@1
  370.   int v4; // [sp+1Ch] [bp-Ch]@1
  371.   va_list va; // [sp+38h] [bp+10h]@1
  372.  
  373.   va_start(va, a2);
  374.   v4 = 0;
  375.   s = 0;
  376.   if ( vasprintf(&s, a2, va) != -1 && s )
  377.     v4 = sub_8048E75(fd, s, 0);
  378.   else
  379.     v4 = -1;
  380.   return v4;
  381. }
  382.  
  383. //----- (08048F7A) --------------------------------------------------------
  384. int __cdecl sub_8048F7A(uint16_t a1)
  385. {
  386.   int optval; // [sp+2Ch] [bp-ACh]@1
  387.   __int16 s; // [sp+BCh] [bp-1Ch]@1
  388.   uint16_t v4; // [sp+BEh] [bp-1Ah]@1
  389.   int fd; // [sp+CCh] [bp-Ch]@3
  390.  
  391.   optval = 1;
  392.   memset(&s, 0, 0x10u);
  393.   s = 2;
  394.   v4 = htons(a1);
  395.   if ( signal(17, (__sighandler_t)handler) == (__sighandler_t)-1 )
  396.     err(-1, "Unable to set SIGCHLD handler");
  397.   fd = socket(2, 1, 0);
  398.   if ( fd == -1 )
  399.     err(-1, "Unable to create socket");
  400.   if ( setsockopt(fd, 1, 2, &optval, 4u) == -1 )
  401.     err(-1, "Unable to set reuse");
  402.   if ( bind(fd, (const struct sockaddr *)&s, 0x10u) == -1 )
  403.     err(-1, "Unable to bind socket");
  404.   if ( listen(fd, 20) == -1 )
  405.     err(-1, "Unable to listen on socket");
  406.   return fd;
  407. }
  408.  
  409. //----- (080490D0) --------------------------------------------------------
  410. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD))
  411. {
  412.   socklen_t addr_len; // [sp+1Ch] [bp-2Ch]@2
  413.   struct sockaddr addr; // [sp+20h] [bp-28h]@2
  414.   int v4; // [sp+30h] [bp-18h]@1
  415.   int v5; // [sp+34h] [bp-14h]@2
  416.   int v6; // [sp+38h] [bp-10h]@3
  417.   int status; // [sp+3Ch] [bp-Ch]@5
  418.  
  419.   v4 = 1;
  420.   while ( v4 )
  421.   {
  422.     addr_len = 16;
  423.     v5 = accept(fd, &addr, &addr_len);
  424.     if ( v5 != -1 )
  425.     {
  426.       v6 = fork();
  427.       if ( v6 != -1 )
  428.       {
  429.         if ( !v6 )
  430.         {
  431.           close(fd);
  432.           status = a2(v5);
  433.           close(v5);
  434.           exit(status);
  435.         }
  436.         close(v5);
  437.       }
  438.     }
  439.   }
  440. }
  441.  
  442. //----- (0804915E) --------------------------------------------------------
  443. int __cdecl sub_804915E(const char *name)
  444. {
  445.   int v2; // [sp+1Ch] [bp-Ch]@1
  446.  
  447.   v2 = (int)getpwnam(name);
  448.   if ( !v2 )
  449.     err(-1, "Failed to find user %s\n", name);
  450.   if ( sub_80491BE(v2) == -1 )
  451.     err(-1, "drop_privs failed!\n");
  452.   return 0;
  453. }
  454.  
  455. //----- (080491BE) --------------------------------------------------------
  456. int __cdecl sub_80491BE(int a1)
  457. {
  458.   int result; // eax@2
  459.   int v2; // ebx@8
  460.   __gid_t v3; // eax@8
  461.   int v4; // ebx@12
  462.   __uid_t v5; // eax@12
  463.   __uid_t v6; // [sp+14h] [bp-14h]@1
  464.   __gid_t v7; // [sp+18h] [bp-10h]@1
  465.  
  466.   v6 = getuid();
  467.   v7 = getgid();
  468.   initgroups(*(const char **)a1, *(_DWORD *)(a1 + 12));
  469.   if ( setresgid(*(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 12)) >= 0 )
  470.   {
  471.     if ( setresuid(*(_DWORD *)(a1 + 8), *(_DWORD *)(a1 + 8)) >= 0 )
  472.     {
  473.       if ( *(_DWORD *)(a1 + 12) == v7 || setgid(v7) == -1 && setegid(v7) == -1 )
  474.       {
  475.         if ( *(_DWORD *)(a1 + 8) == v6 || setuid(v6) == -1 && seteuid(v6) == -1 )
  476.         {
  477.           if ( getgid() == *(_DWORD *)(a1 + 12) && getegid() == *(_DWORD *)(a1 + 12) )
  478.           {
  479.             if ( getuid() == *(_DWORD *)(a1 + 8) && geteuid() == *(_DWORD *)(a1 + 8) )
  480.               result = chdir(*(const char **)(a1 + 20));
  481.             else
  482.               result = -1;
  483.           }
  484.           else
  485.           {
  486.             result = -1;
  487.           }
  488.         }
  489.         else
  490.         {
  491.           v4 = *(_DWORD *)(a1 + 8);
  492.           v5 = getuid();
  493.           printf("setgid current uid: %d target uid: %d\n", v5, v4);
  494.           result = -1;
  495.         }
  496.       }
  497.       else
  498.       {
  499.         v2 = *(_DWORD *)(a1 + 12);
  500.         v3 = getgid();
  501.         printf("setgid current gid: %d target gid: %d\n", v3, v2);
  502.         result = -1;
  503.       }
  504.     }
  505.     else
  506.     {
  507.       result = -1;
  508.     }
  509.   }
  510.   else
  511.   {
  512.     result = -1;
  513.   }
  514.   return result;
  515. }
  516. // 8048A30: using guessed type int __cdecl setresuid(_DWORD, _DWORD);
  517. // 8048A40: using guessed type int __cdecl setresgid(_DWORD, _DWORD);
  518.  
  519. //----- (0804935C) --------------------------------------------------------
  520. int __cdecl sub_804935C(int a1)
  521. {
  522.   int result; // eax@1
  523.  
  524.   *(_DWORD *)(a1 + 4) = 0;
  525.   *(_DWORD *)a1 = *(_DWORD *)(a1 + 4);
  526.   *(_DWORD *)(a1 + 8) = -559038737;
  527.   *(_DWORD *)(a1 + 12) = -782326291;
  528.   *(_DWORD *)(a1 + 16) = -553727763;
  529.   result = a1;
  530.   *(_DWORD *)(a1 + 20) = -1161901314;
  531.   return result;
  532. }
  533.  
  534. //----- (0804939E) --------------------------------------------------------
  535. char __cdecl sub_804939E(int a1, int a2, unsigned int a3)
  536. {
  537.   char result; // al@9
  538.   int v4[16]; // [sp+14h] [bp-54h]@6
  539.   int v5; // [sp+54h] [bp-14h]@1
  540.   unsigned int v6; // [sp+58h] [bp-10h]@5
  541.   int v7; // [sp+5Ch] [bp-Ch]@5
  542.  
  543.   v5 = (*(_DWORD *)a1 >> 3) & 0x3F;
  544.   if ( *(_DWORD *)a1 + 8 * a3 < *(_DWORD *)a1 )
  545.     ++*(_DWORD *)(a1 + 4);
  546.   *(_DWORD *)a1 += 8 * a3;
  547.   *(_DWORD *)(a1 + 4) += a3 >> 29;
  548.   while ( 1 )
  549.   {
  550.     result = a3-- != 0;
  551.     if ( !result )
  552.       break;
  553.     *(_BYTE *)(a1 + v5++ + 24) = *(_BYTE *)a2++;
  554.     if ( v5 == 64 )
  555.     {
  556.       v6 = 0;
  557.       v7 = 0;
  558.       while ( v6 <= 0xF )
  559.       {
  560.         v4[v6++] = (*(_BYTE *)(a1 + v7 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v7 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v7 + 3 + 24) << 24) | *(_BYTE *)(a1 + v7 + 24);
  561.         v7 += 4;
  562.       }
  563.       sub_8049649(a1 + 8, (int)v4);
  564.       v5 = 0;
  565.     }
  566.   }
  567.   return result;
  568. }
  569. // 804939E: using guessed type int var_54[16];
  570.  
  571. //----- (080494D4) --------------------------------------------------------
  572. int __cdecl sub_80494D4(int a1)
  573. {
  574.   unsigned int v1; // eax@2
  575.   int result; // eax@7
  576.   int v3[14]; // [sp+10h] [bp-58h]@5
  577.   int v4; // [sp+48h] [bp-20h]@1
  578.   int v5; // [sp+4Ch] [bp-1Ch]@1
  579.   int v6; // [sp+50h] [bp-18h]@1
  580.   unsigned int v7; // [sp+54h] [bp-14h]@4
  581.   int v8; // [sp+58h] [bp-10h]@4
  582.   unsigned int v9; // [sp+5Ch] [bp-Ch]@4
  583.  
  584.   v4 = *(_DWORD *)a1;
  585.   v5 = *(_DWORD *)(a1 + 4);
  586.   v6 = (*(_DWORD *)a1 >> 3) & 0x3F;
  587.   if ( v6 > 55 )
  588.     v1 = 120 - v6;
  589.   else
  590.     v1 = 56 - v6;
  591.   v9 = v1;
  592.   sub_804939E(a1, (int)&unk_804E3C0, v1);
  593.   v7 = 0;
  594.   v8 = 0;
  595.   while ( v7 <= 0xD )
  596.   {
  597.     v3[v7++] = (*(_BYTE *)(a1 + v8 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v8 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v8 + 3 + 24) << 24) | *(_BYTE *)(a1 + v8 + 24);
  598.     v8 += 4;
  599.   }
  600.   result = sub_8049649(a1 + 8, (int)v3);
  601.   v7 = 0;
  602.   v8 = 0;
  603.   while ( v7 <= 3 )
  604.   {
  605.     *(_BYTE *)(a1 + v8 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8);
  606.     *(_BYTE *)(a1 + v8 + 1 + 88) = *(_WORD *)(a1 + 4 * v7 + 8) >> 8;
  607.     *(_BYTE *)(a1 + v8 + 2 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8) >> 16;
  608.     result = a1;
  609.     *(_BYTE *)(a1 + v8 + 3 + 88) = *(_DWORD *)(a1 + 4 * v7++ + 8) >> 24;
  610.     v8 += 4;
  611.   }
  612.   return result;
  613. }
  614. // 80494D4: using guessed type int var_58[14];
  615.  
  616. //----- (08049649) --------------------------------------------------------
  617. int __cdecl sub_8049649(int a1, int a2)
  618. {
  619.   int result; // eax@1
  620.   int v3; // ST04_4@1
  621.   int v4; // ST08_4@1
  622.   int v5; // ST0C_4@1
  623.   int v6; // et0@1
  624.   int v7; // ST00_4@1
  625.   int v8; // et0@1
  626.   int v9; // ST0C_4@1
  627.   int v10; // et0@1
  628.   int v11; // ST08_4@1
  629.   int v12; // et0@1
  630.   int v13; // ST04_4@1
  631.   int v14; // et0@1
  632.   int v15; // ST00_4@1
  633.   int v16; // et0@1
  634.   int v17; // ST0C_4@1
  635.   int v18; // et0@1
  636.   int v19; // ST08_4@1
  637.   int v20; // et0@1
  638.   int v21; // ST04_4@1
  639.   int v22; // et0@1
  640.   int v23; // ST00_4@1
  641.   int v24; // et0@1
  642.   int v25; // ST0C_4@1
  643.   int v26; // et0@1
  644.   int v27; // ST08_4@1
  645.   int v28; // et0@1
  646.   int v29; // ST04_4@1
  647.   int v30; // et0@1
  648.   int v31; // ST00_4@1
  649.   int v32; // et0@1
  650.   int v33; // ST0C_4@1
  651.   int v34; // et0@1
  652.   int v35; // ST08_4@1
  653.   int v36; // et0@1
  654.   int v37; // ST04_4@1
  655.   int v38; // et0@1
  656.   int v39; // ST00_4@1
  657.   int v40; // et0@1
  658.   int v41; // ST0C_4@1
  659.   int v42; // et0@1
  660.   int v43; // ST08_4@1
  661.   int v44; // et0@1
  662.   int v45; // ST04_4@1
  663.   int v46; // et0@1
  664.   int v47; // ST00_4@1
  665.   int v48; // et0@1
  666.   int v49; // ST0C_4@1
  667.   int v50; // et0@1
  668.   int v51; // ST08_4@1
  669.   int v52; // et0@1
  670.   int v53; // ST04_4@1
  671.   int v54; // et0@1
  672.   int v55; // ST00_4@1
  673.   int v56; // et0@1
  674.   int v57; // ST0C_4@1
  675.   int v58; // et0@1
  676.   int v59; // ST08_4@1
  677.   int v60; // et0@1
  678.   int v61; // ST04_4@1
  679.   int v62; // et0@1
  680.   int v63; // ST00_4@1
  681.   int v64; // et0@1
  682.   int v65; // ST0C_4@1
  683.   int v66; // et0@1
  684.   int v67; // ST08_4@1
  685.   int v68; // et0@1
  686.   int v69; // ST04_4@1
  687.   int v70; // et0@1
  688.   int v71; // ST00_4@1
  689.   int v72; // et0@1
  690.   int v73; // ST0C_4@1
  691.   int v74; // et0@1
  692.   int v75; // ST08_4@1
  693.   int v76; // et0@1
  694.   int v77; // ST04_4@1
  695.   int v78; // et0@1
  696.   int v79; // ST00_4@1
  697.   int v80; // et0@1
  698.   int v81; // ST0C_4@1
  699.   int v82; // et0@1
  700.   int v83; // ST08_4@1
  701.   int v84; // et0@1
  702.   int v85; // ST04_4@1
  703.   int v86; // et0@1
  704.   int v87; // ST00_4@1
  705.   int v88; // et0@1
  706.   int v89; // ST0C_4@1
  707.   int v90; // et0@1
  708.   int v91; // ST08_4@1
  709.   int v92; // et0@1
  710.   int v93; // ST04_4@1
  711.   int v94; // et0@1
  712.   int v95; // ST00_4@1
  713.   int v96; // et0@1
  714.   int v97; // ST0C_4@1
  715.   int v98; // et0@1
  716.   int v99; // ST08_4@1
  717.   int v100; // et0@1
  718.   int v101; // ST04_4@1
  719.   int v102; // et0@1
  720.   int v103; // ST00_4@1
  721.   int v104; // et0@1
  722.   int v105; // ST0C_4@1
  723.   int v106; // et0@1
  724.   int v107; // ST08_4@1
  725.   int v108; // et0@1
  726.   int v109; // ST04_4@1
  727.   int v110; // et0@1
  728.   int v111; // ST00_4@1
  729.   int v112; // et0@1
  730.   int v113; // ST0C_4@1
  731.   int v114; // et0@1
  732.   int v115; // ST08_4@1
  733.   int v116; // et0@1
  734.   int v117; // ST04_4@1
  735.   int v118; // et0@1
  736.   int v119; // ST00_4@1
  737.   int v120; // et0@1
  738.   int v121; // ST0C_4@1
  739.   int v122; // et0@1
  740.   int v123; // ST08_4@1
  741.   int v124; // et0@1
  742.   int v125; // ST04_4@1
  743.   int v126; // et0@1
  744.   int v127; // ST00_4@1
  745.   int v128; // et0@1
  746.   int v129; // ST0C_4@1
  747.   int v130; // et0@1
  748.   int v131; // ST08_4@1
  749.   int v132; // et0@1
  750.  
  751.   v3 = *(_DWORD *)(a1 + 4);
  752.   v4 = *(_DWORD *)(a1 + 8);
  753.   v5 = *(_DWORD *)(a1 + 12);
  754.   v6 = __ROR__(*(_DWORD *)a1 + (v5 & ~v3 | v4 & v3) + *(_DWORD *)a2 - 680876936, 25);
  755.   v7 = v3 + v6;
  756.   v8 = __ROR__(v5 + (v4 & ~(v3 + v6) | v3 & (v3 + v6)) + *(_DWORD *)(a2 + 4) - 389564586, 20);
  757.   v9 = v7 + v8;
  758.   v10 = __ROR__(v4 + (v3 & ~(v7 + v8) | v7 & (v7 + v8)) + *(_DWORD *)(a2 + 8) + 606105819, 15);
  759.   v11 = v9 + v10;
  760.   v12 = __ROR__(v3 + (v7 & ~(v9 + v10) | v9 & (v9 + v10)) + *(_DWORD *)(a2 + 12) - 1044525330, 10);
  761.   v13 = v11 + v12;
  762.   v14 = __ROR__(v7 + (v9 & ~(v11 + v12) | v11 & (v11 + v12)) + *(_DWORD *)(a2 + 16) - 176418897, 25);
  763.   v15 = v13 + v14;
  764.   v16 = __ROR__(v9 + (v11 & ~(v13 + v14) | v13 & (v13 + v14)) + *(_DWORD *)(a2 + 20) + 1200080426, 20);
  765.   v17 = v15 + v16;
  766.   v18 = __ROR__(v11 + (v13 & ~(v15 + v16) | v15 & (v15 + v16)) + *(_DWORD *)(a2 + 24) - 1473231341, 15);
  767.   v19 = v17 + v18;
  768.   v20 = __ROR__(v13 + (v15 & ~(v17 + v18) | v17 & (v17 + v18)) + *(_DWORD *)(a2 + 28) - 45705983, 10);
  769.   v21 = v19 + v20;
  770.   v22 = __ROR__(v15 + (v17 & ~(v19 + v20) | v19 & (v19 + v20)) + *(_DWORD *)(a2 + 32) + 1770035416, 25);
  771.   v23 = v21 + v22;
  772.   v24 = __ROR__(v17 + (v19 & ~(v21 + v22) | v21 & (v21 + v22)) + *(_DWORD *)(a2 + 36) - 1958414417, 20);
  773.   v25 = v23 + v24;
  774.   v26 = __ROR__(v19 + (v21 & ~(v23 + v24) | v23 & (v23 + v24)) + *(_DWORD *)(a2 + 40) - 42063, 15);
  775.   v27 = v25 + v26;
  776.   v28 = __ROR__(v21 + (v23 & ~(v25 + v26) | v25 & (v25 + v26)) + *(_DWORD *)(a2 + 44) - 1990404162, 10);
  777.   v29 = v27 + v28;
  778.   v30 = __ROR__(v23 + (v25 & ~(v27 + v28) | v27 & (v27 + v28)) + *(_DWORD *)(a2 + 48) + 1804603682, 25);
  779.   v31 = v29 + v30;
  780.   v32 = __ROR__(v25 + (v27 & ~(v29 + v30) | v29 & (v29 + v30)) + *(_DWORD *)(a2 + 52) - 40341101, 20);
  781.   v33 = v31 + v32;
  782.   v34 = __ROR__(v27 + (v29 & ~(v31 + v32) | v31 & (v31 + v32)) + *(_DWORD *)(a2 + 56) - 1502002290, 15);
  783.   v35 = v33 + v34;
  784.   v36 = __ROR__(v29 + (v31 & ~(v33 + v34) | v33 & (v33 + v34)) + *(_DWORD *)(a2 + 60) + 1236535329, 10);
  785.   v37 = v35 + v36;
  786.   v38 = __ROR__(v31 + (v35 & ~v33 | v33 & (v35 + v36)) + *(_DWORD *)(a2 + 4) - 165796510, 27);
  787.   v39 = v37 + v38;
  788.   v40 = __ROR__(v33 + (v37 & ~v35 | v35 & (v37 + v38)) + *(_DWORD *)(a2 + 24) - 1069501632, 23);
  789.   v41 = v39 + v40;
  790.   v42 = __ROR__(v35 + (v39 & ~v37 | v37 & (v39 + v40)) + *(_DWORD *)(a2 + 44) + 643717713, 18);
  791.   v43 = v41 + v42;
  792.   v44 = __ROR__(v37 + (v41 & ~v39 | v39 & (v41 + v42)) + *(_DWORD *)a2 - 373897302, 12);
  793.   v45 = v43 + v44;
  794.   v46 = __ROR__(v39 + (v43 & ~v41 | v41 & (v43 + v44)) + *(_DWORD *)(a2 + 20) - 701558691, 27);
  795.   v47 = v45 + v46;
  796.   v48 = __ROR__(v41 + (v45 & ~v43 | v43 & (v45 + v46)) + *(_DWORD *)(a2 + 40) + 38016083, 23);
  797.   v49 = v47 + v48;
  798.   v50 = __ROR__(v43 + (v47 & ~v45 | v45 & (v47 + v48)) + *(_DWORD *)(a2 + 60) - 660478335, 18);
  799.   v51 = v49 + v50;
  800.   v52 = __ROR__(v45 + (v49 & ~v47 | v47 & (v49 + v50)) + *(_DWORD *)(a2 + 16) - 405537848, 12);
  801.   v53 = v51 + v52;
  802.   v54 = __ROR__(v47 + (v51 & ~v49 | v49 & (v51 + v52)) + *(_DWORD *)(a2 + 36) + 568446438, 27);
  803.   v55 = v53 + v54;
  804.   v56 = __ROR__(v49 + (v53 & ~v51 | v51 & (v53 + v54)) + *(_DWORD *)(a2 + 56) - 1019803690, 23);
  805.   v57 = v55 + v56;
  806.   v58 = __ROR__(v51 + (v55 & ~v53 | v53 & (v55 + v56)) + *(_DWORD *)(a2 + 12) - 187363961, 18);
  807.   v59 = v57 + v58;
  808.   v60 = __ROR__(v53 + (v57 & ~v55 | v55 & (v57 + v58)) + *(_DWORD *)(a2 + 32) + 1163531501, 12);
  809.   v61 = v59 + v60;
  810.   v62 = __ROR__(v55 + (v59 & ~v57 | v57 & (v59 + v60)) + *(_DWORD *)(a2 + 52) - 1444681467, 27);
  811.   v63 = v61 + v62;
  812.   v64 = __ROR__(v57 + (v61 & ~v59 | v59 & (v61 + v62)) + *(_DWORD *)(a2 + 8) - 51403784, 23);
  813.   v65 = v63 + v64;
  814.   v66 = __ROR__(v59 + (v63 & ~v61 | v61 & (v63 + v64)) + *(_DWORD *)(a2 + 28) + 1735328473, 18);
  815.   v67 = v65 + v66;
  816.   v68 = __ROR__(v61 + (v65 & ~v63 | v63 & (v65 + v66)) + *(_DWORD *)(a2 + 48) - 1926607734, 12);
  817.   v69 = v67 + v68;
  818.   v70 = __ROR__(v63 + (v65 ^ (v67 + v68) ^ v67) + *(_DWORD *)(a2 + 20) - 378558, 28);
  819.   v71 = v69 + v70;
  820.   v72 = __ROR__(v65 + (v67 ^ (v69 + v70) ^ v69) + *(_DWORD *)(a2 + 32) - 2022574463, 21);
  821.   v73 = v71 + v72;
  822.   v74 = __ROR__(v67 + (v69 ^ (v71 + v72) ^ v71) + *(_DWORD *)(a2 + 44) + 1839030562, 16);
  823.   v75 = v73 + v74;
  824.   v76 = __ROR__(v69 + (v71 ^ (v73 + v74) ^ v73) + *(_DWORD *)(a2 + 56) - 35309556, 9);
  825.   v77 = v75 + v76;
  826.   v78 = __ROR__(v71 + (v73 ^ (v75 + v76) ^ v75) + *(_DWORD *)(a2 + 4) - 1530992060, 28);
  827.   v79 = v77 + v78;
  828.   v80 = __ROR__(v73 + (v75 ^ (v77 + v78) ^ v77) + *(_DWORD *)(a2 + 16) + 1272893353, 21);
  829.   v81 = v79 + v80;
  830.   v82 = __ROR__(v75 + (v77 ^ (v79 + v80) ^ v79) + *(_DWORD *)(a2 + 28) - 155497632, 16);
  831.   v83 = v81 + v82;
  832.   v84 = __ROR__(v77 + (v79 ^ (v81 + v82) ^ v81) + *(_DWORD *)(a2 + 40) - 1094730640, 9);
  833.   v85 = v83 + v84;
  834.   v86 = __ROR__(v79 + (v81 ^ (v83 + v84) ^ v83) + *(_DWORD *)(a2 + 52) + 681279174, 28);
  835.   v87 = v85 + v86;
  836.   v88 = __ROR__(v81 + (v83 ^ (v85 + v86) ^ v85) + *(_DWORD *)a2 - 358537222, 21);
  837.   v89 = v87 + v88;
  838.   v90 = __ROR__(v83 + (v85 ^ (v87 + v88) ^ v87) + *(_DWORD *)(a2 + 12) - 722521979, 16);
  839.   v91 = v89 + v90;
  840.   v92 = __ROR__(v85 + (v87 ^ (v89 + v90) ^ v89) + *(_DWORD *)(a2 + 24) + 76029189, 9);
  841.   v93 = v91 + v92;
  842.   v94 = __ROR__(v87 + (v89 ^ (v91 + v92) ^ v91) + *(_DWORD *)(a2 + 36) - 640364487, 28);
  843.   v95 = v93 + v94;
  844.   v96 = __ROR__(v89 + (v91 ^ (v93 + v94) ^ v93) + *(_DWORD *)(a2 + 48) - 421815835, 21);
  845.   v97 = v95 + v96;
  846.   v98 = __ROR__(v91 + (v93 ^ (v95 + v96) ^ v95) + *(_DWORD *)(a2 + 60) + 530742520, 16);
  847.   v99 = v97 + v98;
  848.   v100 = __ROR__(v93 + (v95 ^ (v97 + v98) ^ v97) + *(_DWORD *)(a2 + 8) - 995338651, 9);
  849.   v101 = v99 + v100;
  850.   v102 = __ROR__(v95 + (v99 ^ ((v99 + v100) | ~v97)) + *(_DWORD *)a2 - 198630844, 26);
  851.   v103 = v101 + v102;
  852.   v104 = __ROR__(v97 + (v101 ^ ((v101 + v102) | ~v99)) + *(_DWORD *)(a2 + 28) + 1126891415, 22);
  853.   v105 = v103 + v104;
  854.   v106 = __ROR__(v99 + (v103 ^ ((v103 + v104) | ~v101)) + *(_DWORD *)(a2 + 56) - 1416354905, 17);
  855.   v107 = v105 + v106;
  856.   v108 = __ROR__(v101 + (v105 ^ ((v105 + v106) | ~v103)) + *(_DWORD *)(a2 + 20) - 57434055, 11);
  857.   v109 = v107 + v108;
  858.   v110 = __ROR__(v103 + (v107 ^ ((v107 + v108) | ~v105)) + *(_DWORD *)(a2 + 48) + 1700485571, 26);
  859.   v111 = v109 + v110;
  860.   v112 = __ROR__(v105 + (v109 ^ ((v109 + v110) | ~v107)) + *(_DWORD *)(a2 + 12) - 1894986606, 22);
  861.   v113 = v111 + v112;
  862.   v114 = __ROR__(v107 + (v111 ^ ((v111 + v112) | ~v109)) + *(_DWORD *)(a2 + 40) - 1051523, 17);
  863.   v115 = v113 + v114;
  864.   v116 = __ROR__(v109 + (v113 ^ ((v113 + v114) | ~v111)) + *(_DWORD *)(a2 + 4) - 2054922799, 11);
  865.   v117 = v115 + v116;
  866.   v118 = __ROR__(v111 + (v115 ^ ((v115 + v116) | ~v113)) + *(_DWORD *)(a2 + 32) + 1873313359, 26);
  867.   v119 = v117 + v118;
  868.   v120 = __ROR__(v113 + (v117 ^ ((v117 + v118) | ~v115)) + *(_DWORD *)(a2 + 60) - 30611744, 22);
  869.   v121 = v119 + v120;
  870.   v122 = __ROR__(v115 + (v119 ^ ((v119 + v120) | ~v117)) + *(_DWORD *)(a2 + 24) - 1560198380, 17);
  871.   v123 = v121 + v122;
  872.   v124 = __ROR__(v117 + (v121 ^ ((v121 + v122) | ~v119)) + *(_DWORD *)(a2 + 52) + 1309151649, 11);
  873.   v125 = v123 + v124;
  874.   v126 = __ROR__(v119 + (v123 ^ ((v123 + v124) | ~v121)) + *(_DWORD *)(a2 + 16) - 145523070, 26);
  875.   v127 = v125 + v126;
  876.   v128 = __ROR__(v121 + (v125 ^ ((v125 + v126) | ~v123)) + *(_DWORD *)(a2 + 44) - 1120210379, 22);
  877.   v129 = v127 + v128;
  878.   v130 = __ROR__(v123 + (v127 ^ ((v127 + v128) | ~v125)) + *(_DWORD *)(a2 + 8) + 718787259, 17);
  879.   v131 = v129 + v130;
  880.   v132 = __ROR__(v125 + (v129 ^ ((v129 + v130) | ~v127)) + *(_DWORD *)(a2 + 36) - 343485551, 11);
  881.   *(_DWORD *)a1 += v127;
  882.   *(_DWORD *)(a1 + 4) += v131 + v132;
  883.   *(_DWORD *)(a1 + 8) += v131;
  884.   result = v129 + *(_DWORD *)(a1 + 12);
  885.   *(_DWORD *)(a1 + 12) = result;
  886.   return result;
  887. }
  888.  
  889. //----- (0804A296) --------------------------------------------------------
  890. int __cdecl sub_804A296(int a1)
  891. {
  892.   int result; // eax@2
  893.   signed int i; // [sp+1Ch] [bp-Ch]@1
  894.  
  895.   for ( i = 0; i <= 15; ++i )
  896.     result = printf("%02x", *(_BYTE *)(a1 + i + 88));
  897.   return result;
  898. }
  899.  
  900. //----- (0804A2D0) --------------------------------------------------------
  901. int __cdecl sub_804A2D0()
  902. {
  903.   char v1[1000]; // [sp+24h] [bp-464h]@2
  904.   time_t timer; // [sp+40Ch] [bp-7Ch]@4
  905.   int v3; // [sp+410h] [bp-78h]@7
  906.   char v4; // [sp+414h] [bp-74h]@4
  907.   unsigned int i; // [sp+47Ch] [bp-Ch]@1
  908.  
  909.   for ( i = 0; i <= 0x3E7; ++i )
  910.     v1[i] = i;
  911.   printf("MD5 time trial. Processing %ld characters...\n", dword_804E400);
  912.   time(&timer);
  913.   sub_804935C((int)&v4);
  914.   for ( i = 10000; i; --i )
  915.     sub_804939E((int)&v4, (int)v1, 0x3E8u);
  916.   sub_80494D4((int)&v4);
  917.   time((time_t *)&v3);
  918.   sub_804A296((int)&v4);
  919.   puts(" is digest of test input.");
  920.   printf("Seconds to process test input: %ld\n", v3 - timer);
  921.   return printf("Characters processed per second: %ld\n", dword_804E400 / (v3 - timer));
  922. }
  923. // 804E400: using guessed type int dword_804E400;
  924. // 804A2D0: using guessed type char var_464[1000];
  925.  
  926. //----- (0804A3DC) --------------------------------------------------------
  927. int __cdecl sub_804A3DC(const char *s)
  928. {
  929.   char v2; // [sp+14h] [bp-74h]@1
  930.   unsigned int v3; // [sp+7Ch] [bp-Ch]@1
  931.  
  932.   v3 = strlen(s);
  933.   sub_804935C((int)&v2);
  934.   sub_804939E((int)&v2, (int)s, v3);
  935.   sub_80494D4((int)&v2);
  936.   sub_804A296((int)&v2);
  937.   return printf(" \"%s\"\n\n", s);
  938. }
  939.  
  940. //----- (0804A443) --------------------------------------------------------
  941. int __cdecl sub_804A443(const char *filename)
  942. {
  943.   int result; // eax@2
  944.   char ptr; // [sp+10h] [bp-478h]@4
  945.   char v3; // [sp+410h] [bp-78h]@3
  946.   FILE *stream; // [sp+478h] [bp-10h]@1
  947.   unsigned int v5; // [sp+47Ch] [bp-Ch]@4
  948.  
  949.   stream = fopen(filename, "rb");
  950.   if ( stream )
  951.   {
  952.     sub_804935C((int)&v3);
  953.     while ( 1 )
  954.     {
  955.       v5 = fread(&ptr, 1u, 0x400u, stream);
  956.       if ( !v5 )
  957.         break;
  958.       sub_804939E((int)&v3, (int)&ptr, v5);
  959.     }
  960.     sub_80494D4((int)&v3);
  961.     sub_804A296((int)&v3);
  962.     printf(" %s\n", filename);
  963.     result = fclose(stream);
  964.   }
  965.   else
  966.   {
  967.     result = printf("%s can't be opened.\n", filename);
  968.   }
  969.   return result;
  970. }
  971.  
  972. //----- (0804A60A) --------------------------------------------------------
  973. char *__cdecl sub_804A60A(int a1, char *dest)
  974. {
  975.   char *result; // eax@1
  976.   char src; // [sp+16h] [bp-42h]@2
  977.   int i; // [sp+48h] [bp-10h]@1
  978.   int v5; // [sp+4Ch] [bp-Ch]@2
  979.  
  980.   result = dest;
  981.   *dest = 0;
  982.   for ( i = 0; i <= 15; ++i )
  983.   {
  984.     v5 = sprintf(&src, "%02x", *(_BYTE *)(a1 + i + 88));
  985.     result = strcat(dest, &src);
  986.   }
  987.   return result;
  988. }
  989.  
  990. //----- (0804A666) --------------------------------------------------------
  991. char *__cdecl sub_804A666(const char *s, char *dest)
  992. {
  993.   int v3; // [sp+14h] [bp-74h]@1
  994.   unsigned int v4; // [sp+7Ch] [bp-Ch]@1
  995.  
  996.   v4 = strlen(s);
  997.   sub_804935C((int)&v3);
  998.   sub_804939E((int)&v3, (int)s, v4);
  999.   sub_80494D4((int)&v3);
  1000.   return sub_804A60A((int)&v3, dest);
  1001. }
  1002.  
  1003. //----- (0804A6C0) --------------------------------------------------------
  1004. int __cdecl sub_804A6C0(int fd, int a2)
  1005. {
  1006.   sub_8048F10(fd, "<node> %x\n", a2);
  1007.   sub_8048F10(fd, "  chickens: %u \n", *(_DWORD *)(a2 + 60));
  1008.   sub_8048F10(fd, "  eggs:     %u \n", *(_DWORD *)(a2 + 68));
  1009.   sub_8048F10(fd, "  monies:   %u \n", *(_DWORD *)(a2 + 64));
  1010.   sub_8048F10(fd, "  id:       %u \n", *(_DWORD *)(a2 + 72));
  1011.   sub_8048F10(fd, "  username: %s \n", a2);
  1012.   sub_8048F10(fd, "  info:     %s \n", a2 + 84);
  1013.   sub_8048F10(fd, "  office:   %s \n", a2 + 134);
  1014.   sub_8048F10(fd, "  password: %s \n\n", a2 + 20);
  1015.   sub_8048F10(fd, "  perm:     %u \n", *(_DWORD *)(a2 + 56));
  1016.   sub_8048F10(fd, "  next:     %x \n", *(_DWORD *)(a2 + 76));
  1017.   return sub_8048F10(fd, "  prev:     %x \n", *(_DWORD *)(a2 + 80));
  1018. }
  1019.  
  1020. //----- (0804A820) --------------------------------------------------------
  1021. int __cdecl sub_804A820(int fd, int a2)
  1022. {
  1023.   int result; // eax@3
  1024.   int i; // [sp+1Ch] [bp-Ch]@1
  1025.  
  1026.   for ( i = a2; ; sub_804A6C0(fd, i) )
  1027.   {
  1028.     result = *(_DWORD *)(i + 76);
  1029.     if ( !result )
  1030.       break;
  1031.     i = *(_DWORD *)(i + 76);
  1032.   }
  1033.   return result;
  1034. }
  1035.  
  1036. //----- (0804A855) --------------------------------------------------------
  1037. int __cdecl sub_804A855(int fd, int a2)
  1038. {
  1039.   int result; // eax@4
  1040.   int v3; // [sp+1Ch] [bp-Ch]@1
  1041.  
  1042.   v3 = a2;
  1043.   while ( 1 )
  1044.   {
  1045.     result = *(_DWORD *)(v3 + 76);
  1046.     if ( !result )
  1047.       break;
  1048.     v3 = *(_DWORD *)(v3 + 76);
  1049.     if ( !strcmp(&s1, (const char *)v3) )
  1050.       sub_804A6C0(fd, v3);
  1051.   }
  1052.   return result;
  1053. }
  1054.  
  1055. //----- (0804A8A1) --------------------------------------------------------
  1056. int __cdecl sub_804A8A1(int fd, char *a2, const char *s1, const char *s)
  1057. {
  1058.   char dest; // [sp+17h] [bp-31h]@3
  1059.   char v6; // [sp+37h] [bp-11h]@3
  1060.   int v7; // [sp+38h] [bp-10h]@1
  1061.   char *src; // [sp+3Ch] [bp-Ch]@1
  1062.  
  1063.   v7 = 1;
  1064.   src = a2;
  1065.   while ( *((_DWORD *)src + 19) )
  1066.   {
  1067.     src = (char *)*((_DWORD *)src + 19);
  1068.     if ( !strcmp(s1, src) )
  1069.     {
  1070.       sub_804A666(s, &dest);
  1071.       v6 = 0;
  1072.       if ( !strncmp(&dest, src + 20, 0x20u) )
  1073.       {
  1074.         sub_8048F10(fd, "lcgged in!\n", src + 20);
  1075.         dword_804E424 = 1;
  1076.         strncpy(&::s1, src, 0x14u);
  1077.         if ( *((_DWORD *)src + 14) > 0x1F3u )
  1078.           dword_804E420 = 1;
  1079.         return 0;
  1080.       }
  1081.     }
  1082.   }
  1083.   return v7;
  1084. }
  1085. // 804E420: using guessed type int dword_804E420;
  1086. // 804E424: using guessed type int dword_804E424;
  1087.  
  1088. //----- (0804A988) --------------------------------------------------------
  1089. void __cdecl sub_804A988()
  1090. {
  1091.   dword_804E424 = 0;
  1092.   dword_804E420 = 0;
  1093.   s1 = 0;
  1094. }
  1095. // 804E420: using guessed type int dword_804E420;
  1096. // 804E424: using guessed type int dword_804E424;
  1097.  
  1098. //----- (0804A9CB) --------------------------------------------------------
  1099. signed int __cdecl sub_804A9CB(int a1, const char *s2)
  1100. {
  1101.   int v3; // [sp+1Ch] [bp-Ch]@1
  1102.  
  1103.   v3 = a1;
  1104.   while ( *(_DWORD *)(v3 + 76) )
  1105.   {
  1106.     v3 = *(_DWORD *)(v3 + 76);
  1107.     if ( !strcmp((const char *)v3, s2) )
  1108.       return 1;
  1109.   }
  1110.   return 0;
  1111. }
  1112.  
  1113. //----- (0804AA10) --------------------------------------------------------
  1114. int __cdecl sub_804AA10(int fd, int a2)
  1115. {
  1116.   int i; // [sp+1Ch] [bp-Ch]@1
  1117.  
  1118.   for ( i = sub_8048E0A(fd, a2, 0x257u, 10);
  1119.         i != 1 || *(_BYTE *)a2 != 121 && *(_BYTE *)a2 != 110;
  1120.         i = sub_8048E0A(fd, a2, 0x257u, 10) )
  1121.     sub_8048E75(fd, "[y/n]", 0);
  1122.   return *(_BYTE *)a2;
  1123. }
  1124.  
  1125. //----- (0804AA9F) --------------------------------------------------------
  1126. signed int __cdecl sub_804AA9F(int fd, const char *s, int a3)
  1127. {
  1128.   signed int result; // eax@2
  1129.   const char dest[33]; // [sp+39h] [bp-8Fh]@3
  1130.   const char v5[20]; // [sp+5Ah] [bp-6Eh]@3
  1131.   const char v6[50]; // [sp+6Eh] [bp-5Ah]@3
  1132.   char src; // [sp+A0h] [bp-28h]@1
  1133.   int v8; // [sp+B4h] [bp-14h]@1
  1134.   int v9; // [sp+B8h] [bp-10h]@1
  1135.   int v10; // [sp+BCh] [bp-Ch]@1
  1136.  
  1137.   v8 = 0;
  1138.   v10 = 0;
  1139.   sub_8048E75(fd, "enter new username: ", 0);
  1140.   v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  1141.   s[v9] = 0;
  1142.   strncpy(&src, s, 0x14u);
  1143.   if ( sub_804A9CB(a3, &src) )
  1144.   {
  1145.     result = 1;
  1146.   }
  1147.   else
  1148.   {
  1149.     sub_8048E75(fd, "enter new info: ", 0);
  1150.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  1151.     s[v9] = 0;
  1152.     strncpy((char *)v6, s, 0x32u);
  1153.     sub_8048E75(fd, "enter new office: ", 0);
  1154.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  1155.     s[v9] = 0;
  1156.     strncpy((char *)v5, s, 0x14u);
  1157.     sub_8048E75(fd, "enter new pass: ", 0);
  1158.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  1159.     s[v9] = 0;
  1160.     strncpy((char *)dest, s, 0x21u);
  1161.     sub_804A666(s, (char *)dest);
  1162.     if ( sub_804B9E6(fd, a3, &src, v6, v5, dest, v8, 1, 1000, 0, 0) )
  1163.     {
  1164.       v10 = 1;
  1165.       sub_8048F10(fd, "insert failed.\n");
  1166.     }
  1167.     result = v10;
  1168.   }
  1169.   return result;
  1170. }
  1171.  
  1172. //----- (0804ACFC) --------------------------------------------------------
  1173. int __cdecl sub_804ACFC(int fd, const char *nptr, int a3)
  1174. {
  1175.   int result; // eax@4
  1176.   int v4; // [sp+2E8h] [bp-10h]@1
  1177.   int v5; // [sp+2ECh] [bp-Ch]@5
  1178.  
  1179.   v4 = a3;
  1180.   do
  1181.   {
  1182.     if ( !*(_DWORD *)(v4 + 76) )
  1183.       break;
  1184.     v4 = *(_DWORD *)(v4 + 76);
  1185.   }
  1186.   while ( strcmp(&s1, (const char *)v4) );
  1187.   sub_8048F10(fd, "you currently have $%u and %u eggs\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 68));
  1188.   sub_8048F10(fd, "market price for an egg is %u\n ", *(_DWORD *)dword_804E410);
  1189.   sub_8048F10(fd, "would you like to sell eggs [y/n]: ");
  1190.   result = sub_804AA10(fd, (int)nptr);
  1191.   if ( (_BYTE)result == 121 )
  1192.   {
  1193.     sub_8048F10(fd, "how many?: ");
  1194.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  1195.     v5 = atoi(nptr);
  1196.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 68) )
  1197.     {
  1198.       result = sub_8048F10(fd, "not enough eggs!\n");
  1199.     }
  1200.     else
  1201.     {
  1202.       *(_DWORD *)(v4 + 68) -= v5;
  1203.       *(_DWORD *)(v4 + 64) += v5 * *(_DWORD *)dword_804E410;
  1204.       result = sub_8048F10(fd, "%u sold!\n", v5);
  1205.     }
  1206.   }
  1207.   return result;
  1208. }
  1209.  
  1210. //----- (0804AE76) --------------------------------------------------------
  1211. int __cdecl sub_804AE76(int fd, const char *nptr, int a3)
  1212. {
  1213.   int result; // eax@4
  1214.   int v4; // [sp+2E4h] [bp-14h]@1
  1215.   int v5; // [sp+2ECh] [bp-Ch]@6
  1216.  
  1217.   v4 = a3;
  1218.   do
  1219.   {
  1220.     if ( !*(_DWORD *)(v4 + 76) )
  1221.       break;
  1222.     v4 = *(_DWORD *)(v4 + 76);
  1223.   }
  1224.   while ( strcmp(&s1, (const char *)v4) );
  1225.   sub_8048F10(fd, "you currently have $%u\n ", *(_DWORD *)(v4 + 64));
  1226.   sub_8048F10(fd, "would you like to incinerate some?[y/n]: ");
  1227.   result = sub_804AA10(fd, (int)nptr);
  1228.   if ( (_BYTE)result == 121 || (_BYTE)result == 110 )
  1229.   {
  1230.     sub_8048F10(fd, "how much?: ");
  1231.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  1232.     v5 = atoi(nptr);
  1233.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 64) )
  1234.     {
  1235.       *(_DWORD *)(v4 + 64) = 0;
  1236.       result = sub_8048F10(fd, "oh snap!  it's all gone! all that's left is ashes!\n");
  1237.     }
  1238.     else
  1239.     {
  1240.       *(_DWORD *)(v4 + 64) -= v5;
  1241.       result = sub_8048F10(fd, "%u burnt to a crisp!\n", v5);
  1242.     }
  1243.   }
  1244.   return result;
  1245. }
  1246.  
  1247. //----- (0804AFC6) --------------------------------------------------------
  1248. int __cdecl sub_804AFC6(int fd, const char *nptr, int a3)
  1249. {
  1250.   int result; // eax@4
  1251.   int v4; // [sp+2E8h] [bp-10h]@1
  1252.   int v5; // [sp+2ECh] [bp-Ch]@5
  1253.  
  1254.   v4 = a3;
  1255.   do
  1256.   {
  1257.     if ( !*(_DWORD *)(v4 + 76) )
  1258.       break;
  1259.     v4 = *(_DWORD *)(v4 + 76);
  1260.   }
  1261.   while ( strcmp(&s1, (const char *)v4) );
  1262.   sub_8048F10(fd, "you currently have $%u and %u chickens\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 60));
  1263.   sub_8048F10(fd, "market price for a chicken is %u\n ", *(_DWORD *)dword_804E40C);
  1264.   sub_8048F10(fd, "would you like to buy chickens [y/n]: ");
  1265.   result = sub_804AA10(fd, (int)nptr);
  1266.   if ( (_BYTE)result == 121 )
  1267.   {
  1268.     sub_8048F10(fd, "how many?: ");
  1269.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  1270.     v5 = atoi(nptr);
  1271.     if ( (unsigned int)(*(_DWORD *)dword_804E40C * v5) > *(_DWORD *)(v4 + 64) )
  1272.     {
  1273.       result = sub_8048F10(fd, "not enough money!\n");
  1274.     }
  1275.     else
  1276.     {
  1277.       *(_DWORD *)(v4 + 64) -= v5 * *(_DWORD *)dword_804E40C;
  1278.       *(_DWORD *)(v4 + 60) += v5;
  1279.       result = sub_8048F10(fd, "%u purchased!\n", v5);
  1280.     }
  1281.   }
  1282.   return result;
  1283. }
  1284.  
  1285. //----- (0804B148) --------------------------------------------------------
  1286. int __cdecl sub_804B148(int fd, const char *nptr, int a3)
  1287. {
  1288.   int v4; // [sp+C0h] [bp-18h]@1
  1289.   int v5; // [sp+CCh] [bp-Ch]@1
  1290.  
  1291.   v4 = 0;
  1292.   v5 = a3;
  1293.   do
  1294.   {
  1295.     if ( !*(_DWORD *)(v5 + 76) )
  1296.       break;
  1297.     v5 = *(_DWORD *)(v5 + 76);
  1298.   }
  1299.   while ( strcmp(&s1, (const char *)v5) );
  1300.   sub_8048F10(fd, "would you like to change username (%s) [y/n]: ", &s1);
  1301.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1302.   {
  1303.     sub_8048F10(fd, "enter new username: ");
  1304.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1305.     nptr[v4] = 0;
  1306.     strncpy((char *)v5, nptr, 0x14u);
  1307.     strncpy(&s1, nptr, 0x14u);
  1308.   }
  1309.   sub_8048F10(fd, "would you like to change user info (%s) [y/n]: ", v5 + 84);
  1310.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1311.   {
  1312.     sub_8048F10(fd, "enter new info: ");
  1313.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1314.     nptr[v4] = 0;
  1315.     strncpy((char *)(v5 + 84), nptr, 0x32u);
  1316.   }
  1317.   sub_8048F10(fd, "would you like to change office #(%s) [y/n]: ", v5 + 134);
  1318.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1319.   {
  1320.     sub_8048F10(fd, "enter new office: ");
  1321.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1322.     nptr[v4] = 0;
  1323.     strcpy((char *)(v5 + 134), nptr);
  1324.   }
  1325.   sub_8048F10(fd, "would you like to change password [y/n]: ");
  1326.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1327.   {
  1328.     sub_8048F10(fd, "enter new pass: ");
  1329.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1330.     nptr[v4] = 0;
  1331.     strncpy((char *)(v5 + 20), nptr, 0x21u);
  1332.   }
  1333.   sub_8048F10(fd, "would you like to change uid(%u) [y/n]: ", *(_DWORD *)(v5 + 72));
  1334.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1335.   {
  1336.     sub_8048F10(fd, "enter new uid: ");
  1337.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1338.     nptr[v4] = 0;
  1339.     *(_DWORD *)(v5 + 72) = atoi(nptr);
  1340.   }
  1341.   sub_8048F10(fd, "would you like to change you egg count(%u) [y/n]: ", *(_DWORD *)(v5 + 68));
  1342.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1343.   {
  1344.     sub_8048F10(fd, "enter new egg count: ");
  1345.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1346.     nptr[v4] = 0;
  1347.     if ( dword_804E420 )
  1348.       *(_DWORD *)(v5 + 68) = atoi(nptr);
  1349.     else
  1350.       sub_8048F10(fd, "you don't have enough permissions to change egg amount\n");
  1351.   }
  1352.   sub_8048F10(fd, "would you like to change chicken count(%u) [y/n]: ", *(_DWORD *)(v5 + 60));
  1353.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1354.   {
  1355.     sub_8048F10(fd, "enter new chicken count: ");
  1356.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1357.     nptr[v4] = 0;
  1358.     if ( dword_804E420 )
  1359.       *(_DWORD *)(v5 + 60) = atoi(nptr);
  1360.     else
  1361.       sub_8048F10(fd, "you don't have enough permissions to adjust chickens\n");
  1362.   }
  1363.   sub_8048F10(fd, "would you like to change monies(%u) [y/n]: ", *(_DWORD *)(v5 + 64));
  1364.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1365.   {
  1366.     sub_8048F10(fd, "enter new monies: ");
  1367.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  1368.     nptr[v4] = 0;
  1369.     if ( dword_804E420 )
  1370.       *(_DWORD *)(v5 + 64) = atoi(nptr);
  1371.     else
  1372.       sub_8048F10(fd, "you don't have enough permissions to add monies\n");
  1373.   }
  1374.   sub_8048F10(fd, "would you like to change your perms(%u) [y/n]: ", *(_DWORD *)(v5 + 56));
  1375.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  1376.   {
  1377.     sub_8048F10(fd, "enter new perm: ");
  1378.     nptr[v4] = 0;
  1379.     if ( dword_804E420 )
  1380.       *(_DWORD *)(v5 + 56) = atoi(nptr);
  1381.     else
  1382.       sub_8048F10(fd, "you don't have enough permissions to change permissions\n");
  1383.   }
  1384.   sub_8048F10(fd, "finished updates \n");
  1385.   return 0;
  1386. }
  1387. // 804E420: using guessed type int dword_804E420;
  1388.  
  1389. //----- (0804B6F5) --------------------------------------------------------
  1390. int __cdecl sub_804B6F5(int fd, int s1, char *a3)
  1391. {
  1392.   int result; // eax@1
  1393.   int v4; // eax@1
  1394.   int v5; // eax@1
  1395.   const char s[600]; // [sp+14h] [bp-264h]@1
  1396.   int v7; // [sp+26Ch] [bp-Ch]@1
  1397.  
  1398.   sub_8048E75(fd, "enter username: ", 0);
  1399.   v4 = sub_8048E0A(fd, s1, 0x257u, 10);
  1400.   v7 = v4;
  1401.   *(_BYTE *)(s1 + v4) = 0;
  1402.   sub_8048E75(fd, "enter password: ", 0);
  1403.   v5 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  1404.   v7 = v5;
  1405.   s[v5] = 0;
  1406.   result = sub_804A8A1(fd, a3, (const char *)s1, s);
  1407.   if ( result )
  1408.     result = sub_8048E75(fd, "Bad username or pass: ", 0);
  1409.   return result;
  1410. }
  1411.  
  1412. //----- (0804B7E0) --------------------------------------------------------
  1413. int __cdecl sub_804B7E0(int fd)
  1414. {
  1415.   sub_8048E75(fd, "\n\nfantasy chicken farmin league\n", 0);
  1416.   if ( dword_804E424 )
  1417.   {
  1418.     sub_8048F10(fd, "\n\nmenu    (%s)\n", &s1);
  1419.     sub_8048F10(fd, " L) logout\n");
  1420.     sub_8048F10(fd, " b) buy chickens\n");
  1421.     sub_8048F10(fd, " i) incinerate money\n");
  1422.     sub_8048F10(fd, " s) sell eggs\n");
  1423.     sub_8048F10(fd, " p) display my info\n");
  1424.     sub_8048F10(fd, " u) update my info\n");
  1425.     if ( dword_804E420 )
  1426.       sub_8048F10(fd, " P) print userlist\n");
  1427.   }
  1428.   else
  1429.   {
  1430.     sub_8048F10(fd, "\n\nmenu\n");
  1431.     sub_8048F10(fd, " c) create account\n");
  1432.     sub_8048F10(fd, " l) login\n");
  1433.   }
  1434.   return sub_8048F10(fd, " q) quit \n");
  1435. }
  1436. // 804E420: using guessed type int dword_804E420;
  1437. // 804E424: using guessed type int dword_804E424;
  1438.  
  1439. //----- (0804B90A) --------------------------------------------------------
  1440. int __cdecl sub_804B90A(FILE *stream, int a2, unsigned int a3, char a4)
  1441. {
  1442.   char ptr; // [sp+2Bh] [bp-Dh]@2
  1443.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  1444.  
  1445.   for ( i = 0; ; ++i )
  1446.   {
  1447.     if ( !fread(&ptr, 1u, 1u, stream) )
  1448.       return -1;
  1449.     if ( ptr == a4 )
  1450.       return i;
  1451.     if ( i >= a3 )
  1452.       break;
  1453.     *(_BYTE *)(i + a2) = ptr;
  1454.   }
  1455.   return -1;
  1456. }
  1457.  
  1458. //----- (0804B9E6) --------------------------------------------------------
  1459. void *__cdecl sub_804B9E6(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11)
  1460. {
  1461.   void *result; // eax@1
  1462.   void *v12; // [sp+1Ch] [bp-Ch]@1
  1463.  
  1464.   result = malloc(0x9Cu);
  1465.   v12 = result;
  1466.   if ( result )
  1467.   {
  1468.     strcpy((char *)result, src);
  1469.     strcpy((char *)v12 + 84, a4);
  1470.     strcpy((char *)v12 + 134, a5);
  1471.     strcpy((char *)v12 + 20, a6);
  1472.     *((_DWORD *)v12 + 18) = a7;
  1473.     *((_DWORD *)v12 + 14) = a8;
  1474.     *((_DWORD *)v12 + 16) = a9;
  1475.     *((_DWORD *)v12 + 15) = a10;
  1476.     *((_DWORD *)v12 + 17) = a11;
  1477.     *((_DWORD *)v12 + 19) = *(_DWORD *)(a2 + 76);
  1478.     *((_DWORD *)v12 + 20) = a2;
  1479.     *(_DWORD *)(a2 + 76) = v12;
  1480.     result = 0;
  1481.   }
  1482.   return result;
  1483. }
  1484.  
  1485. //----- (0804BAB7) --------------------------------------------------------
  1486. signed int __cdecl sub_804BAB7(const char *filename, int a2, int fd)
  1487. {
  1488.   char v4; // [sp+39h] [bp-2FFh]@1
  1489.   char v5; // [sp+5Ah] [bp-2DEh]@1
  1490.   char v6; // [sp+6Eh] [bp-2CAh]@1
  1491.   char v7; // [sp+A0h] [bp-298h]@1
  1492.   char v8; // [sp+B4h] [bp-284h]@3
  1493.   signed int v9; // [sp+30Ch] [bp-2Ch]@1
  1494.   int v10; // [sp+310h] [bp-28h]@1
  1495.   int v11; // [sp+314h] [bp-24h]@1
  1496.   int v12; // [sp+318h] [bp-20h]@6
  1497.   int v13; // [sp+31Ch] [bp-1Ch]@16
  1498.   int v14; // [sp+320h] [bp-18h]@18
  1499.   int v15; // [sp+324h] [bp-14h]@20
  1500.   int v16; // [sp+328h] [bp-10h]@22
  1501.   FILE *v17; // [sp+32Ch] [bp-Ch]@1
  1502.  
  1503.   v9 = 0;
  1504.   v10 = 0;
  1505.   v11 = 0;
  1506.   bzero(&v7, 0x14u);
  1507.   bzero(&v6, 0x32u);
  1508.   bzero(&v5, 0x14u);
  1509.   bzero(&v4, 0x21u);
  1510.   v17 = fopen(filename, "rb");
  1511.   if ( v17 )
  1512.   {
  1513.     while ( 1 )
  1514.     {
  1515.       v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1516.       if ( v10 == -1 )
  1517.         break;
  1518.       *(&v8 + v10) = 0;
  1519.       if ( strcmp(&v8, "[user db]") )
  1520.       {
  1521.         if ( strcmp(&v8, "[user]") )
  1522.         {
  1523.           v9 = 1;
  1524.           break;
  1525.         }
  1526.         ++v11;
  1527.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1528.         if ( v10 != -1 )
  1529.         {
  1530.           *(&v8 + v10) = 0;
  1531.           v12 = atoi(&v8);
  1532.         }
  1533.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1534.         if ( v10 != -1 )
  1535.         {
  1536.           *(&v8 + v10) = 0;
  1537.           strncpy(&v7, &v8, 0x14u);
  1538.         }
  1539.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1540.         if ( v10 != -1 )
  1541.         {
  1542.           *(&v8 + v10) = 0;
  1543.           strncpy(&v6, &v8, 0x32u);
  1544.         }
  1545.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1546.         if ( v10 != -1 )
  1547.         {
  1548.           *(&v8 + v10) = 0;
  1549.           strncpy(&v5, &v8, 0x14u);
  1550.         }
  1551.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1552.         if ( v10 != -1 )
  1553.         {
  1554.           *(&v8 + v10) = 0;
  1555.           strncpy(&v4, &v8, 0x21u);
  1556.         }
  1557.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1558.         if ( v10 != -1 )
  1559.         {
  1560.           *(&v8 + v10) = 0;
  1561.           v13 = atoi(&v8);
  1562.         }
  1563.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1564.         if ( v10 != -1 )
  1565.         {
  1566.           *(&v8 + v10) = 0;
  1567.           v14 = atoi(&v8);
  1568.         }
  1569.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1570.         if ( v10 != -1 )
  1571.         {
  1572.           *(&v8 + v10) = 0;
  1573.           v15 = atoi(&v8);
  1574.         }
  1575.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  1576.         if ( v10 != -1 )
  1577.         {
  1578.           *(&v8 + v10) = 0;
  1579.           v16 = atoi(&v8);
  1580.         }
  1581.         if ( sub_804B9E6(fd, a2, &v7, &v6, &v5, &v4, v12, v13, v16, v14, v15) )
  1582.         {
  1583.           v9 = 1;
  1584.           sub_8048F10(fd, "insert failed.\n");
  1585.           break;
  1586.         }
  1587.       }
  1588.     }
  1589.     fclose(v17);
  1590.   }
  1591.   else
  1592.   {
  1593.     sub_8048F10(fd, "attempted %s.\n", filename);
  1594.     v9 = 1;
  1595.   }
  1596.   return v9;
  1597. }
  1598.  
  1599. //----- (0804C067) --------------------------------------------------------
  1600. void __cdecl sub_804C067(int fd)
  1601. {
  1602.   sub_8048E75(fd, "cya\n", 0);
  1603.   close(fd);
  1604.   exit(0);
  1605. }
  1606.  
  1607. //----- (0804C09F) --------------------------------------------------------
  1608. int __cdecl sub_804C09F(int a1)
  1609. {
  1610.   int v1; // edx@1
  1611.   int result; // eax@11
  1612.   signed int v3; // [sp+8h] [bp-10h]@1
  1613.   int v4; // [sp+Ch] [bp-Ch]@6
  1614.  
  1615.   v1 = rand() % 5;
  1616.   v3 = v1 - 2;
  1617.   if ( v1 != 2 )
  1618.   {
  1619.     *(_DWORD *)dword_804E40C += v3;
  1620.     *(_DWORD *)dword_804E410 += v3 / 2;
  1621.     if ( !*(_DWORD *)dword_804E410 )
  1622.       *(_DWORD *)dword_804E410 = 1;
  1623.     if ( !*(_DWORD *)dword_804E410 )
  1624.       *(_DWORD *)dword_804E410 = 1;
  1625.   }
  1626.   v4 = a1;
  1627.   while ( 1 )
  1628.   {
  1629.     result = *(_DWORD *)(v4 + 76);
  1630.     if ( !result )
  1631.       break;
  1632.     v4 = *(_DWORD *)(v4 + 76);
  1633.     if ( *(_DWORD *)(v4 + 60) )
  1634.     {
  1635.       if ( v3 == 1 )
  1636.         *(_DWORD *)(v4 + 60) += *(_DWORD *)(v4 + 60) >> 2;
  1637.       *(_DWORD *)(v4 + 68) = *(_DWORD *)(v4 + 60) + *(_DWORD *)(v4 + 68) - (*(_DWORD *)(v4 + 60) >> 3);
  1638.     }
  1639.   }
  1640.   return result;
  1641. }
  1642.  
  1643. //----- (0804C18B) --------------------------------------------------------
  1644. void __cdecl sub_804C18B(int fd)
  1645. {
  1646.   unsigned int v1; // eax@1
  1647.   int nptr; // [sp+26Ch] [bp-26Ch]@7
  1648.   char v3[4]; // [sp+4C4h] [bp-14h]@1
  1649.   void *s; // [sp+4C8h] [bp-10h]@1
  1650.   FILE *stream; // [sp+4CCh] [bp-Ch]@40
  1651.  
  1652.   *(_DWORD *)v3 = 0;
  1653.   v1 = time(0);
  1654.   srand(v1);
  1655.   s = malloc(0x9Cu);
  1656.   if ( !s )
  1657.   {
  1658.     sub_8048E75(fd, "can't allocate user_list, quitting\n", 0);
  1659.     sub_804C067(fd);
  1660.   }
  1661.   bzero(s, 0x9Cu);
  1662.   *((_DWORD *)s + 19) = 0;
  1663.   *((_DWORD *)s + 20) = 0;
  1664.   sub_804A988();
  1665.   if ( sub_804BAB7("/home/fcfl/user.db", (int)s, fd) )
  1666.   {
  1667.     sub_8048E75(fd, "can't read user db, quitting\n", 0);
  1668.     sub_804C067(fd);
  1669.   }
  1670.   while ( 1 )
  1671.   {
  1672.     sub_804C09F((int)s);
  1673.     sub_804B7E0(fd);
  1674.     *(_DWORD *)v3 = sub_8048E0A(fd, (int)&nptr, 0x257u, 10);
  1675.     *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  1676.     sub_8048F10(fd, "%d: %s\n", *(_DWORD *)v3, &nptr);
  1677.     if ( *(_DWORD *)v3 == 1 )
  1678.     {
  1679.       if ( (_BYTE)nptr != aC[0] || dword_804E424 )
  1680.       {
  1681.         if ( (_BYTE)nptr != asc_804D115[0] || dword_804E424 )
  1682.         {
  1683.           if ( (_BYTE)nptr == aS_1[0] && dword_804E424 )
  1684.           {
  1685.             sub_804ACFC(fd, (const char *)&nptr, (int)s);
  1686.           }
  1687.           else
  1688.           {
  1689.             if ( (_BYTE)nptr == aI[0] && dword_804E424 )
  1690.             {
  1691.               sub_804AE76(fd, (const char *)&nptr, (int)s);
  1692.             }
  1693.             else
  1694.             {
  1695.               if ( (_BYTE)nptr == aB[0] && dword_804E424 )
  1696.               {
  1697.                 sub_804AFC6(fd, (const char *)&nptr, (int)s);
  1698.               }
  1699.               else
  1700.               {
  1701.                 if ( (_BYTE)nptr == aU[0] && dword_804E424 )
  1702.                 {
  1703.                   sub_804B148(fd, (const char *)&nptr, (int)s);
  1704.                 }
  1705.                 else
  1706.                 {
  1707.                   if ( (_BYTE)nptr == aP[0] && dword_804E424 )
  1708.                   {
  1709.                     sub_804A855(fd, (int)s);
  1710.                   }
  1711.                   else
  1712.                   {
  1713.                     if ( (_BYTE)nptr == asc_804D121[0] && dword_804E424 )
  1714.                     {
  1715.                       sub_804A988();
  1716.                     }
  1717.                     else
  1718.                     {
  1719.                       if ( (_BYTE)nptr == aP_0[0] && dword_804E424 && dword_804E420 )
  1720.                       {
  1721.                         sub_804A820(fd, (int)s);
  1722.                       }
  1723.                       else
  1724.                       {
  1725.                         if ( (_BYTE)nptr == a6[0] && dword_804E424 && dword_804E420 )
  1726.                         {
  1727.                           stream = fopen("/home/fcfl/key", "rb");
  1728.                           *(_DWORD *)v3 = sub_804B90A(stream, (int)&nptr, 0x257u, 10);
  1729.                           if ( *(_DWORD *)v3 != -1 )
  1730.                           {
  1731.                             *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  1732.                             sub_8048E75(fd, (const char *)&nptr, 1);
  1733.                           }
  1734.                         }
  1735.                         else
  1736.                         {
  1737.                           if ( (_BYTE)nptr == aQ[0] )
  1738.                             sub_804C067(fd);
  1739.                           sub_8048E75(fd, "that's not a valid option", 0);
  1740.                         }
  1741.                       }
  1742.                     }
  1743.                   }
  1744.                 }
  1745.               }
  1746.             }
  1747.           }
  1748.         }
  1749.         else
  1750.         {
  1751.           sub_804B6F5(fd, (int)&nptr, (char *)s);
  1752.         }
  1753.       }
  1754.       else
  1755.       {
  1756.         sub_804AA9F(fd, (const char *)&nptr, (int)s);
  1757.       }
  1758.     }
  1759.     else
  1760.     {
  1761.       *(_DWORD *)v3 = 0;
  1762.       sub_8048E75(fd, "that's not a valid option", 0);
  1763.     }
  1764.   }
  1765. }
  1766. // 804E420: using guessed type int dword_804E420;
  1767. // 804E424: using guessed type int dword_804E424;
  1768.  
  1769. //----- (0804C5F0) --------------------------------------------------------
  1770. void __cdecl sub_804C5F0()
  1771. {
  1772.   ;
  1773. }
  1774.  
  1775. //----- (0804C600) --------------------------------------------------------
  1776. int *__cdecl sub_804C600()
  1777. {
  1778.   init_proc();
  1779.   return &dword_804E1D8;
  1780. }
  1781. // 804E1D8: using guessed type int dword_804E1D8;
  1782.  
  1783. //----- (0804C65A) --------------------------------------------------------
  1784. void __cdecl sub_804C65A()
  1785. {
  1786.   ;
  1787. }
  1788.  
  1789. //----- (0804C660) --------------------------------------------------------
  1790. void (*__cdecl sub_804C660())(void)
  1791. {
  1792.   void (*result)(void); // eax@1
  1793.   int *v1; // ebx@2
  1794.  
  1795.   result = (void (*)(void))dword_804E1D8;
  1796.   if ( dword_804E1D8 != -1 )
  1797.   {
  1798.     v1 = &dword_804E1D8;
  1799.     do
  1800.     {
  1801.       --v1;
  1802.       result();
  1803.       result = (void (*)(void))*v1;
  1804.     }
  1805.     while ( *v1 != -1 );
  1806.   }
  1807.   return result;
  1808. }
  1809. // 804E1D8: using guessed type int dword_804E1D8;
  1810.  
  1811. //----- (0804C68C) --------------------------------------------------------
  1812. void __cdecl term_proc()
  1813. {
  1814.   sub_8048CB0();
  1815. }
  1816.  
  1817. #error "There were 1 decompilation failure(s) on 49 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement