C语言内存中执行外部代码详解(二)

前面我们讲了理论知识,本来打算再慢慢写的,不过有网友对这个话题很感兴趣,我就加快写了。 本文地址:http://www.hoverlees.com/blog/?p=1014 现在要做个实例,要实现这个功能,需要按以下步骤做: 1.创建需要加载到其它进程中的外部函数 2.编译这个代码 3.复制代码的机器指令到文件中 4.加密这个文件(可选) 5.其它进程使用VirtualAlloc(windows)或mmap(linux)将程序加载到内存中,如果加密了,需要在这里解密后加载。 6.执行程序。 下面我们进行要加载到内存的代码的编写,假设其它进程需要加载到内存中执行的函数叫get_number_line,我们先写出它的功能(就是获取一个文件的行数)

lua的C语言宿主编写

lua作为小巧的脚本语言,可以很轻松地嵌入到各种应用程序中去。它可以作为应用程序的配置脚本、游戏里的剧情和地图脚本,应用程序扩展,甚至于实现应用程序的完整控制逻辑。 当然,作为小巧的脚本语言,它自身主要集中在脚本引擎和基本的数据处理的实现上,而对于其它的功能,则可以用它的宿主程序来提供。就像大家熟悉的大型的脚本引擎javascript,它本身是没有window、screen等对象的,而是它的宿主对象(浏览器)替它实现的,lua则一样。 本文主要讨论lua宿主的实现及相关的接口调用。讨论以下相关的相关内容: 1. lua的集成 2. 直接执行脚本 3. 定义变量 4. 定义函数 5. 定义对象 本文地址:http://www.hoverlees.com/blog/?p=980

C语言内存中执行外部代码详解(一)

应用程序执行外部代码一般有多种方式,最显然的就是操作系统提供的链接库的方式,链接库是一个个的库文件,在编译时直接链接到应用程序中,或者是一个独立的库文件供应用程序调用。 但常常会有例如下面的一些应用场合: 你想保护程序的核心代码,想把核心代码加密成一个自己定义的文件,然后在程序运行时加载到内存中执行; 出于保护或者为了定时更新,你希望自己的核心代码每次都是从网络上下载的,并且不希望在用户硬盘上留下任何痕迹(这儿当然还有更好的DCOM之类的技术更加保护); 你想注入到其它进程的地址空间中执行;等等。 那么这篇文章或许对你有所帮助。希望大家不要拿来写后门程序之类的那些违背职业操守和损害他人利益的事 ^_^ 计划连载成二篇,第一篇讲基本原理,每二写个实例。 本文地址: http://www.hoverlees.com/blog/?p=953

C语言使用ActiveX控件

ActiveX使用的头文件,是只有C++才能用的,C语言要使用ActiveX控件,也是件很容易的事。 微软标准的ActiveX控件,根本上它还是一个窗口(Window),通俗地说就是关联了一个或多个COM对象窗口。这个窗口当然可以通过CreateWindowEx函数创建。 大家都知道,CreateWindowEx要指定一个类名和窗口名,类名是通过RegisterClassEx注册的窗口类的类名,而窗口名则视情况,对于APPWINDOW类型的窗口来讲,窗口名就是窗口标题。很幸运的事,运行ActiveX控件的窗口的窗口类(也可以说是ActiveX控件宿主窗口),微软已经帮我们实现,只要调用ATL库(atl.dll)里的初始化函数AtlAxWinInit,即可实现注册,类名为”AtlAxWin”。类名有了,在CreateWindowEx的时候还要指定窗口名为ActiveX控件的CLSID,即可成功创建ActiveX宿主窗口。 要获得窗口里的COM对象,通过ATL库里函数AtlAxGetControl即可获得。其它的工作就是操作COM对象的工作了。 建议在C语言里用LoadLibrary加载atl.dll,然后再使用里面的这两个函数。 写了一个实现的代码段:

IP归属地数据库,附带C,PHP访问代码

最近有打算给博客做个统计插件,看看都是哪儿来的朋友在看我的博客儿,需要一个详细的IP地址归属地数据库。网上找了个纯真的MySQL版的,30多万条数据占了20M左右的数据库空间,觉得有点浪费数据库空间,而且数据库查询时间太慢,特别是要一次性查多个结果时,更是不得了.最主要的是这种应用场合不适合做成数据库形式的。 所以就准备自己做数据库了,自己也有50000亿条数据的数据文件的设计经验。这才30多万条没什么问题。。。按自己的想法生成了文件,并写了PHP和C语言的访问API,心情好的时候再补写上Java啊,汇编啊什么的API也是挺好的。 数据库下载:GBK版 UTF8版 PHP API(函数):这个是函数形式的PHP代码,博客版面上是写描述,具体代码在这里:ips.php ip_area.php 代码调用示例:

