首页
社区
课程
招聘
[原创]Delphi之萝莉调教篇
发表于: 2008-2-13 11:26 23784

[原创]Delphi之萝莉调教篇

2008-2-13 11:26
23784

本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧

关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了
只是觉得太无聊~估计大家也都会于是就没有写~既然群里有人提出~就留下一份记录
以前我很傻很天真.主要原因是也因为很懒.
正值新春之际全当写出来给各位献礼了.给大家拜个晚年
由于本文作者水平问题,有说的不对或者不明确的地方请大家海涵.菜鸟之作高手跳过...

Q:为啥不用Delphi?
A:体积太大
Q:为啥用Delphi?
A:很方便

体积问题一直都是Delphi Programer头痛的问题...
我也幻想过有一天用Delphi像VC一样的写出迷你小程序...

直到某一天我发现许多萝莉控都在调教萝莉...于是我突发奇想我也来调教一个萝莉吧
目标Delphi~御姐变萝莉...

关于这篇文章打算分为两个部分描述...
1.萝莉自身的调教(关于核心库的修改.导入表的迷你化)
2.外界的调教力量(Delphi编译...MASM link)

开始说说如何调教Delphi(萝莉)吧...

0.VCL的力量
1.KOL的力量
2.自修改核心库
3.导入表的优化
4.进一步优化

[0].VCL的力量...
关于VCL不多说了...其实在迷你化程序中
VCL基本上都不会使用.
这里我说的VCL不是说窗体VCL...例如SysUtils,Classes等单元也都是属于VCL部分
system,sysinit也是属于吧?我也不太清楚,这两个单元是Delphi默认加载的...
想取消不编译到工程中...不在本章讨论范围中

给各位的建议是...除了system,sysinit以外的Delphi自带VCL单元都不要使用...
system中其实已经有许多函数了...
由于这两个单元是默认的所以想不用也没办法...

program Project1;

uses
  Windows;

begin
  MessageBox(0, 'Hello World!', 'By Anskya', 0);
end.
unknown_libname_13 proc near

cbData= dword ptr -0Ch
Data= byte ptr -8
hKey= dword ptr -4

push    ebp
mov     ebp, esp
add     esp, 0FFFFFFF4h
movzx   eax, ds:word_40400C
mov     dword ptr [ebp+Data], eax
lea     eax, [ebp+hKey]
push    eax             ; phkResult
push    1               ; samDesired
push    0               ; ulOptions
push    offset SubKey   ; "SOFTWARE\\Borland\\Delphi\\RTL"
push    80000002h       ; hKey
call    RegOpenKeyExA
test    eax, eax
jnz     short loc_402A84
.
.
.
unit SysInit;

interface

var
  TlsIndex: Integer;
  TlsLast : Byte;
  PtrToNil: Pointer;

var
  HInstance: Pointer;
  GetCommandLine: PAnsiChar;

procedure _InitExe;

implementation

procedure _InitExe; assembler;
asm
        mov     eax, [ebp+$08]
        mov     [HInstance], eax
        mov     eax, [ebp+$10]
        mov     [GetCommandLine], eax
end;

