IDA PRO的Hex-Ray给了我这些变量。

  void *v7; // esp@1
  const char *v8; // ebx@1
  PLAYER *v9; // ebp@1
  int v10; // edi@5
  PLAYER *v11; // edx@6
  int v12; // ecx@9
  int v13; // esi@17
  int v14; // eax@33
  const char v15; // al@36
  const char *v16; // ebx@45
  PLAYER *v17; // eax@50
  int v18; // esi@51
  const CHAR *v19; // ecx@54
  int v20; // edx@56
  unsigned int v21; // eax@61
  signed int v22; // ebx@61
  ARENA *v23; // eax@63
  ARENA *v24; // edx@63
  int v25; // ecx@63
  int v26; // esi@64
  signed int v27; // edi@65
  int v28; // eax@66
  ARENA *v29; // ecx@66
  int v30; // esi@69
  int v31; // edi@71
  int v32; // esi@71
  signed int v33; // ecx@74
  int v34; // eax@75
  const CHAR *v35; // edi@78
  signed int v36; // ecx@78
  signed int v37; // ecx@81
  const void *v38; // esi@81
  const CHAR *v39; // edi@81
  unsigned int v40; // edx@81
  signed int v41; // ecx@81
  const char v42; // al@89
  const char *v43; // ebx@89
  const char v44; // al@90
  const char v45; // al@96
  const char *v46; // ebx@96
  const char v47; // al@97
  const char v48; // al@103
  const char *v49; // ebx@103
  const char v50; // al@104
  int v51; // ebx@107
  const char *v52; // edx@108
  unsigned int v53; // kr48_4@108
  unsigned int v54; // kr50_4@108
  const char *v55; // edi@108
  unsigned int v56; // kr58_4@110
  const char *v57; // esi@110
  const char *v58; // edi@110
  int v59; // ecx@110
  bool v60; // zf@110
  int v61; // edi@121
  int i; // esi@121
  const char *v63; // eax@122
  signed int v64; // esi@126
  const char *v65; // ebx@134
  PLAYER *v66; // eax@140
  int v67; // edx@141
  int v68; // ecx@141
  PLAYER *v69; // eax@146
  int v70; // edx@147
  int v71; // ecx@147
  const CHAR v72; // cl@153
  int v73; // eax@153
  const CHAR *j; // edx@153
  char v75; // cl@156
  const CHAR v76; // cl@157
  int v77; // eax@157
  const CHAR *k; // edx@157
  char v79; // cl@160
  const CHAR v80; // cl@161
  int v81; // eax@161
  const CHAR *l; // edx@161
  char *v83; // eax@163
  const CHAR v84; // al@171
  int v85; // esi@171
  const CHAR *m; // ecx@171
  char v87; // al@174
  const CHAR v88; // al@175
  int v89; // esi@175
  const CHAR *n; // ecx@175
  const CHAR v91; // al@180
  int v92; // esi@180
  const CHAR *ii; // ecx@180
  const char *v94; // ebx@189
  const char v95; // al@200
  const char *v96; // ebx@200
  const char v97; // al@201
  ARENA *v98; // eax@204
  unsigned int v99; // kr68_4@208
  int v100; // edi@208
  PLAYER **v101; // ebx@209
  int v102; // ebx@215
  PLAYER *v103; // ecx@217
  __int64 v104; // qax@218
  int v105; // ecx@218
  __int64 v106; // qax@218
  int v107; // ST24_4@218
  __int64 v108; // qax@218
  PLAYER *v109; // esi@223
  int v110; // ST24_4@224
  int v111; // ST1C_4@224
  int v112; // ST18_4@224
  char *v113; // eax@224
  ARENA *v114; // eax@226
  signed int v115; // ecx@228
  int v116; // eax@228
  ENCRYPTION *v117; // ecx@230
  int v118; // edi@230
  int v119; // edx@233
  int v120; // edi@233
  unsigned __int64 v121; // st7@233
  DWORD v122; // eax@235
  int v123; // ecx@235
  DWORD v124; // eax@237
  unsigned __int64 v125; // st7@237
  int v126; // ecx@237
  int v127; // edx@239
  DWORD v128; // edi@239
  time_t v129; // ST20_8@242
  signed __int64 v130; // qax@242
  signed int v131; // edi@242
  __int64 v132; // qax@243
  __int64 v133; // ST20_8@243
  signed int v134; // ecx@243
  __int64 v135; // ST18_8@243
  int v136; // ecx@247
  PLAYER *v137; // eax@268
  int v138; // ecx@269
  const char v139; // al@276
  const char *v140; // edi@276
  const char v141; // al@277
  const char v142; // al@279
  __int16 v143; // ax@284
  PLAYER *v144; // edi@289
  ARENA *v145; // eax@292
  int v146; // ecx@292
  signed int v147; // edx@293
  PLAYER *v148; // eax@294
  ARENA *v149; // eax@296
  int v150; // ecx@296
  signed int v151; // edx@297
  PLAYER *v152; // eax@298
  PLAYER *v153; // eax@308
  char *v154; // eax@309
  const char v155; // al@312
  const char *v156; // edi@312
  const char v157; // al@313
  ARENA *v158; // eax@318
  unsigned int v159; // kr88_4@320
  const char v160; // al@323
  const char *v161; // edi@323
  const char v162; // al@324
  const char v163; // al@330
  const char *v164; // edi@330
  const char v165; // al@331
  int v166; // eax@336
  __int16 v167; // ax@342
  PLAYER *v168; // esi@346
  int v169; // edx@350
  const char v170; // al@384
  const char *v171; // edi@384
  const char v172; // al@385
  PLAYER *v173; // esi@392
  int v174; // edx@397
  PLAYER *v175; // esi@403
  int v176; // edi@408
  int v177; // eax@409
  int v178; // esi@410
  int v179; // eax@410
  ARENA *v180; // ecx@413
  int v181; // edi@415
  ARENA **v182; // esi@416
  PLAYER *v183; // ecx@423
  int v184; // edi@427
  PLAYER **v185; // esi@428
  PLAYER *v186; // ecx@437
  ARENA *v187; // ecx@443
  FILE *v188; // eax@449
  const char *v189; // edi@449
  int v190; // ebx@451
  int v191; // eax@451
  FILE *v192; // eax@454
  ARENA *v193; // eax@455
  int v194; // esi@456
  signed int v195; // edi@457
  PLAYER *v196; // eax@458
  const char *v197; // esi@461
  int v198; // eax@461
  signed int v199; // edi@463
  int v200; // edx@471
  time_t v201; // ST20_8@478
  signed __int64 v202; // qax@478
  signed int v203; // esi@478
  signed int v204; // ecx@481
  int v205; // edi@481
  const char *v206; // esi@481
  bool v207; // zf@481
  const char *v208; // ebx@485
  signed int v209; // ebx@490
  char *v210; // eax@491
  int v211; // ecx@491
  int v212; // edi@494
  signed int v213; // ecx@496
  signed int v214; // ecx@499
  const void *v215; // esi@499
  const CHAR *v216; // edi@499
  unsigned int v217; // edx@499
  signed int v218; // ecx@499
  const CHAR *v219; // edi@502
  signed int v220; // ecx@502
  signed int v221; // ecx@505
  const void *v222; // esi@505
  const CHAR *v223; // edi@505
  unsigned int v224; // edx@505
  signed int v225; // ecx@505
  int v226; // ebx@516
  signed int v227; // esi@516
  ARENA *v228; // edx@520
  int v229; // eax@520
  int v230; // esi@520
  int v231; // edi@520
  int v232; // edx@520
  int v233; // ecx@524
  ARENA *v234; // eax@527
  int v235; // edx@527
  int v236; // ecx@527
  __int16 v237; // ax@527
  int v238; // eax@527
  int v239; // ecx@527
  int v240; // eax@527
  int v241; // eax@540
  ARENA *v242; // ecx@543
  char *v243; // eax@543
  char *v244; // edx@544
  char *v245; // ebx@546
  DWORD v246; // eax@546
  ARENA *v247; // esi@547
  char *v248; // esi@550
  signed int v249; // ebp@554
  int v250; // eax@557
  int v251; // eax@562
  signed int v252; // ecx@570
  int v253; // edi@570
  const char *v254; // esi@570
  bool v255; // zf@570
  int v256; // eax@575
  const char *v257; // edx@578
  ARENA *v258; // ecx@585
  signed int v259; // ebx@586
  PLAYER *v260; // ecx@587
  signed int v261; // esi@587
  __int64 v262; // qax@590
  __int64 v263; // qax@591
  int v264; // edi@602
  signed int v265; // ecx@604
  signed int v266; // ecx@607
  const void *v267; // esi@607
  const CHAR *v268; // edi@607
  unsigned int v269; // edx@607
  signed int v270; // ecx@607
  const CHAR *v271; // edi@610
  signed int v272; // ecx@610
  signed int v273; // ecx@613
  const void *v274; // esi@613
  const CHAR *v275; // edi@613
  unsigned int v276; // edx@613
  signed int v277; // ecx@613
  int v278; // edx@617
  int v279; // ecx@621
  int v280; // edx@638
  char *v281; // ebx@638
  unsigned int v282; // ebx@646
  PLAYER *v283; // eax@646
  signed int v284; // ecx@654
  signed int v285; // ecx@658
  signed int v286; // ecx@662
  signed int v287; // ecx@671
  int v288; // edi@671
  const char *v289; // esi@671
  bool v290; // zf@671
  signed int v291; // ecx@675
  int v292; // edi@675
  const char *v293; // esi@675
  bool v294; // zf@675
  signed int v295; // ecx@682
  int v296; // eax@683
  const char v297; // al@688
  const char *v298; // edi@688
  const CHAR *jj; // ecx@688
  const char v300; // al@691
  const CHAR v301; // al@692
  int v302; // edi@692
  const CHAR *kk; // ecx@692
  const char v304; // al@696
  int *v305; // edi@704
  int *v306; // esi@704
  char v307; // al@707
  int v308; // ecx@708
  int v309; // edi@708
  int v310; // esi@708
  const char *v311; // eax@709
  ARENA *v312; // edi@711
  ARENA *v313; // ecx@718
  int v314; // eax@718
  int v315; // eax@723
  __int64 v316; // qax@727
  __int64 v317; // qax@728
  __int64 v318; // qax@729
  const char *v319; // ebx@730
  int v320; // edi@737
  char *v321; // ST1C_4@737
  int v322; // esi@737
  ARENA *v323; // eax@738
  ARENA *v324; // eax@743
  DWORD v325; // eax@748
  int v326; // edx@749
  PLAYER *v327; // esi@749
  bool v328; // sf@749
  ARENA **v329; // edi@750
  ARENA *v330; // eax@751
  int v331; // ebx@751
  signed int v332; // esi@752
  unsigned int v333; // krD8_4@774
  ARENA **v334; // esi@775
  int v335; // ebp@776
  signed int v336; // edi@777
  ARENA *v337; // edx@784
  int v338; // esi@785
  int v339; // ecx@785
  const char *v340; // ecx@797
  const char v341; // al@799
  const CHAR *ll; // edx@799
  const char v343; // al@803
  const char v344; // al@804
  const char *v345; // ecx@804
  int v346; // eax@819
  int v347; // eax@833
  unsigned int v348; // krE8_4@836
  int v349; // edi@836
  PLAYER **v350; // ebp@837
  char *v351; // [sp+4h] [bp-1608Ch]@668
  const char *v352; // [sp+8h] [bp-16088h]@668
  char *v353; // [sp+Ch] [bp-16084h]@52
  char *v354; // [sp+Ch] [bp-16084h]@351
  char *v355; // [sp+Ch] [bp-16084h]@598
  char *v356; // [sp+Ch] [bp-16084h]@644
  int v357; // [sp+Ch] [bp-16084h]@668
  const char *v358; // [sp+10h] [bp-16080h]@52
  const char *v359; // [sp+10h] [bp-16080h]@57
  const char *v360; // [sp+10h] [bp-16080h]@218
  const char *v361; // [sp+10h] [bp-16080h]@351
  int v362; // [sp+10h] [bp-16080h]@525
  const char *v363; // [sp+10h] [bp-16080h]@598
  const char *v364; // [sp+10h] [bp-16080h]@644
  int v365; // [sp+10h] [bp-16080h]@668
  int v366; // [sp+14h] [bp-1607Ch]@52
  char v367; // [sp+14h] [bp-1607Ch]@54
  char v368; // [sp+14h] [bp-1607Ch]@218
  int v369; // [sp+14h] [bp-1607Ch]@351
  int v370; // [sp+14h] [bp-1607Ch]@525
  int v371; // [sp+14h] [bp-1607Ch]@598
  char *v372; // [sp+14h] [bp-1607Ch]@644
  int v373; // [sp+14h] [bp-1607Ch]@668
  time_t v374; // [sp+18h] [bp-16078h]@1
  ARENA *a5[2]; // [sp+28h] [bp-16068h]@63
  int v376; // [sp+30h] [bp-16060h]@69
  int v377; // [sp+34h] [bp-1605Ch]@61
  DWORD ExitCode; // [sp+38h] [bp-16058h]@233
  char v379; // [sp+3Fh] [bp-16051h]@420
  size_t Size; // [sp+40h] [bp-16050h]@69
  int v381; // [sp+44h] [bp-1604Ch]@233
  int v382; // [sp+48h] [bp-16048h]@69
  int v383; // [sp+4Ch] [bp-16044h]@69
  char v384; // [sp+50h] [bp-16040h]@527
  __int16 v385; // [sp+51h] [bp-1603Fh]@527
  int v386; // [sp+53h] [bp-1603Dh]@527
  int v387; // [sp+57h] [bp-16039h]@527
  __int16 v388; // [sp+5Bh] [bp-16035h]@527
  __int16 v389; // [sp+5Dh] [bp-16033h]@527
  int v390; // [sp+60h] [bp-16030h]@233
  const CHAR KeyName; // [sp+64h] [bp-1602Ch]@157
  const CHAR CommandLine; // [sp+84h] [bp-1600Ch]@52
  char v393; // [sp+85h] [bp-1600Bh]@773
  const CHAR Dest; // [sp+184h] [bp-15F0Ch]@69
  __int16 v395; // [sp+185h] [bp-15F0Bh]@342
  char v396; // [sp+187h] [bp-15F09h]@342
  const CHAR Str1; // [sp+284h] [bp-15E0Ch]@153
  const CHAR AppName; // [sp+2C4h] [bp-15DCCh]@76
  int buf; // [sp+304h] [bp-15D8Ch]@45
  char v400; // [sp+309h] [bp-15D87h]@208
  char v401; // [sp+404h] [bp-15C8Ch]@255
  char v402; // [sp+405h] [bp-15C8Bh]@255
  char v403; // [sp+414h] [bp-15C7Ch]@255
  CHAR StartupInfo[4]; // [sp+504h] [bp-15B8Ch]@163
  int v405; // [sp+510h] [bp-15B80h]@309
  char v406; // [sp+604h] [bp-15A8Ch]@741
  char v407; // [sp+605h] [bp-15A8Bh]@741
  char v408; // [sp+606h] [bp-15A8Ah]@741
  __int16 v409; // [sp+607h] [bp-15A89h]@748
  char v410; // [sp+609h] [bp-15A87h]@765
  char v411; // [sp+804h] [bp-1588Ch]@638
  char v412; // [sp+805h] [bp-1588Bh]@638
  char v413; // [sp+2804h] [bp-1388Ch]@543
  char Str; // [sp+2805h] [bp-1388Bh]@544
  char v415; // [sp+2815h] [bp-1387Bh]@546
  int v416; // [sp+16084h] [bp-Ch]@1
  int (*v417)(); // [sp+16088h] [bp-8h]@1
  int v418; // [sp+1608Ch] [bp-4h]@1
  const char *Buf1b; // [sp+160A0h] [bp+10h]@485
  const char *Buf1a; // [sp+160A0h] [bp+10h]@489


