入口函数的反汇编

时间:2023-02-11 23:36:33

大家新年快乐啊。。。


有个小问题,想请教:


一个c控制台程序, 代码很简单, 已经生成exe, 


如果用 od来进行 反汇编,  如何知道这个小程序的入口函数在哪里呢?


vc的反汇编,不难,照着看就是了,。,

脱离了vc,比如用od来反汇编, 我就傻眼了。。。不知道其入口函数

必须找到main函数,然后开始设置断点,进行分析。


有控制台程序逆向的前辈,   给个建议,谢谢了

18 个解决方案

#1


该回复于2012-01-29 09:40:28被版主删除

#2


想要知道汇编代码vc中有相应的功能 http://blog.csdn.net/yiyefangzhou24/article/details/6440239

#3


你误会了


我的意思是 不借助vc


用od来分析反汇编


如何快速找到 main函数的入口地址
 

我们知道, vc生成的exe,  它映射到虚拟地址空间中的基地址是0040 0000h

但是main函数并不是



引用 2 楼 yiyefangzhou24 的回复:
想要知道汇编代码vc中有相应的功能http://blog.csdn.net/yiyefangzhou24/article/details/6440239

#4




我不知道,是不是每一个console程序 的main地址 是否一致

有经验的前辈,是如何快速的进入入口函数呢










引用 3 楼 caddor 的回复:
你误会了


我的意思是 不借助vc


用od来分析反汇编


如何快速找到 main函数的入口地址
 

我们知道, vc生成的exe,  它映射到虚拟地址空间中的基地址是0040 0000h

但是main函数并不是



引用 2 楼 yiyefangzhou24 的回复:

想要知道汇编代码vc中有相应的功能http://blog.csdn.ne……

#5


这个楼主我帮不了你,没做过类似工作。不好意思

#6


没事,  会这个的,不多

谢谢了啊


引用 5 楼 yiyefangzhou24 的回复:
这个楼主我帮不了你,没做过类似工作。不好意思

#7


只试了几个简单的小程序。。看了个文章: http://nebulas.blog.51cto.com/812278/184106
od载入后往下f8找到GetCommandLineA。。然后下面第5个call。。我试了几个小程序是这样

004010D5  |.  FF15 00604000 call    dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA
004010DB  |.  A3 24AE4000   mov     dword ptr [40AE24], eax
004010E0  |.  E8 1A100000   call    004020FF
004010E5  |.  A3 E8984000   mov     dword ptr [4098E8], eax
004010EA  |.  E8 C30D0000   call    00401EB2
004010EF  |.  E8 050D0000   call    00401DF9
004010F4  |.  E8 7A0A0000   call    00401B73
004010F9  |.  A1 28994000   mov     eax, dword ptr [409928]
004010FE  |.  A3 2C994000   mov     dword ptr [40992C], eax
00401103  |.  50            push    eax
00401104  |.  FF35 20994000 push    dword ptr [409920]
0040110A  |.  FF35 1C994000 push    dword ptr [40991C]
00401110  |.  E8 FBFEFFFF   call    00401010       // 貌似一般这个就是跳到main的。。
00401115  |.  83C4 0C       add     esp, 0C
00401118  |.  8945 E4       mov     dword ptr [ebp-1C], eax

#8


方法很多,你可以这样
int main()
{
__asm int 3
...
}
然后直接在调试器里运行,到了__asm int 3就会断点

#9


int main()
{


std::cout<<"xyz";


return 0;
}


od加载后,程序启动的地址为:

77A10194    895C24 08       MOV DWORD PTR SS:[ESP+8],EBX

按f8后,一直到
77A1FC4B    64:FF15 C000000       CALL DWORD PTR FS:[C0]
77A1FC52    83C4 04          ADD ESP,4
77A1FC55    C2 0800          RETN 8



就停止了,输出为'xyz"

然后按f8,没有反应

平台是:win7 64位



ctrl+g 来查找 "xyz" ,也没有招到 


#10



win7  64位平台,  很是奇怪


比如: 比如我写了了个很简单的汇编程序,在 xp  od调试, 刚开始的时候,有个启动地址

和win7  od  调试 的启动地址,是不一样的


不知道这是不是操作系统的原因。。。。


确实没有7楼所说的 00401000 h 这个地址




