前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PB反编译的搜索

BCB编写DLL终极手册(转) - chengg0769 来自四川,在东莞虚度十载 - 博客频道 - CSDN.NET chengg0769 来自四川,在东莞虚度十载 PB反编译_Powerbuilder DeCompiler_PB反编译器_PB混淆器_PB加密 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! 消灭0回答,赢下载分 “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 BCB编写DLL终极手册(转) 2011-06-02 17:27 199人阅读 评论(0) 收藏 举报 dllapplicationborlandpascalmicrosoftwinapi 一. 编写 DLL File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类 导出函数:extern "C" __declspec(dllexport) ExportType FunctionName(Parameter) 导出类:class __declspec(dllexport) ExportType ClassName{...} 例子:(说明:只是生成了一个 DLL.dll )#include "DllForm.h" // TDllFrm 定义USERES("Dll.res");USEFORM("DllForm.cpp", DllFrm);class __declspec(dllexport) __stdcall MyDllClass { //导出类 public: MyDllClass(); void CreateAForm(); TDllFrm* DllMyForm;};TDllFrm* DllMyForm2;extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();//导出函数//---------------------------------------------------------------------------int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*){ return 1;}//---------------------------------------------------------------------------MyDllClass::MyDllClass(){}void MyDllClass::CreateAForm(){ DllMyForm = new TDllFrm(Application); DllMyForm->Show();}//---------------------------------------------------------------------------void __stdcall CreateFromFunct(){ DllMyForm2 = new TDllFrm(Application); DllMyForm2->Show();}二. 静态调用 DLL使用 $BCB path/Bin/implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目录,使用 implib MyDll.lib MyDll.dll 生成// Unit1.h // TForm1 定义#include "DllForm.h" // TDllFrm 定义//---------------------------------------------------------------------------__declspec(dllimport) class __stdcall MyDllClass { public: MyDllClass(); void CreateAForm(); TDllFrm* DllMyForm;}; extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();class TForm1 : public TForm{...}// Unit1.cpp // TForm1 实现void __fastcall TForm1::Button1Click(TObject *Sender){ // 导出类实现,导出类只能使用静态方式调用 DllClass = new MyDllClass(); DllClass->CreateAForm(); }//---------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender){ // 导出函数实现 CreateFromFunct();}//---------------------------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){ delete DllClass;}三. 动态调用 DLL// Unit1.h class TForm1 : public TForm{...private: // User declarationsvoid (__stdcall *CreateFromFunct)();...}// Unit1.cpp // TForm1HINSTANCE DLLInst = NULL;void __fastcall TForm1::Button2Click(TObject *Sender){ if( NULL == DLLInst ) DLLInst = LoadLibrary("DLL.dll"); //上面的 Dll if (DLLInst) { CreateFromFunct = (void (__stdcall*)()) GetProcAddress(DLLInst, "CreateFromFunct"); if (CreateFromFunct) CreateFromFunct(); else ShowMessage("Could not obtain function pointer"); } else ShowMessage("Could not load DLL.dll");}void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){ if ( DLLInst ) FreeLibrary (DLLInst);} 四. DLL 作为 MDIChild (子窗体) 【只编写动态调用的例子】 实际上,调用子窗体的 DLL 时,系统只是检查应用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复 Application// MDIChildPro.cpp // Dll 实现 CPP#include "unit1.h" // TForm1 定义TApplication *SaveApp = NULL;int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*){ if ( (reason==DLL_PROCESS_DETACH) && SaveApp ) Application = SaveApp ; // 恢复 Application return 1;}extern "C" __declspec(dllexport) __stdcall void TestMDIChild( //1024X768 TApplication* mainApp, LPSTR lpCaption){ if ( NULL == SaveApp ) // 保存 Application,传递 Application { SaveApp = Application; Application = mainApp; } // lpCaption 为子窗体的 Caption TForm1 *Form1 = new TForm1 ( Application, lpCaption ); Form1->Show();}注:上面的程序使用 BCB 3.0 编译成功五. BCB 调用 VC 编写的 DLL 1. 名字分解: 没有名字分解的函数 TestFunction1 // __cdecl calling convention @TestFunction2 // __fastcall calling convention TESTFUNCTION3 // __pascal calling convention TestFunction4 // __stdcall calling convention 有名字分解的函数 @TestFunction1$QV // __cdecl calling convention @TestFunction2$qv // __fastcall calling convention TESTFUNCTION3$qqrv // __apscal calling convention @TestFunction4$qqrv // __stdcall calling convention 使用 extern "C" 不会分解函数名 使用 Impdef MyLib.def MyLib.DLL 生成 def 文件查看是否使用了名字分解 2. 调用约定: __cdecl 缺省 是 Borland C++ 的缺省的 C 格式命名约定,它在标识符前加一下划线,以保留 它原来所有的全程标识符。参数按最右边参数优先的原则传递给栈,然后清栈。 extaern "C" bool __cdecl TestFunction(); 在 def 文件中显示为 TestFunction @1 注释: @1 表示函数的顺序数,将在“使用别名”时使用。 __pascal Pascal格式 这时函数名全部变成大写,第一个参数先压栈,然后清栈。 TESTFUNCTION @1 //def file __stdcall 标准调用 最后一个参数先压栈,然后清栈。 TestFunction @1 //def file __fastcall 把参数传递给寄存器 第一个参数先压栈,然后清栈。 @TestFunction @1 //def file 3. 解决调用约定: Microsoft 与 Borland 的 __stdcall 之间的区别是命名方式。 Borland 采用 __stdcall 的方式去掉了名字起前的下划线。 Microsoft 则是在前加上下划线,在 后加上 @ ,再后跟为栈保留的字节数。字节数取决于参数在栈所占的空间。每一个 参数都舍入为 4 的倍数加起来。这种 Miocrosoft 的 DLL 与系统的 DLL 不一样。 4. 使用别名: 使用别名的目的是使调用文件 .OBJ 与 DLL 的 .DEF 文件相匹配。如果还没有 .DEF 文件,就应该先建一个。然后把 DEF 文件加入 Project。使用别名应不断 修改外部错误,如果没有,还需要将 IMPORTS 部分加入 DEF 文件。 IMPORTS TESTFUNCTIOM4 = DLLprj.TestFunction4 TESTFUNCTIOM5 = DLLprj.WEP @500 TESTFUNCTIOM6 = DLLprj.GETHOSTBYADDR @51 这里需要说明的是,调用应用程序的 .OBJ 名与 DLL 的 .DEF 文件名是等价的, 而且总是这样。甚至不用考虑调用约定,它会自动匹配。在前面的例子中,函数被 说明为 __pascal,因此产生了大写函数名。这样链接程序不会出错。 5. 动态调用例子VC DLL 的代码如下:extern "C" __declspec(dllexport) LPSTR __stdcall BCBLoadVCWin32Stdcall(){static char strRetStdcall[256] = "BCB Load VC_Win32 Dll by __stdcall mode is OK!";return strRetStdcall;} extern "C" __declspec(dllexport) LPSTR __cdecl BCBLoadVCWin32Cdecl(){static char strRetCdecl[256] = "BCB Load VC_Win32 Dll by __cdecl mode is OK!";return strRetCdecl;} extern "C" __declspec(dllexport) LPSTR __fastcall BCBLoadVCWin32Fastcall(){static char strRetFastcall[256] = "BCB Load VC_Win32 Dll by __fastcall mode is OK!";return strRetFastcall;} 其实动态调用与调用 BCB 编写的 DLL 没有区别,关键是查看 DLL 的导出函数名字 可以使用 tdump.exe(BCB工具) 或者 dumpbin.exe(VC工具) 查看 tdump -ee MyDll.dll >1.txt (查看 1.txt 文件即可) 由于 VC6 不支持 __pascall 方式,下面给出一个三种方式的例子void __fastcall TForm1::btnBLVCWin32DynClick(TObject *Sender){ /*cmd: tdbump VCWin32.dll >1.txtTurbo Dump Version 5.0.16.4 Copyright (c) 1988, 1998 Borland International Display of File VCWIN32.DLLEXPORT ord:0000='BCBLoadVCWin32Fastcall::'EXPORT ord:0001='BCBLoadVCWin32Cdecl'EXPORT ord:0002='_BCBLoadVCWin32Stdcall@0' */ if ( !DllInst ) DllInst = LoadLibrary ( "VCWin32.dll" ); if ( DllInst ) { BCBLoadVCWin32Stdcall = (LPSTR (__stdcall *) () ) GetProcAddress ( DllInst, "_BCBLoadVCWin32Stdcall@0" ); //VC Dll // GetProcAddress ( DllInst, "BCBLoadVCWin32Stdcall" ); //BCB Dll if ( BCBLoadVCWin32Stdcall ) { ShowMessage( BCBLoadVCWin32Stdcall() ); } else ShowMessage ( "Can't find the __stdcall Function!" ); BCBLoadVCWin32Cdecl = (LPSTR (__cdecl *) () ) GetProcAddress ( DllInst, "BCBLoadVCWin32Cdecl" ); if ( BCBLoadVCWin32Cdecl ) { ShowMessage( BCBLoadVCWin32Cdecl() ); } else ShowMessage ( "Can't find the __cdecl Function!" ); //Why?不是 'BCBLoadVCWin32Fastcall::',而是 '@BCBLoadVCWin32Fastcall@0'? BCBLoadVCWin32Fastcall = (LPSTR (__fastcall *) () ) //GetProcAddress ( DllInst, "BCBLoadVCWin32Fastcall::" ); GetProcAddress ( DllInst, "@BCBLoadVCWin32Fastcall@0" ); if ( BCBLoadVCWin32Fastcall ) { ShowMessage( BCBLoadVCWin32Fastcall() ); } else ShowMessage ( "Can't find the __fastcall Function!" ); } else ShowMessage ( "Can't find the Dll!" );} 6. 静态调用例子 静态调用有点麻烦,从动态调用中可以知道导出函数的名字,但是直接时(加入 lib 文件到工程文件) Linker 提示不能找到函数的实现 从 4 看出,可以加入 def 文件连接 (可以通过 impdef MyDll.def MyDll.dll 获得导出表) 建立与 DLL 文件名一样的 def 文件与 lib 文件一起加入到工程文件 上面的 DLL(VCWIN32.dll) 的 def 文件为(VCWIN32.def):LIBRARY VCWIN32.DLLIMPORTS @BCBLoadVCWin32Fastcall = VCWIN32.@BCBLoadVCWin32Fastcall@0 _BCBLoadVCWin32Cdecl = VCWIN32.BCBLoadVCWin32Cdecl BCBLoadVCWin32Stdcall = VCWIN32._BCBLoadVCWin32Stdcall@0对应的函数声明和实现如下:extern "C" __declspec(dllimport) LPSTR __fastcall BCBLoadVCWin32Fastcall();extern "C" __declspec(dllimport) LPSTR __cdecl BCBLoadVCWin32Cdecl();extern "C" __declspec(dllimport) LPSTR __stdcall BCBLoadVCWin32Stdcall();void __fastcall TfrmStatic::btnLoadDllClick(TObject *Sender){ ShowMessage ( BCBLoadVCWin32Fastcall() ); ShowMessage ( BCBLoadVCWin32Cdecl() ); ShowMessage ( BCBLoadVCWin32Stdcall() );}注意:在 BCB 5.0 中,可能直接按下 F9 是不能通过 Linker 的,请先 Build 一次注:上面的程序使用 BCB 5.0 与 VC6.0 编译成功 更多 上一篇:SQL2000无法连接127.0.0.1的故障 下一篇:BCB编写dll(转) 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 chengg0769 访问:515788次 积分:8553分 排名:第420名 原创:267篇 转载:211篇 译文:0篇 评论:348条 文章搜索 文章分类 PB反编译与加密(12) IOS和安卓(9) PB与数据库(9) 网络相关(1) 搜索相关(0) 闲话扯起耍(1) 其他语言(4) 文章存档 2013年12月(2)2013年11月(2)2013年09月(1)2013年02月(1)2012年11月(1)2012年09月(1)2012年08月(6)2012年07月(1)2012年05月(3)2012年03月(4)2011年12月(2)2011年11月(2)2011年10月(9)2011年09月(6)2011年08月(11)2011年07月(2)2011年06月(4)2011年04月(3)2010年12月(1)2010年10月(2)2010年09月(8)2010年08月(1)2010年07月(8)2010年06月(17)2010年05月(2)2010年04月(2)2010年03月(4)2010年01月(1)2009年09月(8)2009年08月(5)2009年07月(8)2009年06月(8)2009年05月(16)2009年03月(2)2009年02月(7)2008年12月(2)2008年11月(4)2008年10月(5)2008年08月(1)2008年07月(2)2008年01月(12)2007年12月(29)2007年11月(7)2007年10月(4)2007年09月(20)2007年08月(55)2007年07月(176) 阅读排行 搜索引擎学习资源(作者:dongdonglang)(14656) 做代理网站最有效的4种宣传方法(admin9.com)(12008) 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题)(8067) 程序员的SEO总结(7459) 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(6000) 在一台联想3000G430 T1600笔记本上安装黑苹果(东皇v10.6.3)成功(5948) PowerBuilder DeCompiler(PB DeCompiler) Demo download(PB反编译,支持5-12)(5888) PB11.5,PB12 web项目初探(5638) 文件夹加密原理 [转](5627) powerbuilder反编译器开发-第一步:pbd结构分析和pbkiller分析(5474) 评论排行 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(49) 程序员的SEO总结(32) 有关Powerbuilder的悲观论和乐观论(由郭贴引发的300多贴争辩想到的,也是很久就想秉明的一个观点)(22) Powerbuilder混淆,加密(powerbuilder防止反编译,pb混淆器,PB加壳,支持5-12) obfuscator for PowerBuilder(20) 戏说DataWindow的“移植”和“临摹”(19) 因为垄断形成,数据库市场将出现更多开源数据库(19) 免费软件模式之随想(18) 软件提交到国外的下载站的几点操作和想法(15) PB11.5,PB12 web项目初探(15) 关于对pbd反编译器的期待(11) 推荐文章 最新评论 安装两个BCB6控件SynEdit、mwEdit 0.92a的过程总结 jiduxiaozhang12345: 请问BCB6的第三方控件在哪下载啊?急求 Powershield一个疑似的BUG zhj149: 高手啊,看你的文章,感觉你玩pb已经到了极致的境界了,我自认为pb还不错,和你比起来,还是差了太多了 软件提交到国外的下载站的几点操作和想法 u012353953: 楼主在吗?有个问题请教,看到请加我QQ,谢谢。17493589 Lucene(Nutch)距离商业文本搜索引擎还有多远?(转载) koubi1986: 你好!请教一些问题:请问一下1。你是如何把nutch抓取到的二进制内容,在项目中读取的。2。nutc... 看一个商业共享软件是如何在下载站刷下载量来作弊的! u011506701: 您的判断是有误的,像我研究的刷量算法你就根本看不出来,出现的曲线图跟正常的一模一样的,附:刷量是最好... 垂直搜索引擎蜘蛛的基本解决方案(编程实例:所以推荐) gis101989: 你好,我正在写面向主题搜索引擎结合地理信息的论文,很多地方不懂,能加个扣扣吗?非常感谢你的帮助,我的... 浅谈Powerbuilder的未来和Powerbuilder使用者的未来 hosthelp: PB的最大缺点就是:(其实很简单)过时了。 服装过时就没人穿了, 电器过时就没人买了, 明星过时(过... 三岁小孩开发搜索引擎,搜索引擎白热化[原创] rongzi1987: 顶一个。先顶再看 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题) hua2000: 顶顶更健康正在研究反向工程 有个傻B说破解了我的软件—哈哈!黄金屋手机MP3.MP4.3GP.电影.下载系统 ljx811216: 真有这事,看看 我的未来方向 pconline/asp.net周金桥老师的aspnet 友人Blog 旧博客在sina Bluesen的语音卡开发平台 JackXu的开源语音卡框架 经验丰富的好友:杨光的专栏 蓝星际语音平台,Koodoo语言 Lucene改造者-yuetiantian 西部.阿呆's blog manesking:全文检索c/c fullfocus研究lucene,nutch 黄国酬的博客 把“天轰穿”的asp.net 雨松.安卓