typedef เป็นคำสั่งที่ใช้สำหรับ define ชนิดของข้อมูล โดยปกติแล้วจะใช้สร้างชนิดข้อมูลแบบต่างๆ แต่ถ้าเอามานำเสนอมันคงธรรมดาไป วันนี้ผมจะนำเสนอวิธีที่สนุกสนานกว่า เพื่อสร้างชนิดของข้อมูลเป็นแบบ function
ก่อนอื่นคงต้องแสดงตัวอย่างการใช้ typedef
#include <stdio.h>
typedef char* p_char;
int main(int argc, char **argv)
{
p_char sz_test = "111";
printf("%s\n",sz_test);
return 0;
}
เห็นได้ว่า p_char จะการเป็น type ของข้อมูลโดยเป็น type แบบ char* สามารถใช้แทน char* ได้ทันที คราวนี้มาดูการใช้ typedef เพื่อสร้าง function type
#include <stdio.h>
#include <windows.h>
typedef char* p_char;
typedef int (__stdcall *MESSAGEBOX) (HWND,LPCSTR,LPCSTR,UINT);
int main(int argc, char **argv)
{
p_char sz_test = "111";
printf("%s\n",sz_test);
MESSAGEBOX API_MSG;
API_MSG = (MESSAGEBOX)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");
API_MSG(0,"RCECODE.COM","MessageBoxA by Edkung",MB_OK);
return 0;
}
จะได้ว่า MESSAGEBOX เป็น function type ที่เราสร้างขึ้นมาโดย function นี้จะ return value เป็น int และมี parameter 4 ตัวคือ HWND, LPCSTR, LPSTR , UINT ตามลำดับ โดยมีการระบุ Calling Convertion ของ MESSAGEBOX เป็น __stdcall เนื่องจาก compiler จะระบุโดย default เป็น __cdecl แต่ user32.MessageBoxA() เป็น API Function ที่มี Calling Convertion เป็น __stdcall ดังนั้นจึงต้องกำหนดให้เหมือนกันจึงจะทำให้เมื่อ call API_MSG() เรียบร้อยแล้วจะได้มีการเคลียร์ stack ได้อย่างถูกต้อง
ลองเอาประยุกต์ไปใช้กันดูครับรับรองว่าผู้อ่านจะเขียน code ได้ยืดหยุ่นขึ้นอีกเยอะเลย

ถ้าผมจะเขียนให้ DLL ของผม Call ฟังก์ชั่นถอดรหัสไฟล์ data ของโปรแกรมหนึ่งน่ะครับ (เข้ารหัสด้วย RSA 1024 bits + zlib ขี้เกียจเขียนโปรแกรมถอด ใช้ Inline Decode ดีกว่า)
เท่าที่ทราบ เป็น __stdcall ครับ โดยการ call จาก debugger เป็นแบบนี้
PUSH Param2 << โหมดการอ่านเขียน (ในโปรแกรมใช้ "rb")
PUSH Param1 << ชื่อไฟล์ที่ต้องการถอดรหัส
Call Function (Address 0x0044C68B)
สำหรับการ Return ค่าเนี่ย ผมงงมากเลยครับ ซึ่งตัวฟังก์ชั่นจะ Return ออกมาใน EAX ใช่มั้ยครับ?
สมมุต EAX (หลังจาก call เสร็จ) เป็น 02F68EC8 ซึ่งสิ่งที่ผมต้องการจากฟังก์ชั่นนี้คือ เนื้อหาของไฟล์ที่ถอดรหัสแล้ว
และขนาดของเนื้อหา ซึ่งจะส่งกลับออกมาดังนี้
EAX + 0x8 = Decoded Buffer (02F68EC8 + 0x8 = 02F68ED0)
EAX + 0xC = Decoded Buffer Size (02F68EC8 + 0xC = 02F68ED4)
ไม่ทราบว่าต้องเขียน typedef ยังไงครับ