主函数是c语言的入口,代码逆向(一)——寻找main函数入口

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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 记录的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值