- 浏览: 132044 次
- 性别:
- 来自: 上海
最新评论
-
driftcloudy:
fellatioyzx 写道关于返回值那个,早期的C规定,不写 ...
一个有趣的C语法 -
fellatioyzx:
关于返回值那个,早期的C规定,不写返回值的话,默认为int,你 ...
一个有趣的C语法 -
driftcloudy:
RednaxelaFX 写道话说,要是读过Inside the ...
逆向C++学习手记(1) -
RednaxelaFX:
话说,要是读过Inside the C++ Object Mo ...
逆向C++学习手记(1) -
driftcloudy:
RednaxelaFX 写道也就是完全兴趣驱动?算是吧...
从Entry Point到main函数调用(3):_heap_init
文章列表
今天阅读代码时第一次碰到形如:
#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 ...