论坛: 编程破解 标题: 实现动态执行C语言代码 复制本贴地址    
作者: tabris17 [tabris17]    论坛用户   登录
  不知道各位看官中有没有写过编译器或是脚本引擎的。这东西还是很难di,先要学好《编译原理》,要融会贯通。
写脚本引擎还好些,若是写编译器的话,还要熟悉可执行文件的格式,如果还要考虑代码优化什么的,哎~~~~,等下辈
子吧……
  有没有羡慕过 M$ Office 中的 VBA ,如果能在自己开发的软件中也加入脚本支持该多好啊……。这个梦想也许可
以实现了。
  CScript 是一个小型的C语言编译器,支持 DLL 和 COM 技术,它可以动态编译执行 C 语言代码,也可以动态生成
独立执行的 EXE 文件(该功能需要注册),最棒的是他的 CScript 引擎,可以让你在自己的程序中加入 CScript的功能。
这个功能由软件自带的 CScriptEngine.dll 导出的4个函数实现:

char*  WINAPI CS_Compile(char* s);
BOOL    WINAPI CS_Build(char* s,BYTE** p,int *plen);
BOOL    WINAPI CS_InitializeMachineCode(BYTE* p);
BOOL    WINAPI CS_AddFunction(char *name,long address);

CS_Compile 函数用于编译指定的C语言代码;CS_Build 函数用于生成本地机器码;CS_InitializeMachineCode 函数用于初
始化本地机器码;CS_AddFunction 函数用于加入自定义函数,能扩展 CScript 的功能。
  不过十分可惜,以上所说这个功能只有注册用户才能享受(别…别…拿砖板砸我呀,会死人的。众看官:说了半天都是
P话,砸死丫的)。虽然,它要我们注册,但是我们也不是盖的,破解它不就行了。虽然我不是什么 Cracker,但好歹也算是
小半个“Hacker”(别砸,都说会死人的)。嘿嘿嘿,虽然我连在 SoftICE 中怎么设断点都不知道,但也算是学过几句汇编
了,静态反汇编还是没问题的。祭出 w32asm 这个反汇编利器……,咦!怎么没反应……搞了半天,原来我没装呀(晕,这
是我上班地方的电脑,没有这些“黑兵器”),还好,手头有一个叫 C32ASM 的反汇编工具,是国货呀,很好使的。
  CScript 的帮助文件里有一个 Demo,用 VC 编译好后,点击"RUN",弹出两次 MessageBox,都显示"Please Register."。
典型的Nag,看起来很好解决。先用 PEiD 检查一下 CScriptEngine.dll 是否有加壳,该文件在系统目录下。一看,果
然有用 ASPack 2.12 加壳,用 AspackDie 脱壳,然后用 C32ASM 打开,选则“查看->字符串”,搜索"Please Register.",
转到相应的代码,共有两处。往上翻几行,找到 "JNZ SHORT 10011XXX",改成 "JE SHORT 10011XXX" 就可以了。在相应代码
行上单击右键,选择“对应HEX编辑”,把75改成74就解决了。破解就到此结束。
  现在再执行一下 Demo,没问题了。下面就来解释一下 CScriptEngine.dll 导出的4个函数的用法:

1) CS_Compile 函数,它的参数是C语言代码文本在内存中的首地址。执行后返回编译后的中间代码的首地址。
2) CS_Build 函数的第一个参数是由 CS_Compile 函数编译得到的中间代码的首地址;第二个参数是指向存放返回存放生成的
机器码的首地址的指针(好复杂);第三个参数是指向返回生成机本地器码的长度的指针。
3) CS_InitializeMachineCode 函数用来初始化生成的机本地器码,他的参数是本地器码的首地址。
4) CS_AddFunction 函数,他的第一个参数是能在动态执行的C语言代码中调用的函数名,第二个参数是该函数的可执行代码在
内存中的实际地址。
  下面是简单的演试代码:

#include <windows.h>
//#pragma comment(linker,"/subsystem:windows")
//#pragma comment(linker,"/entry:WinEntry")

