该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
004113A0 PUSH EBP ; 函数入口
004113A1 MOV EBP, ESP
004113A3 SUB ESP, 0C0
004113A9 PUSH EBX
004113AA PUSH ESI
004113AB PUSH EDI
004113AC LEA EDI, DWORD PTR SS:[EBP-C0]
004113B2 MOV ECX, 30
004113B7 MOV EAX, CCCCCCCC
004113BC REP STOSD
004113BE MOV ESI, ESP
004113C0 PUSH Test_0.0041573C ; /Hello World!/r/n
004113C5 CALL DWORD PTR DS:[] ; /printf
004113CB ADD ESP, 4
004113CE CMP ESI, ESP
004113D0 CALL Test_0.00411145
004113D5 XOR EAX, EAX
004113D7 POP EDI
004113D8 POP ESI
004113D9 POP EBX
004113DA ADD ESP, 0C0
004113E0 CMP EBP, ESP
004113E2 CALL Test_0.00411145
004113E7 MOV ESP, EBP
004113E9 POP EBP
004113EA RETN
我们单击选择函数入口后,可以看到CPU窗格下面的信息窗格中显示如下信息:
跳转来自 0041100F
我们单击选择此信息后,点击鼠标右键,并选择【转到 JMP 来自0041100F】后即可来到上层调用函数(以后我们将之称为“返回到调用”):
0041100A JMP
0041100F JMP Test_0.004113A0 ; 我们停到这里
00411014 JMP Test_0.004124E0
遇到这种情况直接在返回到调用,此时来到真正调用main函数的地方:
0041195F MOV EAX, DWORD PTR DS:[417148]
00411964 PUSH EAX
00411965 MOV ECX, DWORD PTR DS:[41714C]
0041196B PUSH ECX
0041196C MOV EDX, DWORD PTR DS:[417144]
00411972 PUSH EDX
00411973 CALL Test_0.0041100F ; 我们停到这里
00411978 ADD ESP, 0C
0041197B MOV DWORD PTR DS:[41715C], EAX
00411980 CMP DWORD PTR DS:[417150], 0
00411987 JNZ SHORT Test_0.00411995
00411989 MOV EAX, DWORD PTR DS:[41715C]
0041198E PUSH EAX ; /status => 0
0041198F CALL DWORD PTR DS:[] ; /exit
通过上面的代码我们便看到了main函数的典型特征,临近exit,且有三个参数。接下来我们要做的就是不断地重复上面的步骤,一直到找到程序入口点为止。
最后你要做的就是针对不同的版本不同城上的编译器重复上面的步骤,直到收集到你认为足够丰富的信息后结束,从此你就再也不用怕为找不到main函数而苦恼了。
1.1.2、栈回溯法
栈回溯的方法是先找到main函数中的那个“HelloWorld”,下断点并按【F9】键运行后查看堆栈情况,我这里的堆栈情况如下:
0012FE9C 7C930208 ntdll.7C930208 ; 我们停在这里
0012FEA0 FFFFFFFF
0012FEA4 7FFDE000
0012FEA8 CCCCCCCC
…… ……
0012FF64 CCCCCCCC
0012FF68 /0012FFB8
0012FF6C |00411978 返回到 Test_0.00411978 来自 Test_0.0041100F
0012FF70 |00000001
0012FF74 |003D2C60
0012FF78 |003D2D40
0012FF7C |0A641DBC
0012FF80 |7C930208 ntdll.7C930208
0012FF84 |FFFFFFFF
0012FF88 |7FFDE000
0012FF8C |00369E99
0012FF90 |00000000
0012FF94 |00000000
0012FF98 |00130000 ASCII "Actx "
0012FF9C |00000000
0012FFA0 |0012FF7C
0012FFA4 |00000020
0012FFA8 |0012FFE0 指向下一个 SEH 记录的指针