引用 9 楼 chouxiaoya8100 的回复:
int main()
{


std::cout<<"xyz";


return 0;
}


od加载后,程序启动的地址为:

77A10194    895C24 08       MOV DWORD PTR SS:[ESP+8],EBX

按f8后,一直到
77A1FC4B    64:FF15 C000000       CALL DWORD PTR F……

#11


http://wenku.baidu.com/view/d477c0cea1c7aa00b52acb0f.html


这是一篇关于 逆向寻找main函数的地址的文章

感觉只能对于xp 平台


9楼遇到的问题,   是win7 ,所以没有进入那个004010000h



7楼用的操作系统, 是不是win7???

#12


optional header里面就有入口点

#13


引用 11 楼 caddor 的回复:
http://wenku.baidu.com/view/d477c0cea1c7aa00b52acb0f.html


这是一篇关于 逆向寻找main函数的地址的文章

感觉只能对于xp 平台


9楼遇到的问题,   是win7 ,所以没有进入那个004010000h



7楼用的操作系统, 是不是win7???

我的环境是Win xp 32Bit

#14


多谢

光会汇编不够,

离逆向还远



我以为一个简单的几行代码的控制台程序,逆向会容易些,

挺麻烦的, 没有基础,main函数都难以找到


谢谢各位。。。 祝大家春节快乐 



引用 12 楼 lactoferrin 的回复:
optional header里面就有入口点

#15


。。。。你需要切换到你写的exe模块
然后 选择  查找》当前模块中的所有名称
如果是UNICODE  直接查找 main
如果是ANSI     直接超找 wmain

这个地址就是所谓的Console下自己写的_tmain的真正入口。

附上一个参考
<a href="http://www.mouseos.com/programming/windows/main.html">http://www.mouseos.com/programming/windows/main.html</a>

#16


引用 15 楼 otishiono 的回复:
。。。。你需要切换到你写的exe模块
然后 选择  查找》当前模块中的所有名称
如果是UNICODE  直接查找 main
如果是ANSI     直接超找 wmain

这个地址就是所谓的Console下自己写的_tmain的真正入口。

附上一个参考
<a href="http://www.mouseos.com/programming/windows/main.html">……


更正一下。。
如果是UNICODE 直接查找 wmain
如果是ANSI    直接超找 main

#17


http://hi.csdn.net/attachment/201002/5/1341783_12653828046fza.jpg

测试一个发图

#18


根本不用od和vc,直接分析pe格式就结鸟。

#1


该回复于2012-01-29 09:40:28被版主删除

#2


想要知道汇编代码vc中有相应的功能 http://blog.csdn.net/yiyefangzhou24/article/details/6440239

#3


你误会了


我的意思是 不借助vc


用od来分析反汇编


如何快速找到 main函数的入口地址
 

我们知道, vc生成的exe,  它映射到虚拟地址空间中的基地址是0040 0000h

但是main函数并不是



引用 2 楼 yiyefangzhou24 的回复:
想要知道汇编代码vc中有相应的功能http://blog.csdn.net/yiyefangzhou24/article/details/6440239

#4




我不知道,是不是每一个console程序 的main地址 是否一致

有经验的前辈,是如何快速的进入入口函数呢










引用 3 楼 caddor 的回复:
你误会了


我的意思是 不借助vc


用od来分析反汇编


如何快速找到 main函数的入口地址
 

我们知道, vc生成的exe,  它映射到虚拟地址空间中的基地址是0040 0000h

但是main函数并不是



引用 2 楼 yiyefangzhou24 的回复:

想要知道汇编代码vc中有相应的功能http://blog.csdn.ne……

#5


这个楼主我帮不了你,没做过类似工作。不好意思

#6


没事,  会这个的,不多

谢谢了啊


引用 5 楼 yiyefangzhou24 的回复:
这个楼主我帮不了你,没做过类似工作。不好意思

#7


只试了几个简单的小程序。。看了个文章: http://nebulas.blog.51cto.com/812278/184106
od载入后往下f8找到GetCommandLineA。。然后下面第5个call。。我试了几个小程序是这样