熟练的反向器在电子邮件中告诉我如何处理此问题,我不知道他是否想要我说他/她的名字,所以我什么也不会说。

但是他们说从[sp+####h]开始对数组或结构进行修复,并从中进行计算。所以首先要开始修复的部分是因为它始于[sp+#h]

char *v351; // [sp+4h] [bp-1608Ch]@668 


现在您要转到

  char *v372; // [sp+14h] [bp-1607Ch]@644
  int v373; // [sp+14h] [bp-1607Ch]@668
  time_t v374; // [sp+18h] [bp-16078h]@1
  ARENA *a5[2]; // [sp+28h] [bp-16068h]@63
  int v376; // [sp+30h] [bp-16060h]@69


所以

  char *v372; // [sp+14h]                                      [0]
  int v373; // [sp+14h]                     14-14 = 0 goes up  [4]
  time_t v374; // [sp+18h] [bp-16078h]@1    18-14 = 4 goes up  [16]
  ARENA *a5[2]; // [sp+28h] [bp-16068h]@63  28-18 = 16 goes up [8]
  int v376; // [sp+30h] [bp-16060h]@69      30-28 = 8 goes up  [4]
  int v377; // [sp+34h] [bp-1605Ch]@61       34-30 = 4 goes up  [ignored]


所以0表示char?但这是一个指向char(4个字节)的指针吗?可能不应该触碰那些字符。
后面的4看起来应该是int。可能是4个字节或8个字节。

我检查了一下,并将time_t定义为是24个字节?为什么会这样呢?是的,当我单击16时我得到了2 x 8 bytes

所以这是我感到困惑的地方,我认为它实际上是8个字节,我要做的就是将其设置为var_16080

ARENA * a5 [2];看起来正确4个字节的2个指针。 = 8个字节,之后的int看起来正确。

如果我必须手动完成所有操作,有人可以告诉我在某些困难情况下该怎么做。.

但是如果有一种自动化的方法,我也将很感激,如果有人可以告诉我一个插件或脚本来做到这一点。对吗?

-00016080 var_16080       dd 6 dup(?)             ; offset


稍​​微低一点,您会看到此

  int v369; // [sp+14h] [bp-1607Ch]@351
  int v370; // [sp+14h] [bp-1607Ch]@525
  int v371; // [sp+14h] [bp-1607Ch]@598
  char *v372; // [sp+14h] [bp-1607Ch]@644
  int v373; // [sp+14h] [bp-1607Ch]@668
  char v374[16]; // [sp+18h] [bp-16078h]@1
  ARENA *a5[2]; // [sp+28h] [bp-16068h]@63
  int v376; // [sp+30h] [bp-16060h]@69
  int v377; // [sp+34h] [bp-1605Ch]@61
  char ExitCode[7]; // [sp+38h] [bp-16058h]@233
  char v379; // [sp+3Fh] [bp-16051h]@420
  size_t Size; // [sp+40h] [bp-16050h]@69
  int v381; // [sp+44h] [bp-1604Ch]@233
  int v382; // [sp+48h] [bp-16048h]@69


为什么一个3个字节一个time_t还是一个time_t v374[2]吗?

我将其翻译为毕竟是__int16。也许是char[3],然后是__int16,但您不能在Hex-Rays afaik中做到。

  __int16 v385; // [sp+51h] [bp-1603Fh]@527                   2
  int v386; // [sp+53h] [bp-1603Dh]@527               53-51 = 2 up [4]
  int v387; // [sp+57h] [bp-16039h]@527               57-53 = 4 up [4]
  __int16 v388; // [sp+5Bh] [bp-16035h]@527           5B-57 = 4 up [2]
  __int16 v389; // [sp+5Dh] [bp-16033h]@527           5D-5B = 2 up [3] ???
  int v390; // [sp+60h] [bp-16030h]@233               60-5D = 3 up


好吧,这是非常不可预测的,我认为在某些情况下我不能过多依赖__int16

我设法将其归结为这一点,但是它有问题遍地都是

修剪掉了没有变化的顶部内容

  int v386; // [sp+53h] [bp-1603Dh]@527
  int v387; // [sp+57h] [bp-16039h]@527
  __int16 v388; // [sp+5Bh] [bp-16035h]@527
  char v389[3]; // [sp+5Dh] [bp-16033h]@527
  int v390; // [sp+60h] [bp-16030h]@233


似乎所有的数组/缓冲区都只在所有变量的底部全部都是缓冲区(也许只是该程序使用的编译器/优化器的类型)。

我想知道它是否可能将所有缓冲区重用为一个大缓冲区?

评论

您正在使用哪个DA版本?

我使用的是IDA 6.1版本。

#1 楼

我不确定在没有看到所有功能的情况下是否可以回答这个问题,因为局部变量类型恢复的正确性只能通过了解使用变量的上下文来完成。

但是,我建议在Hex-Rays中使用以下算法处理局部变量



正如您的朋友所说,什么也不做对于在堆栈上分配的所有其他变量,请执行以下操作:
查看此变量的使用位置。
如果您看到以下模式之一,请采取相应措施,但在每次更改后按F5键并查看结果。请记住,可以通过按Y并在其上输入以前的类型来还原每种类型。尝试通过右键单击变量并选择相应的菜单项来创建一个。将此变量用作函数参数或与已知类型的其他连接可以为您提供有关变量类型的提示。
如果看不到常量偏移量(例如另一个变量中的偏移量),则可以为数组。在变量上按星号(*),IDA会建议数组的长度,它相对好。在属于数组成员的结构中,反之亦然:)在这种情况下,尝试找到最小的结构/数组并从其开始。

