首页
社区
课程
招聘
[讨论]把程序用到的dll文件整合到自身
发表于: 2007-7-19 20:57 10754

[讨论]把程序用到的dll文件整合到自身

2007-7-19 20:57
10754
最近写了个查杀木马的小程序,想给他做个漂亮的皮肤。就用了skin++。选择了一个和鸽子一样的皮肤。做好皮肤后,发现程序多了一个skin++的dll文件--SkinPPWTL.dll。以后用的时候不可能老是带个dll文件。于是我想采用静态链接。设置vc的工程,改成use mfc with a static library.结果发现生成的程序还是离不开那个dll文件。

于是我想起以前有高手说过的方法。用getprocaddress。我需要的函数是
SKINPPWTL_API BOOL skinppLoadSkinFromRes(HINSTANCE hInstance,LPCTSTR szResourceName,                                                                                 LPCTSTR szResourceType,TCHAR* szSkinFileName);
我导出了那个dll文件的函数。

Export, SkinPPWTL.dll
Ordinal        Address        Name
00000005        100075D7        ??0CSkinIniFile@@QAE@ABV0@@Z
00000006        10007945        ??0CSkinIniFile@@QAE@VCString@WTL@@@Z
00000007        1000772A        ??0CSkinIniFile@@QAE@XZ
00000008        100079C6        ??1CSkinIniFile@@UAE@XZ
00000009        1000767E        ??4CSkinIniFile@@QAEAAV0@ABV0@@Z
0000000F        10059934        ??_7CSkinIniFile@@6B@
00000010        10008776        ?DeleteKey@CSkinIniFile@@QAE_NABVCString@WTL@@@Z
00000011        10008723        ?DeleteValue@CSkinIniFile@@QAE_NABVCString@WTL@@0@Z
00000014        100087AB        ?FindKey@CSkinIniFile@@QAEHABVCString@WTL@@@Z
00000016        100087E7        ?FindValue@CSkinIniFile@@QAEHHABVCString@WTL@@@Z
00000017        10008109        ?GetNumKeys@CSkinIniFile@@QAEHXZ
00000019        1000810D        ?GetNumValues@CSkinIniFile@@QAEHVCString@WTL@@@Z
0000001A        100081FB        ?GetValue@CSkinIniFile@@QAE?AVCString@WTL@@ABV23@00@Z
0000001B        10008157        ?GetValue@CSkinIniFile@@QAE?AVCString@WTL@@ABV23@HAAV23@@Z
0000001C        100083D7        ?GetValueF@CSkinIniFile@@QAENABVCString@WTL@@0@Z
0000001D        10008340        ?GetValueI@CSkinIniFile@@QAEHABVCString@WTL@@0H@Z
0000001E        10007A3A        ?ReadFile@CSkinIniFile@@QAE_NABVCString@WTL@@@Z
0000001F        10007CB2        ?ReadFile@CSkinIniFile@@QAE_NPAEH@Z
00000020        10007762        ?ReadProfile@CSkinIniFile@@QAEXABVCString@WTL@@@Z
00000021        100080EC        ?Reset@CSkinIniFile@@QAEXXZ
00000022        10007A2B        ?SetPath@CSkinIniFile@@QAEXABVCString@WTL@@@Z
00000023        10008452        ?SetValue@CSkinIniFile@@QAE_NABVCString@WTL@@000_N@Z
00000028        10008680        ?SetValueF@CSkinIniFile@@QAE_NABVCString@WTL@@0N_N@Z
00000029        100085D5        ?SetValueI@CSkinIniFile@@QAE_NABVCString@WTL@@0HH_N@Z
0000002A        10007F7E        ?WriteFile@CSkinIniFile@@QAEXXZ
0000002B        10008841        ?getline2@CSkinIniFile@@QAEHVCString@WTL@@AAV23@@Z
0000002C        1000897C        ?getline@CSkinIniFile@@QAEAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV23@AAVCString@WTL@@@Z
0000002D        1003342E        ?skinppDrawSkinObject@@YAXPAUHDC__@@UtagRECT@@W4DRAWTYPE@@H@Z
0000002E        1003384E        ?skinppGetBitmapRes@@YAPAUHBITMAP__@@PBD@Z
0000002F        10033854        ?skinppGetBitmapResRect@@YAHPBDAAH111@Z
00000030        10033992        ?skinppGetBitmapSize@@YAXPAUHBITMAP__@@AAH1@Z
00000031        100339BC        ?skinppGetImageListFromID@@YAPAU_IMAGELIST@@H@Z
00000032        1003341A        ?skinppGetMainFrameMenu@@YAPAUHMENU__@@XZ
00000033        10033705        ?skinppGetMultiLangMenu@@YAPAUHMENU__@@XZ
00000034        1003366D        ?skinppGetResFromID@@YAPAUHBITMAP__@@W4SKINOBJTYPE@@HH@Z
00000035        10033A4D        ?skinppGetResFromID@@YAPAXPAU_ResourceInfo@@@Z
00000036        10033851        ?skinppGetSkinResource@@YAPAEPBDAAH@Z
00000037        100335A1        ?skinppLoadLanguageStr@@YAHPBDPADH@Z
00000038        100331E7        ?skinppLoadSkinFromRes@@YAHPAUHINSTANCE__@@PBD1PAD@Z
00000039        100335A4        ?skinppLoadString@@YAHHPADH@Z
0000003A        10033670        ?skinppSetBackgroundDC@@YAXPAUHWND__@@PAUHDC__@@@Z
0000003B        100339DC        ?skinppSetButtonSounds@@YAXPAUHWND__@@PBD1@Z
0000003C        100339DD        ?skinppSetButtonTooltip@@YAXPAUHWND__@@PBD@Z
0000003D        100339C8        ?skinppSetCustomDraw@@YAXPAUHWND__@@H@Z
0000003E        100336BE        ?skinppSetDialogBkClipRgn@@YAXPAUHWND__@@HH@Z
0000003F        100336AA        ?skinppSetDialogEraseBkgnd@@YAXPAUHWND__@@H@Z
00000040        10033404        ?skinppSetDrawMenu@@YAXPAUHMENU__@@H@Z
00000041        10033400        ?skinppSetMenuItemImage@@YAHIPAU_IMAGELIST@@H@Z
00000042        10033A39        ?skinppSetMenuSkinObjectID@@YAXPAUHWND__@@H@Z
00000043        1003383A        ?skinppSetNoDrawText@@YAXPAUHWND__@@H@Z
00000044        1003341D        ?skinppSetSkinOwnerMenu@@YAXH@Z
00000045        100339BF        ?skinppSetStaticFont@@YAHHPBDH@Z
00000046        100339C2        ?skinppSetStaticTextAlign@@YAHHH@Z
00000047        100339C5        ?skinppSetStaticTextColor@@YAHHK@Z
00000048        10033A25        ?skinppSetStatusBarTransparent@@YAXPAUHWND__@@H@Z
00000049        10033680        ?skinppSetTabItemImageID@@YAXPAUHWND__@@HH@Z
00000002        1003303F        skinppExitSkin
0000000B        100334D7        skinppGetDefaultSysColor
00000018        100339B9        skinppGetIconFromRes
0000000A        100334CC        skinppGetSkinSysColor
00000001        1003303B        skinppInitializeSkin
00000003        100330F0        skinppLoadSkin
00000004        1003339D        skinppRemoveSkin
00000027        1003352E        skinppRemoveSkinHwnd
0000000D        10033555        skinppSetFreeDlgID
00000024        10033A0D        skinppSetListBoxItemDrawInfo
00000013        10033620        skinppSetListHeaderCtrlItemID
00000015        1003364A        skinppSetListHeaderSortInfo
00000025        100334E2        skinppSetNoSkinHwnd
00000026        100334F6        skinppSetSkinHwnd
0000000E        1003356C        skinppSetSkinResID
00000012        100335F7        skinppSetTrackPopupMenuID
0000000C        1003353E        skinppSetWindowResID