004010D5  |.  FF15 00604000 call    dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA
004010DB  |.  A3 24AE4000   mov     dword ptr [40AE24], eax
004010E0  |.  E8 1A100000   call    004020FF
004010E5  |.  A3 E8984000   mov     dword ptr [4098E8], eax
004010EA  |.  E8 C30D0000   call    00401EB2
004010EF  |.  E8 050D0000   call    00401DF9
004010F4  |.  E8 7A0A0000   call    00401B73
004010F9  |.  A1 28994000   mov     eax, dword ptr [409928]
004010FE  |.  A3 2C994000   mov     dword ptr [40992C], eax
00401103  |.  50            push    eax
00401104  |.  FF35 20994000 push    dword ptr [409920]
0040110A  |.  FF35 1C994000 push    dword ptr [40991C]
00401110  |.  E8 FBFEFFFF   call    00401010       // 貌似一般这个就是跳到main的。。
00401115  |.  83C4 0C       add     esp, 0C
00401118  |.  8945 E4       mov     dword ptr [ebp-1C], eax

#8


方法很多,你可以这样
int main()
{
__asm int 3
...
}
然后直接在调试器里运行,到了__asm int 3就会断点

#9


int main()
{


std::cout<<"xyz";


return 0;
}


od加载后,程序启动的地址为:

77A10194    895C24 08       MOV DWORD PTR SS:[ESP+8],EBX

按f8后,一直到
77A1FC4B    64:FF15 C000000       CALL DWORD PTR FS:[C0]
77A1FC52    83C4 04          ADD ESP,4
77A1FC55    C2 0800          RETN 8



就停止了,输出为'xyz"

然后按f8,没有反应

平台是:win7 64位



ctrl+g 来查找 "xyz" ,也没有招到 


#10



win7  64位平台,  很是奇怪


比如: 比如我写了了个很简单的汇编程序,在 xp  od调试, 刚开始的时候,有个启动地址

和win7  od  调试 的启动地址,是不一样的


不知道这是不是操作系统的原因。。。。


确实没有7楼所说的 00401000 h 这个地址




引用 9 楼 chouxiaoya8100 的回复:
int main()
{


std::cout<<"xyz";


return 0;
}


od加载后,程序启动的地址为:

77A10194    895C24 08       MOV DWORD PTR SS:[ESP+8],EBX

按f8后,一直到
77A1FC4B    64:FF15 C000000       CALL DWORD PTR F……

#11


http://wenku.baidu.com/view/d477c0cea1c7aa00b52acb0f.html


这是一篇关于 逆向寻找main函数的地址的文章

感觉只能对于xp 平台


9楼遇到的问题,   是win7 ,所以没有进入那个004010000h



7楼用的操作系统, 是不是win7???

#12


optional header里面就有入口点

#13


引用 11 楼 caddor 的回复:
http://wenku.baidu.com/view/d477c0cea1c7aa00b52acb0f.html


这是一篇关于 逆向寻找main函数的地址的文章

感觉只能对于xp 平台


9楼遇到的问题,   是win7 ,所以没有进入那个004010000h



7楼用的操作系统, 是不是win7???

我的环境是Win xp 32Bit

#14


多谢

光会汇编不够,

离逆向还远



我以为一个简单的几行代码的控制台程序,逆向会容易些,

挺麻烦的, 没有基础,main函数都难以找到


谢谢各位。。。 祝大家春节快乐 



引用 12 楼 lactoferrin 的回复:
optional header里面就有入口点

#15


。。。。你需要切换到你写的exe模块
然后 选择  查找》当前模块中的所有名称
如果是UNICODE  直接查找 main
如果是ANSI     直接超找 wmain

这个地址就是所谓的Console下自己写的_tmain的真正入口。

附上一个参考
<a href="http://www.mouseos.com/programming/windows/main.html">http://www.mouseos.com/programming/windows/main.html</a>

#16


引用 15 楼 otishiono 的回复:
。。。。你需要切换到你写的exe模块
然后 选择  查找》当前模块中的所有名称
如果是UNICODE  直接查找 main
如果是ANSI     直接超找 wmain

这个地址就是所谓的Console下自己写的_tmain的真正入口。

附上一个参考
<a href="http://www.mouseos.com/programming/windows/main.html">……


更正一下。。
如果是UNICODE 直接查找 wmain
如果是ANSI    直接超找 main

#17


http://hi.csdn.net/attachment/201002/5/1341783_12653828046fza.jpg

测试一个发图

#18


根本不用od和vc,直接分析pe格式就结鸟。