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
似乎所有的数组/缓冲区都只在所有变量的底部全部都是缓冲区(也许只是该程序使用的编译器/优化器的类型)。
我想知道它是否可能将所有缓冲区重用为一个大缓冲区?
#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
评论
您正在使用哪个DA版本?我使用的是IDA 6.1版本。