Embed a resource to a static library (nothing is impossible)

I needed to embed a resource (icon) to a static library so we can deploy just the .lib and .h files with no need to include any graphics or .rc files.

I wanted my static library to be used by any application including such that don’t have any graphic user interface, i.e. Console applications, etc.

I posted a question in Stack Overflow and Code Project and the responses were: That’s not possible…

Here is the question I have posted:

Is there a way to embed resources (such as icons, dialogs) in a c++ (Win32 API) static library? My purpose is to embed an icon in the static library in a way that functions that use LoadIcon will work as if it was a normal .exe so the main application can only link to the static library and include a header file, with no requirement to add other files such as .rc files, or .ico files, etc. Clearly the main application who uses the static library doesn’t have this resource so LoadIcon will fail, however I was wondering if there is a workaround to make it work. A static array with the icon data can work as long as the standard API calls (such as LoadIcon) will work.

To explain further, the person who will be using the static library will only have 2 files: .lib and .h and will not have any .rc file


Comments that followed:

“It is not possible, you can stop looking. Consider a DLL project instead.

At Code Project I was pointed to the following Stack Overflow thread:

” I read them but we wish to deploy 2 files: .lib and .h. These solutions require deploying the .rc file and having whoever uses our static library to link / include it as well.”
“Then there is no solution from my point of view.
The SO thread covers it all.”

Here is the solution I have found after some research I found a way. Using my method, an icon can be used as an integral part of a static library and such library can be used by any type of application, including a console one (which doesn’t have any resource segment whatsoever).

1. Icon is converted to a static array of BYTE. bin2c can be used for that.

2. Data is converted into a HICON handle. Here is how I have done that:

HICON GetIcon()
   DWORD dwTmp;
   int offset;
   HANDLE hFile;
   HICON hIcon = NULL;
   offset = LookupIconIdFromDirectoryEx(s_byIconData, TRUE, 0, 0, LR_DEFAULTCOLOR);
   if (offset != 0)
      hIcon = CreateIconFromResourceEx(s_byIconData + offset, 0, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
   return hIcon;  
3. GetIcon is used instead of LoadIcon.
Instead of calling:

I call

m_hIcon = GetIcon()

To test it, I created a Console application and a new static library. I added to the static library the XMessageBox class which allows using a custom icon.
The Console application just calls a function located at the static library and the icon is displayed!

See also:

Flawless Integration with PayPal

We have recently added a unique feature to Wizdome: payment processing embedded in your program using just few lines of source code.

Wizdome has a built-in payment processing engine which allows you to accept payments from any credit card holder (regardless of being a PayPal customer) and pay for unlocking your software or for specific features. As part of Datattoo Recovery, one of our other products, the customer can pay per each MB of successfully restored data.

To process payments you need to choose 2 routes:

  1. Apply as a PayPal developers and obtain your own PayPal credentials
  2. Use Wizdome credentials and receive all payments from Secured Globe, Inc.

Technically, the SG_PayPal API is used as described below. Following, your program can continue as before, while Wizdome will continue monitor the status of each payment initiated and in the event of a successful payment to a Pending Transaction, the credit (“max” value) of the associated Restriction, will be updated accordingly, so if your program checks the allowed maximum value per each per-defined Restriction, the value will become higher and your software can give additional access flawlessly.

Void InitPayPal(BOOL Sandbox, LPTSTR User, LPTSTR password, LPTSTR signature, LPTSTR successUrl, LPTSTR failedURL)

Sandbox – indicates whether you are testing your integration using PayPal's Sandbox account, or going live.

User – your PayPal user name

Password – your PayPal password

Signature – you PayPal signature

successUrl – a url leading to a web page which you wish to be shown after successful payment.

failedURL – a url leading to a web page which you wish to be shown after failed / cancalled payment.

Initiating a payment

When you wish to initiate a payment, you call

BOOL InitiatePaypalPayment(int nUnits, int PricePerUnit, LPWSTR UnitName, LPWSTR RestrictionName)

nUnits (integer) - number of unique needed to be purchased

PricePerUnit (integer) - cost per each unit (in default currency).

UnitName (string) - the name of the unit to be purchased

RestrictionName (string) - optional - the name of any restriction tied to this transaction

For example: if you would like a data recovery software to allow recovery of 15 MB for the price of $15, and provided that a Restriction named “MB_RESTRICTION” was defined, you call this function using the following parameters:



By default the currency used for transactions is USD, however that can be changed.

Tying a transaction to a Restriction

Wizdome allows you to tie a transaction (payment) to a Restriction. When you do so, the user will be able to lift or change a Restriction by making a payment and without having to switch versions, restart your program or restart any work done by your end-users.



מניעת העתקת תוכנה באופן בלתי חוקי

בין יצרני התוכנה ופורצי התוכנה מתנהלת מלחמה ארוכת שנים ואינסופית. כל יצרן תוכנה רוצה באופן טבעי להגן על הקניין שלו ולמנוע לא רק שימוש לא מורשה בתוכנה אלא גם גניבת קוד המקור של התוכנה או העתקת אופן פעולתה, אשר באופן טבעי מוגן בעיקר במוצרים שאינם מוצרי קוד פתוח. גם תוכנת “רשומון” פרי פיתוחי משנת 1989, הוגנה על ידי פלאג הגנה של אלאדין בשם AmigaHASP אשר נמכר בהמשך לחברת אלאדין.

קיימות טכנוקות רבות למניעת הגנת תוכנה, פריצה (hacking) של תוכנה וביצוע הינדוס לאחור (reverse engineering) של קובץ התוכנה. לא ניתן לאכוף מערכת רישוי לתוכנה כאשר ניתן בקלות לעקוף מערכת זו על ידי הינדוס לאחור. לכן נעשה שימוש בטכניקות של אובפוסקציה (Obfuscation).

תהליך האובפוסקציה כרוך בשינוי קוד התוכנה באופן שיקשה על הבנתו. תהליך זה מבוצע בשתי רמות: רמת קוד המקור ורמת קובץ הריצה של התוכנה.

ברמת קוד המקור, קיימות שיטות להצפין מחרווזת, להסוות קריאות לפונקציות מערכת הפעלה ושינוי שמותיהם של משתנים ופונקציות מקומיות באופן שיקשה על הבנת ייעודם.

בשנת 2013 פרסמתי מאמר בנוגע להצפנת מחרוזות בתוכנה לצורך אובפוסקציה (זכה בפרס ראשון כמאמר הטוב ביותר ב-++C באותו חודש). במאמר מובא קוד מקור פרי פיתוח צוות הפיתוח שלנו אשר במסגרתו נעשה שימוש בהצפנת AES 256.

ראשית, אציין כי מאמר זה מתמקד בתוכנה כתובה ב-C /C++ ולא בשפות אחרות או בטכנולוגיות DOT NET אשר באופן טבעי אינן מוגנות וקיימים כלים להקשחתם.

לצורך בחינות האפשרויות לבצע אובפוסקציה ברמת קוד המקור, קיים מוצר שנחשב לטוב מסוגו של חברת Semantic Designs.

כדוגמה לקוד לפני ואחרי, מובאת באתר שלהם הדוגמה הבאה:

לפני ביצוע התהליך קוד המקור נראה כך:


for (i=0; i < M.length; i++){
   // Adjust position of clock hands
   var ML=(ns)?document.layers['nsMinutes'+i]:ieMinutes[i].style;

לאחר התהליך הוא ייראה כך:

for(O79=0;O79<l6x.length;O79++){var O63=(l70)?document.layers["nsM

במהלך תהליך זה נתמכות הפעולות הבאות, כל אחת תורמת את חלקה להפיכת הקוד לבלתי ניתן להבנה:

  • Output encoding in ASCII, European ASCII, or UNICODE
  • No changes to the your C++ compilation or execution procedurs or environment
  • User definable list of preserved names
  • Predefined list of reserved identifiers for C++ standard libraries provided
  • Can preserve most preprocessor conditionals and macro calls in obfuscated source
  • Option to neatly format C++ source code to aid development before obfuscation.
  • Output encoding in ASCII, European ASCII, or UNICODE
  • Command line and GUI interfaces

 לעומת זאת, ברמה הבינארית של קובץ הריצה של התוכנה, התהליך מתבצע בשתי צורות עיקריות:

1. ביצוע שינויים ברמה הבינארית ועם זאת מבלי לפגוש במבנה של הקובץ (משום שפגיעה משמעותית במבנה הקובץ תהפוך אותו ללא קריא למערכת ההפעלה).

2. שימוש ב-Loader

הדרך הראשונה אפשרית באופן מוגבל, כאמור בשל הצורך לשמר את מבנה הקובץ באופן שיאפשר ריצתו. ברגע שהופכים קובץ ריצה (exe) לקובץ לגמרי אחר, ככל שיהיה מוגן ומוצפן, מערכת ההפעלה לא תזהה אותו ולא תריץ אותו.

הדרך השניה מבוססת על הצפנת קובץ הריצה כולו, והפעלתו על ידי תוכנה קטנה הטוענת את המידע המוצפן בזמן ריצה, פותחת את ההצפנה ומריצה אותו. שיטה זו מסורבלת ומקשה על עידכונים, דיבוג  ותחזוקה. ובנוסף עלולה להביא לחסימה על ידי רוב האנטי וירוסים המזהים סוג כזה של הפעלה כמאפיין לנוזקות למינהן; אם בוחנים את אופן פעולה של Loader, הוא משמש כ”סוס טרויאני” אשר עם הפעלתה, פותח ושולף מתוכו את התוכנה האמיתית. סוג כזה של פעולה מתאים לנוזקות המסוות את ייעודן האמיתי אולם ככל שמדובר בתוכנה לגיטימית, תוכנה כזו תיחסם בשל אותה תבנית פעולה. מצד שני, ברמה של הגנה, שיטה זו יעילה ביותר שכן היא מאפשרת הצפנה של מרבית התוכנה. (תמיד מדובר בהצפנה של “מרבית” ולא של “כל” התכונה, זאת משום שללא החלק הלא מוצפן, לא תתפאשר הרצת התוכנה. צלילה למבנה ה-PE (המבנה אשר עומד מאחורי כל תוכנה שתרוץ ברגע שתופעל בלחיצה כפולה), מתואר במאמרים רבים כדוגמת מאמר זה.

קיימות מספר שיטות אשר שימוש בהן עשוי להקשיח את התוכנה ולהקשות על הינדוס לאחור שלה:

  • שימוש בresources מוצפנים או שימוש בבלוקי מידע מוצפנים במקום resources.
  • הצפנת מחרוזות.
  • החלפת קריאות לפונקציות מערכת ההפעלה בקריאה לפסדאו-פונקציה פנימית אשר טוענת מצביע לפונקציה האמיתית (תוך הצפנה ופתיחה בזמן ריצה של שם הפונקציה), ואז קריאה לפונקציה האמיתית.


GetProcAddress(hModule,reinterpret_cast<const char*>(reinterpret_cast<int>(szName)

בנוסף נעשה שימוש בטכניקות המקשות על הפעלת כלי דיבוג (Debuggers) ואלה יפורטו להלן:

  1. בדיקות תזמון של ריצת קטעי קוד, מתוך הנחה שאם אלה רצים כאשר במקביל מופעל debugger, זמן הריצה יהיה ארוך יותר.
  2. בדיקת קיומם של debuggers ידועים לפי שם התהליך (process) שלהם.
  3. שימוש בחתימת קוד / חתימה דיגטלית אחרת של קטעי תוכנה, ואימות חתימה זו בזמן ריצה על מנת להבטיח שלא הוחלפו.


לדוגמה, אם התוכנה עושה שימוש ב-DLL, הוא ייחתם דיגיטלית בחתימת קוד (Code Signing Certificate). לאחר מכן, בזמן ריצה, תאומת החתימה (כמובן לא על ידי ה-DLL עצמו).

לאחרונה פיתחתי כלי סיוע לחתימת קוד וניתן להוריד כלי זה כאן.

בנוסף, למיקרוסופט יש ספריה לחתימה ואימות חתימה וניתן לקרוא עליה כאן.

תיאור זה הנו על קצה המזלג וניתן לקרוא עוד (באנגלית) בבלוג של Secured Globe, Inc ובבלוג של מערכת הגנת התוכנה שלנו.

מיכאל האפרתי Michael Haephrati

Secured Globe, Inc.


סדרת מאמרים אודות תוכנת Target Eye

Here is a list of articles I have written about Target Eye Monitoring System

Target Eye Revealed – part 1


Target Eye Revealed – part 2


Target Eye Revealed – part 3


Target Eye Revealed – part 4


Target Eye Revealed – part 5


Target Eye Revealed – part 6


האקרים טורקים הפילו 50 אתרים ישראלים

קבוצת האקרים טורקיים הפילה לאחרונה 50 אתרים ישראלים.

הם כתבו על כך בדף הפייסבוק שלהם

בעליו של אחד האתרים פנה אלי בבקשת עזרה דחופה אותה נתתי בשמחה.

רוב האתרים ברשימה (אם לא כולם) מאוכסנים בשרתים של נט ויזיון. בשל סיבות טכניות (ואחרות) לא ניתן היה לקבל מהם סיוע ממשי. הם שינו את הסיסמה אולם לא עלה בידם לשחזר את תוכן האתר לפני הפריצה.

האתר הפרוץ הוביל לדף בודד ובו התוכן והתמונות הבאות:

ברור ש-50 האתרים נפרצו בהעדר אמצעי אבטחה מינימליים.

לאחר הפריצה, הקשיחה חברת נט ויזיון את הכניסה לשרת, וכך הפך כל נסיון לסייע לקשה יותר. על מנת להכנס לשרת נדרש ממני לתת את כתובת ה-IP שלי, לקבל אישור לכניסה מכתובת זו, ורק אז להכנס. למה חושבים על זה רק אחרי שאתרים נפרצים? (על זה נאמר: too little. Too late). הגבלה כזו הייתה מונעת את הפריצה, ולאחר הפריצה האטה את הסרת דברי הנאצה.

הסעודים שיתפו פעולה

בשלב מסויים חשבתי להסיר את התמונות, ובדקתי היכן הן מאוכסנות. לא הפתיע לגלות שהם מאוכסנות בחברה היושבת בסעודיה. לא היו לי הרבה ציפיות אולם פניתי לאותה חברה בבקשה להסיר תמונות אלה, בשל היותן מסיתות ופוגעות.

התשובה לא אחרה לבוא. למען האמת, תגובת הסעודים הייתה מהירה מתגובת נט ויזיון…

וכך נראה האתר אחרי ההסרה:

לעומת זאת, לא נראה פתרון מהכיוון הישראלי. זה היה מתסכל. חשבתי שזה עניין של דקות. כבר נראה יותר הגיוני לפרוץ מחדש לאתר כדי להחליף פריצה אחת (של הטורקים) בפריצה חדשה (שלנו)…. בסופו של דבר (יום למחרת) לא היה צורך לפרוץ. נט ויזיון הצליחו לסגור את האתר (אם כי לא לשחזר אותו), וזה מוביל לחלק החשוב: איך למנוע פריצה.

איך להגן על אתר בפני פריצה

1. להשתמש בסיסמאות חזקות לממשק עריכת האתר, העלאת תכנים באמצעות FTP (סיסמה נפרדת), התחברות מרחוק לשרת (Remote Desktop) – גם כאן, סיסמה נפרדת.

2. החליפו את הסיסמאות אחת לחודש.

3. השתמשו בסטנדרטי קידוד שימנעו ככל האפשר פריצה באמצעות SQL Injection

4. הגדירו את הכניסה לאתר באופן שמתיר כניסה אך ורק מכתובת (או מספר כתובות) IP, וחוסמת את הכניסה מכתובות אחרות. לחליפין, ניתן לחסום גישה ממדינות מסויימות אולם האקרים יכולים להשתמש בProxie שיתחזה לכתובת מישראל. לעומת זאת, בלתי אפשרי להתחזות לכתובת IP ספציפית.

5. בצעו גיבוי על בסיס קבוע והשתמשו בשירותי אכסון הכוללים גיבוי יומי של השרת.

6. הפעילו Firewall ו-Antivirus על השרת, ובצעו עדכונים באופן קבוע (Windows Update).

כיצד להפוך קובץ אודיו לרינגטון

מכשיר האייפון הוא מכשיר פלאי וידידותי למשתמש אולם בכל הנוגע ליצירת רינגטון, או בחירת שיר והפיכתו לרינגטון הדבר קשה ואף מסובך.  קיימות מספר תוכנות ואפקליציות אשר מתיימרות לעשות זאת, אולם בכל אחת מהן עדיין נשאר לבצע מספר פעולות באופן ידני וכך למעשה אפליקציות אלה אינן תורמות הרבה, ואף עולות כסף. חשוב לומר: ניתן לייצר ולהמיר כל שיר או קטע ואף הקלטה קולית לרינגטון, ולעשות זאת ללא עלות כלשהי.

במאמר זה אסביר כיצד בכל זאת כל אלה ניתנים לביצוע ובחינם:

המצרכים הדרושים

התהליך כולו מצריך מכשיר אייפון, כבל USB, תוכנת ITunes וכמובן מחשב. הלחנתי קטע מוסיקלי קצר אותו ניתן לשמוע כאן, והפכתי אותו לרינגטון שלי. שם הקטע במקור הוא “סוף סוף”.

הכנת הקטע הקולי

בשלב ראשון יש להכין או לבחור את הקטע הקולי, שאורכו עד 40 שניות, אשר ישמש בתור רינגטון. ניתן לבחון קובץ mp3 כלשהו. ניתן להקליט כל דבר, ובמידה והקובץ אינו נשמר בפורמט זה, אלא בפורמט .wav קיימת תוכנה אינטרנטית חינמית לביצוע ההמרה.

שם התוכנה Media.IO

מעבר להמרה עצמה, לעיתים נדרשת עריכה של הקטע. הוספת fade in ו-fade out, חיתוך וחיבור קטעים, וכיו”ב. כל אלה ניתנים לביצוע בכלי עריכת אודיו, ואינם מצריכים אפליקציית יצירת רינגטון ייעודית. כלים חינמיים לא חסרים – לדוגמה הכלי הבא. במקרה שלי, התוצר הסופי הוא קובץ בשם סוף סוף .mp3

המרת הפורמט

השלב הבא מצריך את תוכנת ITunes.

1. הוספת הקובץ לספריה

מוסיפים את קובץ הmp3 המעובד לספריית המוסיקה. ניתן לגרור או לבחור בתפריט Add File to Library

2. איתור הקובץ בספריה

עכשיו בוחרים את הוקבץ מתוך רשימת השירים ועם קליק ימני בוחרים בGet Info

או אז יופיע המסך הבא (יש לעבור לתצוגת Options):

בשלב זה יש להגביל את אורך הקטע ל-40 שניות. הדבר נעשה בכתיבת הערך 0:40 מימין ל”Stop Time”.

לוחצים על OK ונחים קצת..

3. המרה לפורמט AAC

שוב בוחרים את הקובץ ברשימת השירים ובקליק ימני בוחרים בתפריט Create AAC Version

4. איתור הקובץ המומר

עכשיו יש לאתר את הקובץ שנוצר, דרך הExplorer או הFinder (אם אתם עובדים עם מק). הקובץ יהיה בתיקיית השירים של ITunes. ניתן לחפשו לפי השם שלו.

כפי שתראו, הקובץ שאותר הנו סוף סוף.m4a (זו הסיומת של קבצי AAC).

יש לשנות את שם הקובץ לm4r. 

לאחר השינוי, לחיצה כפולה עליו תפתח אותו מ-ITunes, אלא שהפעם הוא ייפתח כרינגטון בספריית הרינגטונים המקומית של המחשב.

ספריה זו נקראת Tunes והיא מופיעה אך ורק באם קיים לפחות רינגטון אחד.

עכשיו צריך לסנכרן ספריה זו עם ספריית הרינגטונים של המכשיר.

סינכרון בין ITunes למכשיר הIPhone

על מנת שכל מה שתואר כאן יעבוד, יש להגדיר סינכרון בין משכיר האייפון לתוכנת ITunes. כאשר מחברים את המכשיר בכבל USB, הוא יופיע בצד שמאל. לחיצה עליו תאפשר ביצוע Sync, כאשר ניתן להגדיר מה יסונכרן ומה לא, לרבות תמונות, וידאו, אנשי קשר, ובין השאר גם “Tones” קרי: רינגטונים. לאחר שינוי הסיומת של הקובץ, הוא הופך לרינגטון ומכאן הדרך פשוטה.

Institue of Directors

מועדון המנהלים הלונדוני הIOD, הוא מקום אידאלי לנטוורקינג. מדובר במועדון חברים אקסקלוסיבי שהקבלה אליו היא דרך המלצה של חבר קיים.  ידידי דיוויד פייס, מנכ”ל חברת WebX המליץ עלי וכך התקבלתי בשנת 2001.


Emma with Rebecca

We met Rebecca on November 2004 at Starbucks, Dortmund. Emma made a nice drawing of her and have it to her.