根本上,有以下几种可能性会影响Hex-Rays中的函数堆栈:


更改变量类型(在变量上按y,输入type )
使变量成为数组(按*)
创建新结构
基于变量类型(右键单击变量,对应
菜单项)
取消定义变量:双击堆栈变量
将打开堆栈函数堆栈窗口。在变量上按u
将其取消定义。
合并变量:如果看到两个不同的
变量实际上是相同的,则可以按=并告诉反编译器它们实际上是相同的。 AFAIR可以在IDA 6.5
和IDA6.5

中运行。不要忘记在每次更改后按F5刷新反编译的代码视图以查看结果。

就是这样。

顺便说一句,您可能会遗漏一点:
IDA和HexRays可以在堆栈的同一位置生成多个变量,所以,v370,v371,v372,v373在堆栈中使用相同的位置,但是从反编译代码的角度来看它们是不同的变量。

评论


是的,我淘汰了一堆v369,v370,v371,v372,v373,因为它只是一个阵列。我发现[sp + ### h]中的最后一个间隙正好是80000字节,并将其放入数组中。几乎可以,除了a5 []似乎是指向结构的指针之外,但在其他区域中将其设置为强制转换为指针的值1是不可能的。不要以为我每次更改变量时都需要按F5键,它会自动重新对其进行反编译。还猜测这些局部变量会导致我在开始覆盖rdata时在某一点重做该项目。这里是完整的代码:pastebin.com/4HdT0hdk

– SSpoke
2014年4月22日在5:47

这也是我的项目,mediafire.com/?qnqb00q4yk4kq6v也许您可以在6.5下运行它并给我C文件哈哈,所以我可以将其用作参考表。我开始不依靠IDA PRO在记事本中修复C文件,这会改变我喜欢的地方的内容,但是有时在一个区域中对它进行修改后,有时它只是在一个区域中做不到,就像将一个螺丝钉拧紧了一样。我在此函数ChatProcesser()中遇到的几乎所有其他问题都在PlayerHandleGamePacket()中。现在错误414850:找不到edi的有效保存-还原对

– SSpoke
2014年4月22日5:53