结果发现我需要的函数
00000038        100331E7        ?skinppLoadSkinFromRes@@YAHPAUHINSTANCE__@@PBD1PAD@Z
竟然是这种形式,但是头文件里声明的是没有问号的。
无论我用
        typedef BOOL (*LoadSkinFromRes)(HINSTANCE,LPCTSTR , LPCTSTR ,TCHAR*);
        LoadSkinFromRes lsfr=(LoadSkinFromRes)GetProcAddress(hModule,"skinppLoadSkinFromRes");
还是没有?
LoadSkinFromRes lsfr=(LoadSkinFromRes)GetProcAddress(hModule,"skinppLoadSkinFromRes");
。结果都得不到skinppLoadSkinFromRes函数的位置。
有高手可以给解答一下吗。
有没有更好的办法可以把那个dll文件给整合到exe文件中去吗?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以考虑用dll2lib把转换成lib文件静态连接进去。
2007-7-19 22:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
它本身有lib文件的,我试过用静态链接。但是不行。仍然提示需要dll文件。
2007-7-19 22:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用没有用过skin++的兄弟,你们是怎么处理的。我看过很多的程序,都是用skin++作的。
2007-7-20 07:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU
5
你这个lib是动态链接的,试试静态链接的lib(如前面一位网友所说的用dll2lib转换一下)
试试吧
2007-7-20 10:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
lib文件也分静态和动态的?我去实验一下。学习了。我以前还真不知道。惭愧。
2007-7-20 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
经过测试,发现用dll2lib转换后还是不行。附上部门代码。

        hModule=LoadLibrary("SkinPPWTL.dll");        
        typedef BOOL (*LoadSkinFromRes)(HINSTANCE,LPCTSTR , LPCTSTR ,TCHAR*);
        LoadSkinFromRes lsfr=(LoadSkinFromRes)GetProcAddress(hModule,"skinppLoadSkinFromRes");

