C/C++语言
masefee
PC网络游戏开发。。
展开
-
打算写一个ASM集成开发环境
最近使用汇编编译器的时候,感觉太麻烦了。。控制台编译链接。。网上下载的两个稍微集成的。一个不用说了,最基本的吧。另一个好一点,不过在语法着色方面和项目文件统一管理方面还有所欠缺。 自己也想用自己写的东西。。嘿嘿。。现在基础框架已经搭成。。。就差写功能逻辑了。。。。加油。。。原创 2009-03-04 08:58:00 · 2275 阅读 · 6 评论 -
进程间通信的几种方式浅谈(上)
程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(interprocess communication)。第二种技术是同步,当进程间相互具有合作依赖时使用。这两种类型的依赖关系可以同时存在。一般而言,进程有单独的地址空间。我们可以了解下可执行程序被装载到内存后建立的一系列映射等原创 2009-05-13 14:43:00 · 12443 阅读 · 1 评论 -
Shell Code 原理深入剖析
这两天都一直在解析3D模型数据。今天闲暇之余写了段测试代码。分析下黑客们用的缓冲区溢出攻击原理及Shell code原理。好,直接进入正题。有什么说得不对的地方还望大家纠正。嘿嘿!首先来这么一段小小的测试代码:void test( void ){ cout }int main( void ){ int a[ 1 ]; a[ 3 ] = ( int )test; return原创 2009-08-06 20:08:00 · 5334 阅读 · 23 评论 -
利用C++的operator new实现同一对象多次调用构造函数
struct STest{ STest( void ) { ++iCount; } int iCount;} int main( void ){ Stest obj; obj.iCount = 0; new( static_cast( &obj ) ) Stest();原创 2009-08-18 22:51:00 · 7868 阅读 · 10 评论 -
C/C++ HOOK API(原理深入剖析之-LoadLibraryA)
9月都快结束了,之前一直忙到写自己的东西加上上班。基本没有时间研究下汇编和C C++方面的感兴趣的东西。再怎么说嘛,9月还是得写一篇撒,以后每月至少一篇吧。给自己定了,希望大家监督。嘿嘿!这篇文章就来谈谈平常很常见的HOOK技术,这里呢。写得比较简单,方法很多。只讲原理!希望大鸟们别吐我口水哈 - -。好!切入正题。首先是概念吧。什么是钩子(HOOK)? 钩子(Hook),是Win原创 2009-09-18 12:36:00 · 27617 阅读 · 13 评论 -
深入C/C++之基于Cookie的安全检查(VS2005)
昨天在试着逆向一个有时间期限的LIB时,发现一些特别的检查函数,在之前的VC2003中是没有的,这些函数可谓是重量级函数。由于个人比较看不惯自己不懂的东西,出于不愤之情绪研究了下这些函数。首先在这里介绍个人认为较之其他几个更为重要的一种安全检查方式——基于Cookie的缓冲区溢出安全检查! 为了在发布版本中也能检测到缓冲区溢出,防止程序因缓冲区而受到攻击,VS2005(VC8)便增加了基于原创 2009-10-05 09:36:00 · 6637 阅读 · 11 评论 -
C/C++条件(三目)运算符巧妙原理解析
最近一直研究一个对个人而言很有价值的一个LIB库的逆向。在今天下班后突然灵感闪现,这个断断续续逆了接近一周的核心管理类。终于在今天给逆完了。在最后一个函数里,碰到了之前基本没有用过的一条指令。(呵呵,高手见笑了!)当然光看单句的汇编指令,是没有办法看出具体的作用的,而且还很可能会认为原作者本来就是用汇编来实现的!呵呵,先不废话,先贴出反汇编代码一睹为快: mov dw原创 2009-11-09 21:30:00 · 8472 阅读 · 18 评论 -
Win32 结构化异常处理(SEH)探秘
原著:Matt Pietrek翻译:VCKBASE译注:本文都翻译了一大半了,才发现网上已经有一篇董岩的译本(http://www.diybl.com/course/3_program/c++/cppsl/200866/122881.html),看完他的译文,感觉所有涉及关键技术的地方董岩翻译得非常到位,所以自己就没有再花时间往下译,本文后面的部分基本上都是采用了董岩的译文。此外,董岩在译转载 2009-11-16 19:36:00 · 4609 阅读 · 4 评论 -
C++中的【菱形虚继承】深入剖析
转眼间有过了一个月了,自从【C/C++语言入门篇】连载结束后,已经很久没有写博了。最近一直忙着本科毕业论文和工作上的任务,加上一个对于我来说非常重要的事情正在进行中。所以近段时间脑子一直处于绷紧状态,发现自己的脑细胞还真是不够用。加油! 今天有朋友问到一个问题,那就是在C++的多重继承中,出现菱形状继承的情况下,在构造对象时的内存分布及构造函数的调用流程上出现了问题。最后跟他解释清楚之后原创 2010-04-09 20:25:00 · 11975 阅读 · 11 评论 -
深入C/C++之基于CheckStackVars的安全检查(VS2008)
最近一直忙毕业的相关事情,加上工作,转眼间,又到月底了,之前承诺的每月一篇博文,前几天就一直在寻找到底要写什么,近两天又突然发现有很多东西可以写。本篇就先延续之前的一篇基于Cookie的安全检查机制(深入C/C++之基于Cookie的安全检查(VS2005))来介绍下另外一种在DEBUG版本下的安全检查,也就是CheckStackVars检查,话不多说,直接进入正题。 在VS2008下,函原创 2010-05-28 11:12:00 · 13449 阅读 · 13 评论 -
Inline HOOK API 改进版(hot-patching)
记得在之前写过一篇hook api的文章(C/C++ HOOK API(原理深入剖析之-LoadLibraryA)),那篇文章主要原理是构造一块代码字节,将LoadLibraryA函数的前面16个字节给修改,然后跳转到自定义的函数中。要调用正常的函数时,又将其unHook,这样一来再一次调用中,有一次unhook和一次hook,操作显得过于频繁。而且hook与unhook当时设计成了thiscall,因此维护传递this的寄存器(通常是ecx)就成了必然,再加上参数的传递,__Inline_Hook_Fun原创 2010-06-11 15:56:00 · 15966 阅读 · 13 评论 -
CC++程序员“是否应该掌握”【某种汇编语言】?
工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,原创 2011-09-11 15:19:32 · 15860 阅读 · 53 评论 -
【动态分配栈内存】之alloca内幕
哎,下班回家就开始大扫除,一直到凌晨才搞定,真的累了。但是计划的是今天必须将本文写完,不写完睡不着觉。那就尽快切入正题吧! 我们经常使用malloc或者new等函数或操作符来动态分配内存,这里的内存说的是堆内存,并且需要程序员手工释放分配的内存。malloc对应原创 2011-09-30 03:38:19 · 34581 阅读 · 32 评论 -
【揭秘VC CRT库Intel模块】-- 开篇
在本博客开启时,就有打算写这块的冲动,直到现在,直到今晚,突然一股劲让我开了这个系列,写下开篇。 近段时间一直忙于工作,潜下心来做自己的研究也少了很多,每天下班回家都10点多了,很累。一般就洗洗睡觉了,远远比不得几年前的精力和状态了。看来我得好好调整一下时间,让时间用在刀刃上。 切入正题,本系列主要针对vc的crt库中的intel版本asm源码进行逐个剖析,前面原创 2011-12-05 23:59:50 · 6952 阅读 · 2 评论 -
【揭秘VC CRT库Intel模块】-- strlen
既然是开篇后的第一篇,就先来一个简单且实用的函数吧,以增强你我的信心,然后再一步一步到复杂,这样从前至后,也就很顺其自然了。 还记得初学C的时候,对于字符串操作一类函数的记忆显得尤为深刻,各种考试会考strlen、strlen等函数的实现,到了毕业找工作,很多公司的笔试题里,也包含有strlen、strcpy等函数的实现。可见字符串操作类函数是受到了老师和公司出题者的青睐啊。那么原创 2011-12-06 00:00:25 · 11811 阅读 · 20 评论 -
C/C++联合(Union)浅谈
联合提供了一种方式,能够规避C的类型系统,允许以多种类型来引用一个对象。联合声明的语法和结构体的语法一样,只不过语义相差很大。它们不是用不同的域来引用不同的存储器块,而是引用同一块存储块。下面我们来举几个例子:struct STest{ char c; int i[ 2 ]; double var;}; union原创 2009-05-08 11:27:00 · 27343 阅读 · 15 评论 -
C++强制转换不同声明或类型的函数指针隐患
之前碰到一个问题,没有注意看函数指针的定义。造成一个错误,写到这里给自己一个提醒。也给大家看看我这个不小心的人犯的错误。嘿嘿! 先看段测试代码:void test( int param ){ int ret = 0; for ( int i = 0; i { ret += i; } ret >>= 16; ret |= (原创 2009-07-16 23:29:00 · 3293 阅读 · 2 评论 -
进程间通信的几种方式浅谈(下)
之前写了上,由于工作原因和忙到写自己的毕业设计。一直拖到现在。今晚突然有这个冲动把下面的写完。其实写到这里也就是做个笔记,留个思绪 - - 前面提到了几种方式,还要下面几种方式实现进程间的通信: 四、 共享内存共享内存也可以实现进程间的通信。进程需要可以被其他进程浏览的内存块。希望访问这个内存块的其他进程请求对它的访问,或由创建它的进程授予访问内存块的权限。可以访问特定内存块的原创 2009-07-16 22:36:00 · 4463 阅读 · 2 评论 -
基本完成山寨汇编IDE环境
最近一直加班,回家基本就累得不想写东西了。一直就拖到现在,本来几天就能完成主体功能的,结果一直拖到现在。。。惭愧啊! 嘿嘿! 写到这里,我也暂时搁下了。。能基本的工程管理和编译就可以了。。得抓紧写ALGA。。。。原创 2009-03-17 09:19:00 · 2977 阅读 · 5 评论 -
volatile关键字
将一个变量说明为volatile表示这个变量是“易变的”。如果一个变量会被其它引用改变,或在其它并行的任务中会被改变(例如中断服务程序),都要显式地说明为“volatile”,否则在编译器优化阶段会作出错误的判断,例如将这个变量读入寄存器以后,在没有对这个变量赋值以前,会一直使用寄存器中的值,而实际上这个变量的值可能已经被一个指针引用改变了,或者是在中断服务程序中被改变了,下面这个例原创 2009-03-20 10:09:00 · 1805 阅读 · 2 评论 -
InterLockedIncrement 和 InterLockedDecrement处理线程访问
前面已经讲过volatile关键字,当我们在处理多线程或者模拟一个类似COM的引用计数时,我们为了防止多个线程同时访问一个变量,导致不可预料的结果时。我们便可以方便的使用InterLockedIncrement 和 InterLockedDecrement 来对这个变量进行锁定访问: long volatile lReference;InterlockedIncrement(原创 2009-03-20 10:44:00 · 3245 阅读 · 0 评论 -
对类似COM和C++派生的一些理解
整理了下思路,大概就是根据全局的const变量来进行this指针定位,起到了转换的作用。这样一来增加了安全性。大致代码如下: #include const unsigned __int32 IID_PERSON = 0x11034567;const unsigned __int32 IID_STUDENT = 0x11065333;class IObject{public:原创 2009-03-22 11:37:00 · 1391 阅读 · 0 评论 -
C++ 数组负数下标 - 反向寻址
#include int main() { int a[ 5 ] = { 0, 1, 2, 3, 4 }; int* p = &a[ 4 ]; for ( int i = -4; i <= 0; i++ ) { std::cout << p[ i ] << std::endl; } system原创 2009-03-23 15:39:00 · 5260 阅读 · 5 评论 -
new操作符内部原理(二) 及 delete和free
前面我们说了new在分配空间的一些细节,这里作一些补充。其实我们在调用new时,在他的地层重载运算符里面是这样实现的:void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) _STD _Nomemory(); return (p); 可以看出它是直接调用了我们C语言中常用的malloc函数来实现。由此我原创 2009-03-24 09:17:00 · 6274 阅读 · 0 评论 -
new操作符内部原理(一)
写了这样一段代码,我们来做分析:#include int main( void ){ int* ptr = new int[ 5 ]; for ( int i = 0; i { ptr[ i ] = i + 1; std::cout }} 我们new了5个数据的int类型空间,我们然后来看内存里面的分布:原创 2009-03-23 18:25:00 · 5792 阅读 · 6 评论 -
C++中使用属性(property)
在C++中也可以使用像C#中的属性。在某些特定的环境我们可以使用这一方法,虽然在效率上会比直接访问要来得慢。但是这点效率基本可以忽略的。。代码大致如下: #include using namespace std; class test{public: int get( void ) { return m_nLevel; }原创 2009-03-25 12:23:00 · 7018 阅读 · 0 评论 -
手工实现字节对齐 及 代码质量思考
在游戏编程中,我们经常听到序列化这个词汇。在一些网络通讯和数据处理时,我们便会用到序列化。这里先不具体说明序列化。这里只说序列化过程中可能用到的字节对齐的问题: 我们首先是定义了这样一个宏: #define ALIGN( __size, __bits ) ( ( ( ( __size - 1 ) >> __bits ) + 1 ) 我们在使用的时候: DWORD d原创 2009-03-26 12:16:00 · 2743 阅读 · 1 评论 -
C++中获得CPU高精度时间戳( 纳秒级 )
对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。 在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是Q原创 2009-04-09 12:41:00 · 11623 阅读 · 10 评论 -
C++中模板元编程原理及速度测试
这两天一直被这个模板元编程给迷住了,觉得它真是一个很好的东西!于是好奇就仔细的研究了下,之前看过几篇文章大概的意思就是“编可以编程的程序”。听起来很神奇吧。 其基本原理也就是让编译器在编译期间就计算好一些我们需要计算的值。在程序运行期间就不需要再去计算这些值了,从而提高程序的运行性能。当然这样做会让程序编译起来很慢,一般不常用。不过在一些需要的地方我们还是舍得编译的效率问题的。。原创 2009-04-17 12:52:00 · 5436 阅读 · 6 评论 -
C++中一些不常用的前缀介绍
1. placement new 方法 如:pi = new ( ptr ) int; //placement new 括号里的参数是一个指针,它指向一个内存缓冲器,new操作将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些原创 2009-04-09 11:31:00 · 3046 阅读 · 0 评论 -
C/C++使用命令参数介绍
我们从写第一个HelloWorld程序时,就开始使用main函数。后来学到Windows编程, 又开始使用WinMain函数。我们都知道每个程序都得有个主函数入口。今天就简单介绍一下我们使用主函数时给它传入命令参数。很早以前就想写了,但是一直没有找到合适的地方。今天碰到项目中的一个问题,便想起了这块儿。。 我们通常写控制台main都没有带参数,因为我们很少用到。这个命令参数的功能呢就会涉及原创 2009-04-23 15:46:00 · 2855 阅读 · 3 评论 -
C/C++函数名修饰约定
函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。正在装载数据…… LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某转载 2009-04-25 19:29:00 · 6881 阅读 · 9 评论 -
C++/Debug模式查看EFL(标志寄存器)详解
在比如使用汇编指令如:ADC, SBB等指令时,我们为了心里那份好奇感就不得不去了解下FLAG寄存器(EFL)里面的东西。通过二进制详细的查看各标志位的值。然后这些需要用到标志寄存器的指令等就一目了然了。 - -迫不及待写了段测试代码来看看其中的秘密:#include int main( void ){ __asm { mov al, 0xff原创 2009-04-20 13:00:00 · 10031 阅读 · 8 评论