การทำ hard lock
อุปสรรคในการพัฒนาอุตสหกรรมซอฟท์แวร์ในเมืองไทยคือการลักลอบก็อปปี้โปรแกรม ทำให้นักพัฒนาหลายๆคนหมดกำลังใจที่จะพัฒนา การก็อปปี้โปรแกรมในเมืองไทยทำได้ง่ายประกอบกับสังคมไทยเป็นสังคมพึ่งพาอาศัยกัน การหาซอฟท์บางครั้งสามารถสอบถามจากเพื่อนๆได้เลย รวมทั้งธุรกิจการก็อปปี้ก็ทำกันเป็นลำเป็นสัน ทำให้นักพัฒนาโปรแกรมถอดใจไปตามๆกัน บางครั้งก็อยากจะพัฒนาไปขายต่างประเทศก็ไม่รู้จะเริ่มยังไง ภาษาก็ได้นิดหน่อย หรือไม่ได้เลย สายสัมพันธ์ทางธุรกิจก็มีน้อยหรือไม่มีเลย เพราะนักพัฒนาโปรแกรมส่วนใหญ่อายุน้อยๆอยู่ สายสัมพันธ์ทางธุรกิจก็มีน้อย จะไปเสนอให้บริษัทใหญ่เขาก็ไม่ค่อยคุยด้วย มีอย่างเดียวก็ไฟ กับมันสมอง เพราะฉนั้นผมว่าน่าจะใช้มันสมองในการแก้ปัญหาการก็อปปี้โปรแกรมกันดีกว่า บทความนี้คงทำให้คนที่อยากพัฒนาโปรแกรมเพื่อใช้ในเมืองไทยมีแรงกำลังใจมากขึ้น ผมเองก็อยากให้มีการพัฒนาโปรแกรมขึ้นมาเยอะในเมืองไทย เพราะอุตสหกรรมถ้าเติบโตถึงจุดๆหนึ่งสามารถนำเงินเข้าประเทศได้เลยเหมือนกับอินเดียและฟิลิปปินส์ ฉนั้นเรามาเริ่มจากพัฒนาโปรแกรมขายให้คนไทยก่อนดีกว่า พอมีเงินระดับหนึ่งก็พัฒนาขายให้กับคนต่างชาติ หรือขายได้ดีระดับหนึ่งก็สามารถนำไปเสนอบริษัทที่มีเงินทุนหนาๆสนับสนุนเรื่อง การพัฒนาให้สามารถขายให้กับกลุ่มเป้าหมายได้มากขึ้น
การป้องกันการก็อปปี้โปรแกรมมีหลายวิธี ไม่ว่าจะเป็นการให้ใส่ พาสเวิร์ด ซึ่งก็รู้กันอยู่ป้องกันแทบไม่ได้เลย สองทำไวรัส อันนี้แย่หน่อย บางครั้งอาจจะโดนลูกว่าเอาก็ได้ แต่บางครั้งเราก็ไม่สามารถทำได้ถึงระดับนั้น(หมายถึงทำไวรัสใส่เข้าไป ผมเองก็ไม่สามารถทำได้นะตอนนี้) มีวิธีหนึ่งก็คือการทำ hard lock วิธีนี้เหมาะสำหรับ ในความคิดผมคือ เหมาะสำหรับโปรแกรมที่ไม่แพงมากจนเกินไป อาจจะซักประมาณ 500-2000 บาท การตั้งราคาก็ดูด้วยละกันครับ
Hard lock หรือการป้องกันการก็อปปี้โดยใช้ฮาร์ดแวร์สามารถใช้ได้ในปัจจุบันนี้ แต่ต้นทุนในการผลิตก็คงจะเพิ่มขึ้นอีกสักประมาณ 80-150 บาทแต่มันก็อาจจะคุ้มนะ ผมจะอธิบายในการทำแต่ละวิธี ซึ่งมันเป็นไอเดียที่ผมคิดเอาไว้นะ แต่ยังไม่เอาไปใช้ อนาคตอันใกล้นี้ผมนำไปใช้แน่นอน
วิธีที่ 1
ความรู้ที่ต้องใช้
-ความรู้ทางอิเลคทรอนิกส์เบื้องต้น
-การทำงานของพอร์ตปริ้นเตอร์
-หลักการเขียนโปรแกรมติดต่อกับแอดเดรสของพีซี
ง่ายหน่อยคือการติดฮาร์ดล็อกที่พอร์ตปริ้นเตอร์ การทำงานของพอร์ตปริ้นเตอร์ผมเองก็จำไม่ค่อยได้แล้วนะ ว่าหลักการทั้งหมดเป็นยังไง แต่พอจำได้คือ พอร์ตปริ้นเตอร์เป็นพอร์ตขนาน มีแอดเดรสของมันเอง การติดต่อสามารถติดต่อได้โดยตรง หรือผ่าน VXD ของวินโดว์ก็มีนะ (ผมเคยทำโพรเจคตอนปีสี่ต้องเขียนโปรแกรมติดต่อกับแอดเดรสของพีซี ผมใช้วิชวลซี ปรากฏว่าเวอร์ชั่น 4 ติดต่อกับพอร์ตโดยตรงไม่ได้แต่เวอร์ชั่น 5 ติดต่อโดยตรงได้ ผมเองก็ไม่ได้ค้นหาสาเหตุของมันนะ เพราะต้องรีบใช้มันก็เลยไม่สนใจ) ในโปรแกรมซึ่งคุณต้องการจะทำฮาร์ดล๊อกจะต้องเขียนโปรแกรมให้รับข้อมูลค่าค่าหนึ่งผ่านพอร์ตปริ้นเตอร์ไป ซึ่งที่พอร์ตดังกล่าวจะมีวงจรอิเลคทรอนิกส์ซึ่งอาจจะต่อ R พูลอัพ หรือ พูลดาวน์เอาไว้ก็ได้ เพราะฉนั้นโปรแกรมจะเชคค่าที่ได้รับเข้ามาว่ามันเป็นค่าที่เรากำหนดเอาไว้ในฮาร์ดแวร์ตัวนั้นหรือไม่ ถ้าไช่ก็โอเค ให้รันโปรแกรมต่อไปได้
ข้อเสีย
สำหรับวิธีนี้คือ คุณต้องเสียพอร์ตปริ้นเตอร์ไปนะ เครื่องนั้นถ้ามีพอร์ตปริ้นเตอร์อันเดียวก็เสร็จ อาจจะยากลำบากในการเอาเข้า เอาออกเวลาที่ต้องใช้พริ้นเตอร์ และอีกอย่าง อาจจะมีคนก็อปปี้ฮาร์ดแวร์เราได้ซึ่งสามารถดูจากวงจรที่เราต่อเอาไว้ในพอร์ตนั้น
ข้อแนะนำ
ไม่ควรใช้วิธีนี้ เพราะไม่เหมาะสม
วีธีที่ 2
ความรู้ที่ต้องใช้
-ความรู้ทางอิเลคทรอนิกส์เบื้องต้น
-การทำงานของพอร์ตปริ้นเตอร์
-หลักการเขียนโปรแกรมติดต่อกับแอดเดรสของพีซี
-การสร้างคอมพิวเตอร์เล็กขึ้นมา(อันนี้นักศึกษาสายเทคนิกคอลชอบกันนัก นำชิปไมโครคอลเลอร์มาต่อกับพอร์ตปริ้นเตอร์)
ยากขึ้นมาหน่อยแต่ราคาก็แพงขึ้นมาอีกพอสมควร ผมแนะนำ 8051 รุ่นที่ออกโดย ATMEL นะเพราะราคาขายในเมืองไทยประมาณ 50-80 บาทต่อตัวหนึ่ง หาดีๆได้ราคานี้แน่นอนหรืออาจจะถูกกว่านั้น คุณต้องให้โปรแกรมคุณส่งค่าผ่านพอร์ตขนานไป เพื่อให้ ไมโครคอลโทรลเลอร์รับจากนั้นก็ให้ ไมโครคอลโทรลเลอร์ส่งค่ากลับมา โดยที่คุณจะต้องเขียนโปรแกรมให้มันคุยให้เข้าใจกันให้ได้ด้วยนะ ยกตัวอย่างเช่นส่งค่า 0x10 ออกไปเมื่อไมโครคอลเลอร์ได้รับแล้วก็อาจจะตอบกลับมาโดยการส่งค่า 0x01 กลับมา เป็นอันว่าเข้าใจกันและก็แสดงว่ามีฮาร์แวร์อยู่ ก็โอเค รันโปรแกรมได้ ตรงนี้คุณต้องศึกษารายละเอียดของพอร์ตปริ้นเตอร์ให้ดีด้วย และต้องออกแบบวงจรให้มันคงความสามารถในการใช้กับเครื่องปริ้นเตอร์ได้ด้วยนะ คุณอาจจะใช้ Logic Analyzer หรือ Scope ศึกษาการทำงานของพอร์ตปริ้นเตอร์นั้นก็ได้
ข้อดี มีความยากลำบากมากขึ้นในการก็อปปี้ฮาร์ดล๊อกแต่ก็สามารถทำได้ เพราะเพียงแค่มีการวิเคราะห์ค่าที่ออกมาจากพอร์ตเมื่อรันโปรแกรม และสัญญาณที่ส่งออกมาจากฮาร์ดล๊อกก็สามารถก็อปปี้ได้เช่นเดียวกัน ข้อแนะนำ
ใช้วิธีก็โอเคนะ แต่ผมแนะนำให้ใช้วิธีต่อไปนี้จะดีกว่า
วีธีที่ 2
ความรู้ที่ต้องใช้
-ความรู้ทางอิเลคทรอนิกส์เบื้องต้น
-การทำงานของพอร์ตปริ้นเตอร์
-หลักการเขียนโปรแกรมติดต่อกับแอดเดรสของพีซี
-การสร้างคอมพิวเตอร์เล็กขึ้นมา
-ความรู้เรื่องการเข้ารหัส(ผมจะเกริ่นให้ฟังนิดหน่อย เพราะผมเองก็รับฟังมาจากเพื่อนที่กำลังเรียนตัวนี้อยู่ในระดับ ปโท ทำเหมือนวิธีที่แล้ว เพิ่มขึ้นมาเรื่องการป้องกันการรู้รหัสที่ส่งออกมาและเข้าไป จากวิธีที่แล้วถ้าพีซีส่ง 0x10 ออกมาและคอนโทรลเลอร์ส่ง 0x01 คืนมาให้ เมื่อพีซีเชคว่าเป็นค่าที่ส่งกลับมาเป็นไปในรูปแบบที่ได้กำหนดกันไว้แล้ว ก็โอเคให้รันโปรแกรมต่อได้ เราควรใช้หลักการการเข้ารหัสก่อน สมมตุว่าพีซีคือ นาย A และคอนโทรลเลอร์คือ นาย B ส่วนคนที่จะก๊อปปี้ฮาร์ดล๊อกเราคือนาย C ซึ่งนายซีในภาษาวิชาการจะเรียกว่า man in the middle นายสามารถรู้ว่าเรารับและส่งข้อมูลอะไรกัน

นาย A กับ B จะมีคีย์เป็นของตัวเองซึ่งตรงนี้ด้านนาย A คงเปลี่ยนคีย์ได้อาจจะส่มออกมาก็ได้ แต่ด้านนาย B ก็สามารถสุ่มออกมาได้เช่นเดียวกัน เช่น นาย A ส่งค่า 2 ยกกำลัง 3 (3 คือคีย์ของ A) ไป นาย B ส่งค่าที่ได้รับคือ 8 ยกกำลัง 2 กลับมา(2 คือคีย์ของ B) นาย A จะได้รับ 64 ก็ส่งค่า square root 3 ของ 64 คือ 4 ไปให้นาย B ตอนนี้นาย B ก็จะรู้แล้วว่าคีย์ของนาย A คืออะไร นาย B ก็จะส่งค่าที่ได้รับคือ 4 โดยใส่ square root ไปคือ 2 เพราะฉนั้น นาย A ก็จะรู้แล้ว่าคีย์ของ นาย B คืออะไร จากนั้นเราก็จะนำคีย์ของบุคคลทั้งสองมาใช้ให้เป็นประโยชน์โดยตั้งสมการเอาไว้เลยในทั้งสองข้าง สมการยิ่งซับซ้อนก็ยิ่งยากมากขึ้นในการที่จะถอดสมการนั้นออกมา
หวังว่าถ้าใครจะนำไอเดียตรงนี้ไปใช้ก็น่าจะเป็นประโยชน์ต่อการพัฒนาอุตสหกรรมซอฟท์แวร์ของไทยนะครับ ผมเองก็คงให้รายละเอียดลึกๆมากกว่านี้ไม่ได้ เพราะว่าเคยทำเมื่อสองสามปีก่อนอีกอย่างก็ไม่ได้ค้นเอกสารไม่ว่าจะเป็น ขาของพอร์ตขนานของ พีซี หรือ ให้ตัวอย่างการเขียนโปรแกรมลง ไปผมเองก็คิดว่านักศึกษารุ่นน้องๆก็คงสามารถค้นหาได้นะครับ หมายเหตุ
การสั่งงานออกทางแอดเดรสของพีซีในเดลไฟ
function PortIn(IOport:word):byte;stdcall; // รับข้อมูลจากพอร์ตขนาด 8 บิต
asm
mov dx,[IOport]
in al,dx
end;
function PortInW(IOport:word):word:stdcall; // รับข้อมูลจากพอร์ตขนาด 16 บิต
asm
mov dx,[IOprot]
in ax,dx
end;
Procudure PortOut(IOport:word;Value:byte);stdcall; //สั่งออกพอร์ตขนาด 8 บิต
asm
mov dx,[IOport]
mov al,[Value]
out dx,al
end;
Procudure PortOutW(IOport:word;Value:word);stdcall; //สั่งออกพอร์ตขนาด 16 บิต
asm
mov dx,[IOport]
mov al,[Value]
out dx,ax
end;
การเขียนติอต่อพอร์ตโดยใช้ซี ได้ทั้งวินโดว์และดอส ในวิชวลซีบางเวอร์ชั่นก็ได้นะ หรือคุณอาจจะต้องเซต Environment ของ IDE ให้สามารถติดต่อกับฮาร์แวร์ในระดับล่างๆได้โดยไม่ต้องผ่าน device driver /* inport example */
#include
#include
int main(void)
{
int result;
int port = 0;
result = inport(port);
printf("Word read from port %d = 0x%X\n", port, result);
return 0;
}
/* inportb example */
#include
#include
int main(void)
{
unsigned char result;
int port = 0; /* serial port 1 */
result = inportb(port);
printf("Byte read from port %d = 0x%X\n", port, result);
return 0;
}
/* outport example */
#include
int main(void)
{
int port = 0;
int value = 'C';
outport(port, value);
printf("Value %d sent to port number %d\n", value, port);
return 0;
}
/* outportb example */
#include
#include
int main(void)
{
int port = 0;
char value = 'C';
outportb(port, value);
printf("Value %c sent to port number %d\n", value, port);
return 0;
}
หมายเหตุ
- inport อ่านข้อมูลขนาด 16 บิต port
- inportb อ่านข้อมูลขนาด 8 บิต port
- outport ส่งข้อมูลขนาด 16 บิตไปที่ port
- outportb ส่งข้อมูลขนาด 8 บิตไปที่ port
พอร์ตปริ้นเตอร์เป็นพอร์ตขนาด 8 บิต แต่ถ้าคุณต่อการ์ดขึ้นมาเอง ก็ต้องเลือกแอดเดรสในช่วงที่พีซีอนุญาติให้ใช้ ซึ่งถ้าเป็นการ์ด ISA ก็จะมีขนาด 16 บิตแต่ถ้าคุณต่อการ์ด PCI ขึ้นมาเองก็จะมีขนาดบิตได้ถึง 32 บิต
1
Hosted by www.Geocities.ws