| ²é¿´: 282 | »Ø¸´: 0 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
sdlj8051½ð³æ (ÖøÃûдÊÖ)
|
[½»Á÷]
[תÌù]DLLÊä³öÀàʹÓÃÑо¿ÊÖ¼Ç
|
||
|
ÔÚдһ¸ö³ÌÐòʱ£¬ÎÒÏëʹÓÃÒ»¸ö¹²ÏíÈí¼þÖеÄC++Àà¡£¸ÃÀàÃûΪCrypt£¬·â×°ÔÚÒ»¸öDLLÖУ¬ÎļþÃûΪCrypt.dll¡£Í¨¹ýSoftIceºÍIDA Pro£¬ÎÒÒÑ»ù±¾ÅªÇåÁËÆä³ÉÔ±º¯ÊýµÄÓ÷¨¡£ÏÖÔÚµÄÎÊÌâÊÇ£¬Ã»ÓÐÏàÓ¦µÄ.HÎļþ¼°.LIBÎļþ£¨µ±È»¸üûÓÐÔ´Â룩¡£ÁíÍ⣬Æä³ÉÔ±º¯ÊýÏÔÈ»²»ÄÜÒÔGetProcAddressÈ¡µÃµØÖ·ºóÖ±½Óµ÷Óᣠ¸ÃÈí¼þÊÇÓÃBorland C++дµÄ¡£ ÏÈÓÃBorland C++ÌṩµÄ¹¤¾ß»ñÈ¡±ØÒªµÄÎļþ C:\bc5\bin\impdef Crypt.def Crypt.dll//µÃµ½Crypt.defÎļþ C:\bc5\bin\implib Crypt.lib Crypt.dll//µÃµ½Crypt.libÎļþ Crypt.defÖеÄÏà¹ØÄÚÈÝÈçÏ£º @Crypt@$bctr$qpxc@1; Crypt::Crypt(const char*) @Crypt@$bctr$qpxuci@2; Crypt::Crypt(const unsigned char*,int) @Crypt@DecodeFrom$qpuct1l¡¡@3; Crypt: ecodeFrom(unsigned char*,unsigned ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡char*,long) @Crypt@EncodeTo$qpuct1l¡¡@4; Crypt::EncodeTo(unsigned char*,unsigned ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡char*,long) ´Ó·ÖºÅºóµÄ×¢ÊÍ£¬¿ÉÒԵõ½DemangledºóµÄ³ÉÔ±º¯ÊýÔÐÍ£¬µ«ÊÇûÓÐÀàµÄ¶¨Ò壬ÎÒÃDz»ÖªµÀÕâ¸öÀà°üº¬Ê²Ã´Êý¾Ý³ÉÔ±(ÒÔ¼°±ðµÄδexportedµÄ³ÉÔ±º¯Êý£¬ÕâÒ»µã²»ÖØÒª£¬ÒòΪÔÀ´µÄ±à³ÌÕßÔÚʹÓÃÕâ¸ö·â×°ÔÚDLLÖеÄÀàʱ£¬Ò²Ö»ÄÜʹÓÃexportedµÄº¯Êý)¡£ÈçºÎ¹¹ÔìÒ»¸öÕýÈ·µÄÍ·Îļþ£¿ÏÈÀ´¿´¿´ÔÀ´µÄ´úÂëÊÇÈçºÎʹÓÃÕâ¸öÀàµÄ¡£ÒÔÏÂΪIDA ProµÄÊä³ö£º 00453E3E 0F0push 8 00453E40 0F4lea eax, [ebp+var_8] 00453E43 0F4push eax 00453E44 0F8lea ecx, [ebp+var_E0] 00453E4A 0F8push ecx 00453E4B 0FCcall Crypt::Crypt(uchar *,int) 00453E50 0FCadd esp, 0Ch Õâ¶Î´úÂëµ÷ÓÃCrypt::Crypt(uchar *,int)³ÉÔ±º¯Êý£¬Ê¹ÓÃ__cdeclµ÷ÓùæÔò£¬Óɵ÷ÓÃÕßά»¤¶ÑÕ»¡£º¯ÊýÓÐ2¸ö²ÎÊý£¬Ïò¶ÑÕ»ÖÐѹÈëÁË3¸öÖµ£¬×îºóÒ»¸öpushÈëÕ»µÄÊÇÖ¸Ïòµ±Ç°Crypt¶ÔÏóµÄthisÖ¸Õ룬¼´±äÁ¿var_E0¾ÍÊÇÔÚÕ»ÉÏ·ÖÅäµÄCryptÀà¶ÔÏó¡£´ÓIDA ProÖпɿ´µ½£¬var_E0¸²¸ÇÁË´ÓFFFFFF20µ½FFFFFF80¹²96×ֽڵĿռ䡣ÎÒÃÇÖªµÀ£¬C++ÀàµÄ³ÉÔ±º¯Êý¡¢¾²Ì¬Êý¾Ý³ÉÔ±ÊDz»·ÅÔÚ¶ÔÏóÄڵ쬶ÔÏóÖ»º¬ÓÐÊý¾Ý³ÉÔ±£¨ÈôÀàÖлòÆä»ùÀàÖж¨ÒåÓÐÐ麯Êý£¬»¹°üº¬vptr£©¡£Ò²¾ÍÊÇ˵£¬CryptÀàµÄËùÓÐÊý¾Ý³ÉÔ±¹²Õ¼¾Ý96×Ö½Ú¡£¾ßÌåϸ½ÚÇë²ÎÕÕStanley LippmanµÄ¡¶Éî¶È̽Ë÷C++¶ÔÏóÄ£ÐÍ¡·¡£ ÓÉ´Ë£¬ÎÒÃÇ¿ÉÒÔ×Ô¼º¶¨ÒåCryptÀàµÄÊý¾Ý³ÉÔ±£¨Ê¹ÓÃ×Ö½ÚÊý×飩£¬Ê¹ÆäÕ¼¾ÝͬÑùµÄÄÚ´æ¿Õ¼ä£¬ÓëÔÀ´µÄÀàÔÚÄÚ´æ²¼¾ÖÉÏÒ»Ö¼´¿É¡£Êµ¼ÊÉÏ£¬Ö»ÒªÎÒÃǸø³öµÄÀඨÒå±£Ö¤ÄÜ·ÖÅä×ã¹»µÄÄÚ´æ¿Õ¼ä£¬ÔÀ´µÄ¹¹Ô캯Êý¾Í¿ÉÒÔÔÚ·ÖÅäµÄÄÚ´æÖд´½¨³öÕýÈ·µÄ¶ÔÏó¡£ÕâÖÖ·½·¨ÓëCOMµÄ˼ÏëÓÐÏàËÆÖ®´¦£¬¶¼ÊÇÔÚ¶þ½øÖƵļ¶±ðÉϱ£Ö¤ÄÚ´æ²¼¾ÖµÄ¼æÈÝ¡£ÎÒдµÄÍ·ÎļþÈçÏ£º class _import Crypt { public: ¡¡¡¡Crypt(const char* lpszPassword); ¡¡¡¡Crypt(const unsigned char* lpszPassword,int cbBuffer); ¡¡¡¡EncodeTo(unsigned char* lpSource,unsigned char* lpDestination,int nSize); ¡¡¡¡DecodeFrom(unsigned char* lpSource,unsigned char* lpDestination,int nSize); public: ¡¡¡¡char dummy[96]; //Bingo!:-) }; ½«´ËÍ·Îļþ¼°Ç°ÃæµÄCrypt.libÎļþ¼ÓÈëÏîÄ¿£¬Ö¤Ã÷´Ë·½·¨ÊÇ¿ÉÐеġ£²âÊÔ´úÂëÈçÏ£º ¡¡Crypt obj("123456" ;¡¡obj.EncodeTo(lpData,lpData,nSize); ÒÔÉϵij¢ÊÔ¶¼ÊÇÔÚBorland C++ÏÂ×öµÄ£¬ÓëÔÀ´µÄ³ÌÐò¾ßÓÐͬÑùµÄ»·¾³£¬Èç¹ûÏëÔÚVisual C++ÏÂʹÓøÃÀàÓÖÈçºÎʵÏÖ£¿´ÓDLLÖÐÊä³öÀàµÄ¼¼Êõϸ½ÚÊÇÒò±àÒëÆ÷³§É̶øÒìµÄ£¬ÏÔÈ»²»ÄÜÔÙÈç·¨ÅÚÖÆ£¨VC++ÉõÖÁ²»ÄÜʶ±ðÓÃimplibÉú³ÉµÄCrypt.libÎļþ£©¡£ÎÒÃÇ¿ÉÒÔ±äͨһÏ£¬×Ô¼ºÓÃVC++дһ¸öCrypt.dll,°ü¹üÔÚÔÀ´µÄDLLÍâÃæ£¬Êä³öÓëÔÓÐDLLÏàͬÃû×ÖºÍÐòºÅµÄº¯Êý£¬ÓÃVC++дµÄ¿Í»§³ÌÐòʹÓÃÕâ¸öWrapper DLL£¬ÓÉÆäÔÙÈ¥µ÷ÓÃÔÀ´µÄDLL¡£ÕâÖÖ±àдһ¸ö°üÔÚÔÓÐDLLÍâÃæµÄ¶¯Ì¬Á´½Ó¿âµÄ·½·¨£¬Ïà¹Ø×ÊÁϺܶ࣬ÕâÀï²»ÔÙÏêϸ½âÊÍ¡£ ½«ÔÀ´µÄDLL¸ÄÃûΪOldDll.dll¡£Ô´´úÂëÈçÏ£º Í·ÎļþCrypt.h£º #ifdef CRYPT_EXPORTS #define CRYPT_API __declspec(dllexport) #else #define CRYPT_API __declspec(dllimport) #endif class CRYPT_API Crypt { public: ¡¡Crypt& operator=(const Encrypt& rhs);//¸³ÖµÔËËã·û£¬½ûÖ¹ ¡¡Crypt(const Encrypt& rhs);//¿½±´¹¹Ô캯Êý£¬½ûÖ¹ public: ¡¡Crypt(const char* lpszPassword); ¡¡Crypt(const unsigned char* lpszPassword,int cbBuffer); ¡¡void __cdecl EncodeTo(unsigned char* lpSource,unsigned char* ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lpDestination,int nSize); ¡¡void __cdecl DecodeFrom(unsigned char* lpSource,unsigned char* ¡¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lpDestination,int nSize); public: char dummy[96]; //Bingo!:-) }; ʵÏÖÎļþCrypt.cpp£º #include "stdafx.h" #include "Crypt.h" static HINSTANCE hOldDll=NULL; static DWORD dwRet; static DWORD dwRetAddr; static FARPROC lpCrypt1;//´ø1¸ö²ÎÊýµÄ¹¹Ô캯Êý static FARPROC lpCrypt2;//´ø2¸ö²ÎÊýµÄ¹¹Ô캯Êý static FARPROC lpEncodeTo; static FARPROC lpDecodeFrom; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { ¡¡BOOL bRet=false; ¡¡switch (ul_reason_for_call) ¡¡{ ¡¡¡¡case DLL_PROCESS_ATTACH: ¡¡¡¡¡¡¡¡//¼ÓÔØÔÀ´µÄDLL£¬»ñȡԺ¯ÊýµØÖ· ¡¡¡¡¡¡¡¡hOldDll=LoadLibrary("c:\\test\\OldDll.dll" ;¡¡¡¡¡¡¡¡if(hOldDll) ¡¡¡¡¡¡¡¡{ ¡¡¡¡¡¡¡¡¡¡¡¡lpCrypt1=::GetProcAddress(hOldDll,MAKEINTRESOURCE(0x1)); ¡¡¡¡¡¡¡¡¡¡¡¡lpCrypt2=::GetProcAddress(hOldDll,MAKEINTRESOURCE(0x2)); ¡¡¡¡¡¡¡¡¡¡¡¡lpEncodetTo=::GetProcAddress(hOldDll,MAKEINTRESOURCE(0x3)); ¡¡¡¡¡¡¡¡¡¡¡¡lpDecodeFrom=::GetProcAddress(hOldDll,MAKEINTRESOURCE(0x4)); ¡¡¡¡¡¡¡¡¡¡¡¡bRet=true; ¡¡¡¡¡¡¡¡} ¡¡¡¡¡¡¡¡break; ¡¡¡¡¡¡case DLL_THREAD_ATTACH: ¡¡¡¡¡¡¡¡break; ¡¡¡¡¡¡case DLL_THREAD_DETACH: ¡¡¡¡¡¡¡¡break; ¡¡¡¡¡¡case DLL_PROCESS_DETACH: ¡¡¡¡¡¡¡¡if(hOldDll) ¡¡¡¡¡¡¡¡{ ¡¡¡¡¡¡¡¡¡¡::FreeLibrary(hOldDll); ¡¡¡¡¡¡¡¡} ¡¡¡¡¡¡¡¡break; ¡¡¡¡} ¡¡¡¡return bRet; } __declspec(naked) Crypt::Crypt(const char *lpszPassword) { ¡¡¡¡//ÊÖ¹¤Ä£·Â__cdelµ÷ÓùæÔò ¡¡¡¡_asm ¡¡¡¡{ ¡¡¡¡¡¡¡¡pop eax//µ¯³ö²¢±£´æ·µ»ØµØÖ· ¡¡¡¡¡¡¡¡mov dwRetAddr,eax ¡¡¡¡¡¡¡¡push ecx//ѹthisÖ¸ÕëÈëÕ» ¡¡¡¡¡¡¡¡call lpCrypt1¡¡//µ÷ÓÃÔº¯Êý ¡¡¡¡¡¡¡¡mov dwRet,eax¡¡//±£´æµ÷Ó÷µ»ØÖµ ¡¡¡¡¡¡¡¡mov eax,dwRetAddr ¡¡¡¡¡¡¡¡push eax//ÖØÐÂѹ·µ»ØµØÖ·ÈëÕ» ¡¡¡¡¡¡¡¡mov eax,dwRet¡¡//»Ö¸´µ÷Ó÷µ»ØÖµ ¡¡¡¡¡¡¡¡ret 8¡¡//·µ»Ø£¬¶ªÆú2¸ödword(²ÎÊýºÍthisÖ¸Õë) ¡¡¡¡} } __declspec(naked) Crypt::Crypt(const unsigned char* lpszPassword,int cbBuffer) { ¡¡¡¡//ÊÖ¹¤Ä£·Â__cdelµ÷ÓùæÔò ¡¡¡¡_asm ¡¡¡¡{ ¡¡¡¡¡¡¡¡pop eax ¡¡¡¡¡¡¡¡mov dwRetAddr,eax ¡¡¡¡¡¡¡¡push ecx ¡¡¡¡¡¡¡¡call lpCrypt2 ¡¡¡¡¡¡¡¡mov dwRet,eax ¡¡¡¡¡¡¡¡mov eax,dwRetAddr ¡¡¡¡¡¡¡¡push eax ¡¡¡¡¡¡¡¡mov eax,dwRet ¡¡¡¡¡¡¡¡ret 0xC¡¡¡¡¡¡¡¡//¶ªÆú3¸ödword ¡¡¡¡} } void __declspec(naked) __cdecl Crypt::EncodeTo(unsigned char* lpSource, unsigned char* lpDestination,int nSize) { ¡¡¡¡//Ö±½ÓÌø×ªµ½Ôº¯Êý ¡¡¡¡_asm jmp far dword ptr lpEncodeTo } void __declspec(naked) __cdecl Crypt: ecodeFrom(unsigned char* lpSource,unsigned char* lpDestination,int nSize) { ¡¡¡¡//Ö±½ÓÌø×ªµ½Ôº¯Êý ¡¡¡¡_asm jmp far dword ptr lpDecodeFrom } Óм¸´¦ÐèҪעÒ⣺Ê×ÏÈ£¬ÕâÀïʹÓÃÁËnakedµ÷ÓùæÔò£¨Borland C++²»Ö§³Ö£©£¬ÒÔ±ãÓÚÖ±½Ó²Ù×÷¶ÑÕ»¼°ÓÃÄÚǶµÄ»ã±àÓïÑÔ±à³Ì¡£ÁíÍ⣬ËäÈ»ÎÒÃǵÄÀàÖв¢Ã»Óаüº¬Ð麯Êý»ò¶ÔÏó³ÉÔ±£¬VC++±àÒëÆ÷È´ÈÔÉú³ÉÁËmember-wiseµÄ¿½±´¹¹Ô캯ÊýºÍbit-wise¸³ÖµÔËËã·û£¬²¢µ¼ÖÂÔÀ´µÄDLLÖеĹ¹Ô캯Êý²»ÄÜÕýÈ·´´½¨¶ÔÏó¡£ÎªÁ˽ûÖ¹±àÒëÆ÷×Ô¶¯Éú³É²»±ØÒªµÄ´úÂ룬ÔÚÍ·ÎļþÖж¨ÒåÁ˸³ÖµÔËËã·ûºÍ¿½±´¹¹Ô캯Êý£¬µ«²¢Î´ÌṩʵÏÖ¡£Á½¸ö¹¹Ô캯ÊýÓеãÌØÊ⣬ÎÒ·¢ÏÖÎÞÂÛÖ¸¶¨ºÎÖÖµ÷ÓùæÔò£¬Éú³ÉµÄ´úÂë×ÜÊÇʹÓÃthiscallµ÷ÓùæÔò£¬¼´ÔÚecx¼Ä´æÆ÷Öд«µÝthisÖ¸Õ룬Ϊ´Ë¹¹Ô캯ÊýÐèÒªÌØÊâ´¦Àí£¬Óûã±à´úÂëÊÖ¹¤Ä£·Â__cdeclµ÷ÓùæÔòÈ¥µ÷ÓÃÔÀ´DLLÖеĺ¯Êý£¬°üÀ¨Î¬»¤Õ»Ö¸Õë¡£ ÆäÓàµÄ´úÂëÒÑ×÷ÁË×¢ÊÍ£¬Ò×ÓÚÀí½â£¬²»ÔÙ׸Êö¡£ [ Last edited by sdlj8051 on 2006-10-6 at 12:35 ] |
» ²ÂÄãϲ»¶
É격26Äê
ÒѾÓÐ4È˻ظ´
307Çóµ÷¼Á
ÒѾÓÐ5È˻ظ´
Ò»Ö¾Ô¸C9²ÄÁÏÓ뻯¹¤×¨Òµ×Ü·Ö300Çóµ÷¼Á
ÒѾÓÐ5È˻ظ´
274Çóµ÷¼Á
ÒѾÓÐ3È˻ظ´
299Çóµ÷¼Á
ÒѾÓÐ7È˻ظ´
0703»¯Ñ§µ÷¼Á£¬Çóµ¼Ê¦ÊÕ
ÒѾÓÐ4È˻ظ´
300Çóµ÷¼Á£¬²ÄÁÏ¿ÆÑ§Ó¢Ò»Êý¶þ
ÒѾÓÐ3È˻ظ´
²ÄÁÏѧ˶£¬Çóµ÷¼Á
ÒѾÓÐ6È˻ظ´
307Çóµ÷¼Á
ÒѾÓÐ6È˻ظ´
²ÄÁÏר˶331Çóµ÷¼Á
ÒѾÓÐ3È˻ظ´













ecodeFrom(unsigned char*,unsigned
;
»Ø¸´´ËÂ¥