INI配置文件解析C函数库

ini是Windows上较常用的小型配置文件,并且windows api提供方便的函数供应用程序读写配置,可惜linux等其它操作系统上的需要用其它的方式. 我这儿写ini配置库是可以跨平台使用的,对于需要跨平台但使用相同配置的应用来说是个不错的选择. 支持符合windows ini标准的配置文件. 有趣兴的朋友可以拿去研究研究. [2012-2-9日最新更新] 感谢前段时间一个网友提到程序的一些Bug,已修正程序,这次亲自在windows和linux下测试.已经支持GBK,UTF-8编码的ini文件解析。

lua面象对象写法

一直都想找一个好的嵌入脚本库,这样可以把一些常变动的逻辑处理以脚本形式独立出来,发现google的v8引擎不错,完全支持javascript,但是系统太过庞大,然后就找到了lua. 今天下载了lua下来编译,这个引擎就小巧多了.编译后会生成lua和luac两个执行文件,前者是CLI交互的(也可以执行脚本文件和编辑后的文件),在学习和测试脚本时很有用,后者是编辑脚本的. 然后花了半小时看lua的文档,语法简单,支持闭包,与js有些类似.而且有些特性又很有意思,比如多变量的赋值,可以用 a,b,c=1,2,3 这样的赋值,函数也可以返回 1,2,3 然后赋值,如 a,b,c=func(). lua实现面象对象与javascript类似,我这儿写了个面向对象的示例.

C语言访问Windows COM组件函数

COM(Component Object Model)是Windows里常用的组件对象模型,在Windows上是可以上升到操作系统级别,甚至到网络分布式级别的面象对象技术,也就是按照微软定义的标准实现的COM组件,不仅可以在本地Windows操作系统上让其它程序调用,而且可以供网络内的其它系统调用(DCOM)。 OLE是对象连接/嵌入技术,它其实就是COM,只是在COM的标准上主要增加了自动化功能,OLE大家最熟悉的应用就是在窗口程序上嵌入IE内核(WebBrowser类),然后程序通过WebBrowser提供的接口与里面的网页交互,然后就有了我们的遨游,360浏览器等等。而且OLE是脚本语言最重要的精神支持者之一 另外要指出的是COM是一种对象建模模型,任何人都可以使用这种模型为自己的项目建模,像腾讯的QQ软件,整个窗口上就嵌了一个OLE对象,但他们却又没有完全按照标准去写的,你无法拿到这个对象的包含的其它对象、属性和方法,这也是肯定的,要随便让人拿到那QQ软件就随便被其它程序控制了。 本文是以讲Windows上C语言访问COM为主的文章,并不打算讨论COM的实现细节,如果要了解COM的技术细节,可以参考微软的MSDN。文章后面附有我以前用汇编写的COM调用函数,我现在基本上不写汇编了,发上来是希望它能对汇编的学习人员提供帮助。 本文链接: http://www.hoverlees.com/blog/?p=746

MASM32写的Windows COM访问函数

这个是以前沉迷于MASM32的时候写的,现在我已经很少写汇编语言,但为了让这个代码对沉迷于MASM32的朋友有帮助,就特地写了个例子代码,例子代码调用SAPI的COM对象,让它说句话。 有兴趣的朋友可以拿去研究,我打算过两天写一篇详细的文章来讲解一下。这个例子代码有那么几个字总让我感觉不爽,但我又故意要这么写,这不自己坑自己么。。。。

Linux上使用程序相对路径访问文件

今天一个朋友问我这个问题,说为什么在Windows上跑得很好的应用程序,移植到Linux上后就读不到跟应用程序在同一文件夹下的文件呢,我说,这是Linux和Windows在Work directory上设置的不同。 大家都知道,对于Windows而言,应用程序的默认工作目录就是应用程序所在的目录,它一般是不管应用程序是从哪个目录上下文启动的。那么在不更改工作目录的情况下,读文件使用相对目录就肯定是相于应用程序所在的目录。 但对于Linux而言,应用程序的默认工作目录就不同了,它是默认是继承启动它的进程的工作目录的,也就是说,如果进程是在其它目录下启动,那应用程序的工作目录默认就在其它的目录下。这样的话使用相对路径访问文件就有很大的不确定性:我们永远也不能保证,用户一定是从应用程序所在的目录启动! 那要怎么解决呢,我给的建议是,在程序启动后,修改应用程序的当前目录到应用程序所在的目录,然后其它所有程序都无须改动。最好的办法当然只有一个,那就是通过main函数传入的argv[0]计算出当前目录。 下面的例子是读取跟应用程序所在同一目录的a.txt文件并显示,程序启动后修改当前工作目录为应用程序所在的目录,所以不管应用程序从哪个目录启动,程序都能正确地读到a.txt这个文件。