end.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
2
不好意思少上传一个附件
上传的附件:
2008-2-13 11:28
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
呵呵,不错,期待你的下篇。
2008-2-13 11:57
0
雪    币: 267
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
汗一下标题。。。
2008-2-13 12:03
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
5
的确不错!支持!
2008-2-13 12:05
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
6
很好很强大的 支持1个
2008-2-13 12:07
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
7
对了关于导入表方面如果防止重复的话
可以直接使用
System.GetModuleHandleA(nil)
这样就不会产生新的导入表了。。。秘籍秘籍~如果想大乱导入表也可以自己新建单元
进行导入。。混乱导入表的猥琐流
2008-2-13 12:10
0
雪    币: 200
活跃值: (230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错! 现在用 delphi 写的木马满天飞啊 ...
2008-2-13 12:21
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
9
上篇只是简单的说了一下Delphi迷你化程序的初级优化
这篇主要是说如何进行外部改变Delphi架构...

现在Delphi编译器本身已经优化的暂时到顶了.我们来看看
下面影响我们继续迷你化的是什么问题...
1.数据段和代码段的融合,还有没用的bss等等段
完全可以融合到一起
2.文件对齐,还有DOS Stub

在VC下我们可以很容易解决这个问题.谁让Borland的编译器技术很好,连接器技术确
。。。算了这个不是在我们考虑范围以内

我们来解决以上两个问题。
如果要解决这两个问题就要追忆。。。Delphi的发展史了。。。
(BTW:看来这丫~是彻底秀逗了...)

Delphi的编译器是Anders一手调教出来的...(我也不知道说什么好)
据说在Delphi老版本的时候是可以生成COFF格式的,关于这个问题
有一个彻底的项目...Ms-Rem大牛以前彻底研究过这个东西
还扔出一个演示品...由于当时的疏忽没有发现他使用的是Delphi3进行编译的
[见附件1]

由于Delphi3的特殊性造就了这个很奇怪的东西...兼容COFF的OMF???不明白
masm的link(polink)可以对其进行实施link操作
unit HelloWorld;

interface

Procedure Start;

implementation

function MessageBoxA(hWnd: cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;
 stdcall; external 'user32.dll' name '_MessageBoxA@16';

Procedure Start;
begin
  MessageBoxA(0, 'Hello world!', nil, 0);
end;

end.

由于Delphi使用的是OMF结构...Delphi本身默认是产生dcu文件的
obj文件需要重新设置一下...看代码即可知道...
MASM中的默认库函数到处头部都是采用_MessageBoxA@16这样的结构
@16这个是传递参数的大小---SizeOf(DWORD) * 4
Win32下指针其实也是DWORD~不是吗?呵呵

根据这个obj进行一下连接操作
dcc32.exe -jP -$A-,B-,C-,D-,G-,H-,I-,J-,L-,M-,O+,P-,Q-,R-,T-,U-,V-,W+,X+,Y- HelloWorld.pas

link.exe /ALIGN:32 /FORCE:UNRESOLVED /SUBSYSTEM:WINDOWS /ENTRY:Start$qqrv HelloWorld.obj user32.lib /out:Hello.exe

/ALIGN:32 (这里最好修改为0x200)
/FORCE:UNRESOLVED(强制输出)

请使用delphi3进行编译...这里提供一个开发包...
[见附件2]
包括代码演示...请大家自行研究...

关于入口点/ENTRY:Start$qqrv
为什么采用pas而不是dpr,主要原因是因为..dpr的入口点是锁死的
就是@InitEXE...由于是不导出的所以没办法使用...

所以采用pas.那不是每次写代码都非常郁闷,还有Delphi3的优化
为了解决这两个问题,所以重新改变一下

masm 7.0的link具有重新创建obj的功能
这里使用这个方法...
Delphi 7依然可以创建。做一个通用工程来玩玩
总是用批处理不好讲究点实际开发。。来新建一个工程吧

[见附件2]
program Project1;

uses
  Unit_Main;

begin
  _entry();
end.

unit Unit_Main;

interface

function MessageBoxA(hWnd: cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer; stdcall; external 'user32.dll' name '_MessageBoxA@16';

procedure _entry();

implementation

procedure _entry();
begin
  MessageBoxA(0, 'Hello World!', 'By Anskya', 0);
end;

end.

剩下的完全API就可以了(小心使用ZeroMemory,FillMemory,CopyMemory这三个函数,
Delphi为了编码效率把这两个函数给内嵌了...切忌切忌实在需要咱自己写,
要不然就自己GetProcAddress...).自己写函数声明吧...
_entry();这个名称是因为连接器把你输入入口函数名称加上_
不知道为啥这个习惯...

工程设置需要重新设置一下(Delphi默认是不会生成obj的)

Project Options->link
选择生成C++ object Files,Export All symbols
就可以生成我们需要的obj了...

为了减去不必要的转换麻烦,这里使用mickeylan 大侠为我们准备的rmcoff
为了减少大家的麻烦.发现这个简单的东西就没必要自己去写批处理了.吼吼
批处理代码如下(基本上是死代码..写好一次以后的随机修改就好了)
..\rmcoff\rmcoff.exe Unit_Main.obj Unit_Main.obj

..\small\link.exe /ALIGN:0x200 /SUBSYSTEM:windows /ENTRY:entry Unit_Main.obj ..\lib\user32.lib /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:_EXIT_=.text /MERGE:_INIT_=.text /SECTION:.text,RWEX /ignore:4033,4078,4108 /out:Hello.exe
pause

link编译说明:
这里的user32.lib链接库不是masm32\lib下的
这个链接库是重新创建的:
LINK -LIB -MACHINE:IX86 -DEF:KERNEL32.DEF

具体可以参考以前我写的文章<<浅谈连接库函数的声明与创建>>
http://bbs.pediy.com/showthread.php?t=25555

这里编译是完全没问题了(看...附件中的样式代码)
Delphi 7 编译 MASM Link

如果你觉得体积还是不够小请调整:/ALIGN:0x200,可以修改为4
那编译出来的效果就是传说中的680字节了~不过为了兼容Win9x,最好不要修改

好了至此~小萝莉已经被我们调教的差不多了...下面你还想干什么???

//====================

哦我知道了~你们是说这样写代码太痛苦了是吧...的确每个函数都要声明...
后才可以使用...再次教大家一个秘籍吧...
Borland Format For COFF...吼吼~
意思就是说创建一个Borland格式的到处头部的COFF格式LIB
听起来有点怪异哦~就是取消掉_,@16等特征的纯正COFF LIB...

使用大牛Vortex的工具...来创建我们需要的LIB格式
def2lib user32.def -nod

user32.def
LIBRARY user32
EXPORTS
"MessageBoxA"

你可以自己写一个遍历导出表的程序来自动生成这个文件...

修改代码如下
unit Unit_Main;

interface

uses
  Windows;

procedure _entry();

implementation

procedure _entry();
begin
  MessageBox(0, 'Hello World!', 'By Anskya', 0);
  ExitProcess(0);
end;

end.

批处理代码
..\rmcoff\rmcoff.exe Unit_Main.obj Unit_Main.obj

..\small\link.exe /ALIGN:0x200 /SUBSYSTEM:windows /ENTRY:entry Unit_Main.obj ..\def2lib\kernel32.lib ..\def2lib\user32.lib /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:_EXIT_=.text /MERGE:_INIT_=.text /SECTION:.text,RWEX /ignore:4033,4078,4108 /out:Project2.exe
pause


这样就可以直接引用Windows.pas了~~以后再也不需要自己声明头部了...感谢Vortex
赐予我们这麽好的一个工具...感谢...

如果是多个单元的编译的话
请在批处理中增加你要处理的obj...

此次调教活动得以顺利展开感谢以下大牛们:
Anders,EliCZ,Vortex,Ms-Rem,mickeylan
再次感谢大家顺利看完这篇文章所有工具和代码实例都在附件中请大家自行查看

谢谢大家...祝大家春节愉快,合家欢乐
上传的附件:
2008-2-13 13:20
0
雪    币: 260
活跃值: (102)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
之前我有点鄙视delphi,后来又觉得很多时候写个小工具就是要快,要快,要方便,这样Delphi和VB都是相当不错的选择啊,脚本也可以。
2008-2-13 13:40
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
为了论坛比较好管理贴子,将兄弟的两个主题贴合并了。
2008-2-13 13:52
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
Anders 被微软高新挖走了,开发了vj++,后来演化出了.net ....之后Chuck,Danny修改了delphi 编译器和RTL,borland的另两个个牛人..
还有一个小错误..就是那本<delphi源代码分析> 是周爱民写的,不是潘爱民..
2008-2-13 14:39
0
雪    币: 9793
活跃值: (2186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
写得非常不错呀,文采飞扬!拜读了!
2008-2-13 19:54
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
女王~~~我爱死你了~~~
前几天还问你如何使DELPHI写的程序更小来着~~
2008-2-13 21:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
很精辟,支持一下
2008-2-13 21:58
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
拜读了 。。。。
2008-2-18 00:55
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
啥子叫梦丽调教
2008-2-18 12:23
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
王妹看看我的LOGO 多好看  

哎 还是VC加参数方便 减到1K方便 再小就无能为力了
2008-2-18 16:53
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错,算是Delphi Fans的福气了
不过确实很不实用,毕竟现在开发大型软件都需要组件或许多函数之类的..
楼主的挑战是可嘉的.
2008-2-20 02:57
0
雪    币: 205
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很好,支持一下,我在写小程序的时候经常用KOL配合windows SDK来写,生成的文件很少很方便。
2008-2-20 19:55
0
雪    币: 179
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那位大侠打包发下。。找啦很久都没有找到rmcoff.exe
2008-6-5 01:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了,支持
2008-6-6 19:31
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错啊哥们。。怎么最近消失了。。。。。。
2009-5-20 12:51
0
雪    币: 205
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
的确不错,有深度,以前只用过KOL ,如今才知道还可以更小。
2009-5-21 21:16
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我是冲着标题进来的,支持一个。
2009-5-22 14:01
0
游客
登录 | 注册 方可回帖
返回
//