//skinppLoadSkinFromRes(m_hInstance,MAKEINTRESOURCE(IDR_SKIN1),_T("SKIN"),_T("xp_corona.ssk"));
        lsfr(m_hInstance,MAKEINTRESOURCE(IDR_SKIN1),_T("SKIN"),_T("xp_corona.ssk"));
2007-7-20 13:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NIU
8
使用静态链接的库后,就不Loadlibrary了,只要声明一下库中函数原型,之后就可以使用库中的函数了

exten "C" __stdcall BOOL LoadSkinFromRes( HINSTANCE hInst,  LPCSTR  lpTemplateName, LPCSTR ......) ;  // 类似这样声明一下,再连接时包含那个静态链接库

一般这种声明在库的头文件里会有声明(把动态链接库的头文件的内容复制过来再稍改改就可以了)。
2007-7-20 13:33
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可以用专用的exe,dll合并工具,把exe和dll合并后再发布出来。
2007-7-22 21:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
多谢,这位老兄可否提示一下用什么工具。
2007-7-25 08:09
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
 试试这个看: MoleBoxPro.rar
上传的附件:
2007-7-25 12:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我用工具查看了导入表,发现用
#pragma   comment(lib,"ws2_32.lib")
#pragma   comment(lib,"wininet.lib")
#pragma   comment(lib,"SkinPPWTL.lib")
语句之后,在编译成功的exe文件里发现多了三个导入项目。

正是这三个导入表的项目让我即使是动态生成所需要的dll文件也不可以。
导入表用的dll文件在程序开始执行正式代码之前就开始加载行为了。

怎么才可以静态链接,那位大哥能说的明白点吗。具体的操作是怎么样的。
2007-7-25 16:48
0
雪    币: 560
活跃值: (354)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
13
资源:
My_Rc    RCDATA  "dll.dll"

代码:
.data
RcName db "My_Rc",0
Dlllib    db "c:\test.dll",0
BytesWritten db 256 dup(0)

.data?
hRcDLL dd ?
hResDLL  dd ?
hFile dd ?
sizeResDLL dd ?
pResDLL dd ?
hInstance dd ?
hDll   dd ?
hFunc  dd ?
szSaveFileName dd ?

.code
start:

    invoke  FindResource, NULL,addr RcName, RT_RCDATA
    mov     hRcDLL, eax
    invoke  LoadResource, NULL, hRcDLL
    mov     hResDLL, eax
    invoke  CreateFile, ADDR Dlllib, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE, \
            NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
                .if eax==INVALID_HANDLE_VALUE
                        invoke MessageBox,NULL,CTEXT("创建错误"),CTEXT("提示"),MB_OK   
                        ret
                .endif     
    mov     hFile, eax
    invoke  SizeofResource, NULL, hRcDLL
    mov     sizeResDLL, eax
    invoke  LockResource, hResDLL
    mov     pResDLL, eax
    invoke  WriteFile, hFile, pResDLL, sizeResDLL, ADDR BytesWritten, NULL
    invoke  CloseHandle, hFile
    invoke  LoadLibrary, ADDR Dlllib
    mov     hDll, eax                                    
    invoke  GetProcAddress, hDll, CTEXT("_ExpFunc1")     
    mov     hFunc, eax
    call    eax
    invoke  FreeLibrary, hDll
        mov     ecx, 0
@3: inc     ecx
    cmp     ecx, 100
    je      @4
    invoke  DeleteFile, ADDR Dlllib
    cmp     eax, TRUE
    jne     @3
@4:
    invoke ExitProcess,0
   
end start
上传的附件:
2007-7-26 09:07
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
14
呵呵,这个原因是因为导出的函数是c++命名规则的。
如果你要用GetProcAddress获取的话,你可以用denpendices工具看dll得导出函数,把名字直接复制下来。这时调用GetProcAddress就能找到函数。

另外,把dll以资源的方式存放在exe中。
2007-7-26 16:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
dll2bin.exe
2008-1-17 22:22
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
其实你就是想发布时,只发布一个文件,而不必要带多余的DLL文件
其实带几个DLL文件也很正常
你可以把DLL文件作为资源弄到EXE中,使用时再释放出来,这样的结果是EXE将很大
2008-1-18 13:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我写了一个小程序打包EXE和DLL,并用EXE的图标作为自己的图标,然后运行时,把EXE和DLL释放出来,然后再CP一个EXE就OK了。
2008-1-19 18:56
0
游客
登录 | 注册 方可回帖
返回
//