IDA PRO 修复堆栈变量/局部变量十六进制射线与数组和正确的类型/结构任何脚本/插件?

逆向工程 艾达 idapro插件 局部变量 堆栈变量
2021-06-30 02:02:51

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(4 个字节)的指针?,可能不应该触及那些
The 4after 是 int ,这似乎是正确的。
16之后的样子2 x 8 bytes
由于 time_t 可能是 4 个字节或 8 个字节。

我查了一下,time_t 被定义为

-00016080 var_16080       dd 6 dup(?)             ; offset

所以它认为它是 4 字节 x 6 也就是 24 字节?为什么会这样认为?是的,var_16080当我点击time_t

所以这就是我感到困惑的地方我认为它真的是 8 个字节,我所要做的就是让它 time_t v374[2]

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

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

但是,如果有一种方法可以自动执行此操作,如果有人可以告诉我插件或脚本来执行此操作,我也将不胜感激。

这是我如何理解的,对吗?

  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

低一点你看到这个

  __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

当它是 a__int16还是 a时,为什么是 3 个字节char[3]

我把它翻译成

  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

现在它在代码中做了类似的事情,所以它一定是__int16毕竟。也许它是一个__int16跟在一个char之后,但你不能在 Hex-Rays afaik 中做到这一点。

                *(_WORD *)v389 = v236;

好吧,这是非常不可预测的,我认为[so+###h]在某些情况下我不能过分依赖's。

我设法把它归结为这个,但它到处都有问题

修剪掉没有改变的最重要的东西

  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
  char *v359; // [sp+10h] [bp-16080h]@57
  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
  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
  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
  char v389[3]; // [sp+5Dh] [bp-16033h]@527
  int v390; // [sp+60h] [bp-16030h]@233
  char array1[32]; // [sp+64h] [bp-1602Ch]@157
  char array2[256]; // [sp+84h] [bp-1600Ch]@52
  char Dest[256]; // [sp+184h] [bp-15F0Ch]@69
  char Str1[64]; // [sp+284h] [bp-15E0Ch]@153
  char AppName[64]; // [sp+2C4h] [bp-15DCCh]@76
  char buf[512]; // [sp+304h] [bp-15D8Ch]@45
  char StartupInfo[256]; // [sp+504h] [bp-15B8Ch]@163
  char v398[512]; // [sp+604h] [bp-15A8Ch]@741
  char v399[8192]; // [sp+804h] [bp-1588Ch]@638
  char v400[80000]; // [sp+2804h] [bp-1388Ch]@543
  int v401; // [sp+16084h] [bp-Ch]@1
  int (*v402)(); // [sp+16088h] [bp-8h]@1
  int v403; // [sp+1608Ch] [bp-4h]@1
  const char *Buf1b; // [sp+160A0h] [bp+10h]@485
  const char *Buf1a; // [sp+160A0h] [bp+10h]@489

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

我想知道如果它可能将所有缓冲区重用为一个大缓冲区会怎样?

1个回答

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

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

  1. 正如你的朋友所说,不要对寄存器上分配的变量做任何事情。

  2. 对于堆栈上分配的所有其他变量,请执行以下操作:

  3. 看看这个变量在哪里使用。

  4. 如果您看到以下模式之一,请采取相应措施,但在每次更改后按 F5 并查看结果。请记住,您可以通过按 Y 并在其上输入以前的类型来还原每种类型。

  5. 如果您看到相对于该变量使用了一些不同的偏移量,则它可能是一个结构体。尝试通过右键单击变量并选择相应的菜单项来创建一个。将此变量用作函数参数或与已知类型的其他连接可能会给您有关变量类型的提示。

  6. 如果您看到不是常量偏移量(例如另一个变量中的偏移量),它可以是数组。在变量上按星号 (*),IDA 会提示数组的长度,它做得比较好。

  7. 如果您看到这两种模式,则可能是结构数组或更复杂的情况,例如结构中的结构数组是数组的成员,反之亦然:) 在这种情况下,请尝试找到最小的结构/数组并从它开始。

总的来说,有以下可能性会影响 Hex-Rays 中的函数堆栈:

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

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

就这样。

顺便说一句,您可能遗漏了一点:IDA 和 HexRays 可以在堆栈中的同一位置创建多个变量,因此 v369、v370、v371、v372、v373 使用堆栈中的相同位置,但不同从反编译代码的角度来看变量。