1 入门
1.每个程序都从main()函数开始,所以我们先了解一下main()
好的,让我们先写一个世界上最出名的程序:
int main(int argc, _TCHAR* argv[])
{
printf("Hello World!/r/n");
return 0;
}
不错!很好的开始!然后用VS2008以Debug方式编译下,再用OllyDbg打开看看:
00411078 >JMP Test_0.004117B0
0041107D JMP Test_0.00412CC0
00411082 JMP <JMP.&MSVCR90D._lock>
00411087 JMP <JMP.&KERNEL32.GetProcAddress>
0041108C JMP Test_0.00411440
00411091 JMP Test_0.00413310
00411096 JMP <JMP.&MSVCR90D.?terminate@@YAXXZ>
0041109B JMP <JMP.&MSVCR90D._exit>
004110A0 JMP <JMP.&KERNEL32.GetCurrentThreadId>
004110A5 JMP <JMP.&MSVCR90D._initterm>
我们都知道其实编译器在编译我们的程序前会做很多准备工作,而这些准备工作由于涉及的东西较多且每个由此编译器生成的程序都一样,因此我们不必深究,只需快速且准确的找到main函数即可。
但是这对于初学逆向的朋友来说也是最难的,下面我就教各位读者怎样突破这个障碍。
想要找到main函数,那么我们就要从C语言本身讲起,在刚刚开始学习C语言的时候我们就被不幸的告知,我们的程序中必须要包含一个名字叫做main的函数,不管你多讨厌它都必须如此,后来便成了习惯……
后来查查C99标准,发现“int main(int argc, char *argv[])”与“int main(void)” 都 是被接受的,然后又查查MSDN,可以清晰看到一句话“The main and main functions can take the following three optional arguments”,也就是告诉了我们main函数其实是有3个参数的,其后面的例子更是证明了这句话确实是微软写上去的:
main( int argc, char *argv[ ], char *envp[ ] )
2.在c语言中,变量都要先声明在使用。
int a;
a=10;
在声明时要定义它的存储类型,那它的类型有char =1, short=2 ,long=4 ,double=8 .long long=8 , long double=12 ,int=4.
注意指针变量:char*p1;的内存大小于硬件有关,十六位的机子是它占2个,32位的占4字节。
2)函数结构:顺序,选择,循环三种。
1.选择结构:if else elseif switch case break default
2,循环结构:for while do.......while;