`
driftcloudy
  • 浏览: 130894 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表

一个有趣的C语法

    博客分类:
  • C
今天阅读代码时第一次碰到形如: #include <stdio.h> void main() { printf("%d\n", add(2,3)); getchar(); } int add(a, b) int a;int b; { return a+b; } 这里定义函数add时,参数列表中没有指明形参a、b的类型,反而在 int add(a, b)之后补充说明了int a;int b; 试了下,还可以这么写: #include <stdio.h> void main() { printf(&qu ...
最近常遇到的尴尬是看着汇编代码却无法在脑中反应出正确的C、C++代码 。近日偶得一篇好文《reverse C++》,细读下来收获不少。遂打算在《reverse C++》的基础上扩展,从汇编角度来认识一些C、C++中的语法现象~先从一些简单的开始... 一、数组 数组是非常基本的数据结构,C++中的数组表现为一段连续可用的内存。注意这段内存地址是连续的,这与很多动态语言中的数组不一样,举例来说PHP中的数组实际上是一种hash表式的实现,因而肯定不会是一段连续的内存。   对于充当全局变量的数组,会自动为数组中的每个变量附上默认值;而对于声明在函数体内部的局部变量,则需要手动进行初 ...
本章是该系列最后一篇,打算看一下 exit 函数中究竟做了些什么。   main函数的返回值 在第(5)篇里完成了_cinit() 的分析之后,mainCRTStartup中接下来代码是: __initenv = _environ; mainret = main(__argc, __argv, _environ); exit(mainret); 很 ...
_cinit 在完成了_setargv() 以及_setenvp() 之后,进入到_cinit 函数。该函数的注释很短,就一句“do C data initialize”,让人完全摸不着头脑。不过不用着急,可以阅读_cinit 函数的实现来加以分析。   _cinit 函数很短,大致上分为三个步骤: 1. _fpmath() 或者 (*_FPinit)(); 2. _initterm( __xi_a, __xi_z ); 3. _initterm( __xc_a, __xc_z );   第一步 是可选的,_FPinit 主要用来初始化浮点运算。只有当用户写的代码中出现 ...
先撇开_ioinit()不谈,IO有点儿麻烦,待有空再去挖掘这些东西。 GetCommandLineA 该函数的汇编代码短得令人发指。 7C812FBD mov eax, dword ptr [7C8855F4] 7C812FC2 retn 可见7C8855F4是个特殊的内存地址,其中存放了一个指向命令行缓冲区的指针。通过该指针,可以访问整个exe的完整路径以及后面附加的参数。   另外,通过PEB 中的ProcessParameters 也能够访问到CommandLine,但是通过这种方式访问到得是一个Unicode 字符串,而 ...
_heap_init 在(1)中提到过该函数用于分配一个堆。这个堆是动态创建的私有堆,与系统为进程分配的默认堆不同。进程启动时,系统会在进程虚拟地址空间中创建一个堆,即为进程的默认堆。默认堆的创建和回收均由系统来完成。除了默认堆,进程中还可以存在若干个私有堆。私有堆可以由进程动态创建,并且在此基础上进行内存分配、释放等操作。   _heap_init函数本质上是调用了HeapCreate函数,HeapCreate也是kernel32.dll提供的API。在CRT0.c 中对_heap_init 的调用为: #ifdef _MT if ( !_heap_init( ...
之前(1)篇中大致介绍了mainCRTStartup,但是其中一些调用到的函数并未深究,现打算逐一剖析它们。   GetVersion GetVersion函数是kernel32.dll中提供的API,用于获取当前Win平台的版本。准确的说,GetVersion可以获得3个信息: 1. OSPl ...
(1)    之前在调试exe时感觉很奇怪,为什么Entry Point并非直接进入到main函数。 举例来说,如果将一段空的C代码build为exe: void main(){ } 编译环境为:VC6 release。 再将该exe文件进行反汇编,那么从EP开始的代码部分大概形如 ...
这两个exe都是“加密与解密”书中“调试篇”的例子,CrackMe很简单,TraceMe稍微复杂一点。   1. CrackMe   分析CrackMe无需用OD打断点跟进,该程序逻辑非常简单,仅仅从汇编代码的调用上即可判断出其内部实现。 先用IDA进行CrackMe的反汇编,在最下方可以看到关于序列号的判断: 注意刚开始是无法看到右侧“序列号不对,重新再试一次”的字样的,需要查看内存地址00403000,发现是一个字符串数组,手动转化为数组后才能看到这些汉字。   很显然,关于判断序列号是否正确的代码就是: .text:004010BD                ...
开始学习逆向,从熟悉的js、php跳跃到汇编,有点小凌乱 ...   先来OD一段简单的C++代码: #include <string.h> #include <windows.h> #include <stdio.h> int funcA(int a, int b); void main() { int a; int b; int n; a = strlen("abc&q ...
在流量统计服务中都有Traffic source这个功能。Traffic source是针对访次级别的概念,换句话说,当访次建立的时候,landing page的流量来源即是该访次的Traffic source。虽然Traffic source有很多种,不过不幸的是依据现在JS,获得Traffic source ...
题目: 用CSS实现布局 让我们一起来做一个页面首先,我们需要一个布局。请使用CSS控制3个div,实现如下图的布局。 用javascript优化布局 由于我们的用户群喜欢放大看页面,于是我们给上一题的布局做一次优化。当鼠标略过某个区块的时候,该区块会放大25%,并且其他的区块仍然固定不动。 思路: 注意题目由于是只让用3个div,这让我很不习惯,如果不这么限制,我至少用四个,类似这样。   <div class='left'> <div id='left1'></div> < ...
前不久blog频道有人发表了一篇讲js里各种trim实现的 http://justjavac.iteye.com/blog/933093 不过没有提及Dojo中的trim。Dojo中有两种trim实现:   1.较为常用的: dojo.trim = String.prototype.trim ? function(str){ return str.trim(); } : function(str){ ...
一条面试题 公司最近在招web fronter,免不了需要进行面试,于是大家在群里讨论一些题目。其中一题如下: var a = new Object; var b = new Object; var c = new Object; c[a]=a; c[b]=b; alert(c[a]===a); //输出什么   这个题目还是很有意思的,第一反应往往会心中涌起一丝疑惑,这难道不是true么(我就是的= =!)事实上还真输出了一个false...这样也许看不出什么端倪,但是如果稍微变动一下代码: var a = new Object; var b = new Ob ...
接着第四章.... (二)   getInherited和inherited方法   这两个方法是对外提供的扩展接口,可以用declare出来的类型的实例调用。它们的用途是返回父类中曾经出现的方法,或者对其进行调用。具体的用法在第二章中已经描述,这里不再举例说明。   1. getInherited方法主要用来返回父类中的方法;   2. inherited方法主要用来调用父类中的方法;   首先来看getInherited方法,该方法的实现比较简单: //getInherited的实现,调用了inherited function getInherited(name, ar ...
Global site tag (gtag.js) - Google Analytics