char SourceCode[]="#include <cscript.h>\r\nint MyFunction();\r\nint main()\r\n{\r\nprintf(\"Hello,China!\");MyFunction();\r\n}";
HMODULE hm;
HANDLE m_In,m_Out;
char buffout[4096];
typedef char* (WINAPI *Func_Compile)(char *src);
typedef BOOL (WINAPI *Func_Build)(char *src,char **p,int* plen);
typedef BOOL (WINAPI *Func_Init)(char *p);
typedef BOOL (WINAPI *Func_AddFunction)(char *,long);
typedef int (*Function_main)();

int MyFunction()
{
    MessageBox(NULL,"This text is put out by MyFunction!","MyFunction",MB_OK);
    return TRUE;
}

//void WinEntry(void)
int main()
{
Function_main fmain;
int len=0;
DWORD nBytesRead=0;
char *code=NULL,*p=NULL;

hm=LoadLibrary("CScriptEngine.dll");
CreatePipe(&m_In,&m_Out,NULL,0);
SetStdHandle(STD_OUTPUT_HANDLE,m_Out);
Func_Compile Compile=(Func_Compile)GetProcAddress(hm,"CS_Compile");
Func_Build Build=(Func_Build)GetProcAddress(hm,"CS_Build");
Func_Init Init=(Func_Init)GetProcAddress(hm,"CS_InitializeMachineCode");
Func_AddFunction AddFunction=(Func_AddFunction)GetProcAddress(hm,"CS_AddFunction");

if (!Compile||!Init||!Build||!AddFunction)
{
MessageBox(NULL,"CScriptEngine Error!","Error",MB_OK);
goto End;
}
code=Compile(SourceCode);
Build(code,&p,&len);
AddFunction("MyFunction",(long)MyFunction);
if(p)
{
Init(p);
fmain=(Function_main)p;
fmain();
VirtualFree(p,0,MEM_RELEASE);
if(PeekNamedPipe(m_In,buffout,1,&nBytesRead,NULL,NULL))
{
ReadFile(m_In,buffout,4096,&nBytesRead,NULL);
buffout[(int)nBytesRead]='\0';
MessageBox(NULL,buffout,"TextOut",MB_OK);
}
}
End:
ExitProcess(0);
}

注:CScript 中的 printf 等语句直接输出到当前进程的标准输出句柄。对于一个控制台程序, printf 等语句就会在当前的控制台
中显示输出语句,如果是个 Windows 程序,可以用 SetStdHandle 函数来定义当前进程的标准输出句柄。这个标准输出句柄可以是
匿名管道的输入句柄,或是文件句柄,也可以用 AllocConsole 函数来创建一个控制台输出窗口。

  我觉得其中最爽的功能要属 CS_AddFunction 函数,他可以使你的 CScript 中包含自己的编程接口,就像是调用操作系统中
API 函数,或是 JavaScript 中的内置对象一样。

  要脱离 cscript 的软件环境运行 CScriptEngine 还需做点移植工作,CScriptEngine.dll 当然是不可少的,还需要 CScript
安装目录下的 include 文件夹和 api.def 文件,include 文件夹和 api.def 文件必须放在同一目录下;如果 include 文件夹和
api.def 文件没有和 CScriptEngine.dll 放在同一目录下,还需要修改一下注册表来指定 CScriptEngine 的工作目录,在
HKEY_LOCAL_MACHINE\SOFTWARE\CScript 分支下建立一个名为“path”的字串值,他的值为指向存放 include 文件夹和 api.def
文件的路径。


下载 Demo: http://20cn.net/~tabris17/download/CScriptEngine_Demo.rar


地主 发表时间: 04-04-20 08:46

回复: 286 [unique]   版主   登录
厉害,好东东。


B1层 发表时间: 04-04-20 09:08

回复: ziaichen [ziaichen]   论坛用户   登录
厉害!

B2层 发表时间: 04-04-20 10:31

回复: yingzike [yingzike]   论坛用户   登录
好东东,可我暂时用不到,晕

B3层 发表时间: 04-04-20 11:06

回复: leonshoh [leonshoh]   论坛用户   登录
CScript执行时也生成类似Obj一样的中间代码,省略link的步骤,由CScript代替PE装载器装载bin代码

B4层 发表时间: 04-04-20 19:56

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号