逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain

这学期逆向这门课的第一个小组作业是:PE文件通过逆向工具(IDA和OD)寻找main和winmain。

完整的实验报告见组长的博客:
https://www.cnblogs.com/-mo-/p/12524691.html

因为我在小组分工里完成的是寻找winmain的过程(其实就是按照组长的博客复现了一遍、录了视频摆了),所以这里也只记录了关于winmain的一些知识点。


1.定义

WinMain是windows API窗体程序的入口函数,该函数的功能是被系统调用,作为一个32位应用程序的入口点。WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。

2.函数详解

WinMain是用于应用程序入口点的常规名称,他的句法如下:

int __clrcall WinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR     lpCmdLine,
  int       nShowCmd
);

其中四个参数的解释如下:

hInstance        类型:HINSTANCE,应用程序当前实例的句柄,也就是他所处的基地址。
hPrevInstance    类型:HINSTANCE,应用程序先前实例的句柄。此参数始终为NULL。
lpCmdLine        类型:LPSTR,应用程序的命令行,不包括程序名称。
nShowCmd         待定
3.实验过程

1.实验使用的PE文件是:
在这里插入图片描述
2.IDA查找winmain函数

1.用IDA打开程序,点击【Exports】页面,双击【start】:
在这里插入图片描述
2.按F5,会出现【Pseudocode-A】查看伪代码的页面:

  • 注意:从我一个逆向小白的角度来看,如果按了F5没有反应的话,可能是IDA的问题,我用x64的不行,换成了x86的就可以了。

逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第1张图片
3.往下翻,看程序是以哪个变量退出的,这里可以看到,是v5:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第2张图片
4.双击【wWinMain】进入函数体,可以看到这里有四个参数,就是前面说的那四个winmain的句法参数:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第3张图片
3.OD查找winmain函数

1.用OD打开PE文件,然后直接按F8单步运行,出现死循环的时候,鼠标单击循环的下一句,按F4就可以跳出循环了,然后再F8单步运行,因为程序运行到 main 函数时,经常会伴随着栈的活动,所以观察OD的栈面板窗口,直到出现以下界面:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第4张图片

  • 但是我的OD没有出现参数:
    逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第5张图片
    经过反复测试,结论是OD有问题!然后我换了一个OD:
    逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第6张图片

2.对照参数:
(1)Arg1:就是上面参数详解中的 hInstance ,应用程序当前实例的句柄,也就是他所处的基地址,在OD里面可以用 ALT+E 查看程序的基地址:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第7张图片
然后ATL+C退回刚才的页面。

(2)Arg2:这里的Arg2 = 0 ,也对应了参数详解中的始终为 NULL 的 hPrevInstance

(3)Arg3:右键【Follow in Dump】追踪一下:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第8张图片
可以在ASCII中看到lpCmdLine 应用程序的命令行格式:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第9张图片
(4)Arg4:第四个参数无实意,为了证明此函数为 winmain函数。

3.回车,进入函数体:
逆向之1PE文件通过逆向工具(IDA和OD)寻找main和winmain_第10张图片
本来想把录屏放上来的,但是没法上传。

你可能感兴趣的:(逆向)