View Full Version : [MASM] InjectEXE
neoclassic
07-07-2008, 10:25 PM
โค้ด สารพัดประโยชน์
ในวงการ malware สามารถทำ fwb ได้โดยการ Inject exe to memory (ยังเวิร์ค อยู่เลยและ นิ่งมากๆ )
หรือ ทำ cryptor ก็ได้ หลบ antivirus ในขณะ runtime ได้
**Hidden Content: Check the thread to see hidden data.**
Tummy
07-07-2008, 11:06 PM
-"-
โค้ดอ่านยากมากมาย ....
แต่เท่าที่อ่านดูแบบเข้าใจงูๆปลาๆ code นี้ใช้หลักการทำงานแบบเดียวกับ loader ใช่หรือเปล่าครับ??
neoclassic
08-07-2008, 04:04 AM
ถูกต้อง แล้ว ท่าน tummy :D
แต่ loader ไม่จำเป็นต้องใช้เยอะ ขนาดนี้ ไม่ต้องมี HEADER มาคำนวน เพราะ loader ไม่ได้ สิงเข้าไปใน
memory ชาวบ้าน แค่สร้างเท่านั้น เลย ใช้แค่
CreateProcess สร้างโปรเซสเป้าหมาย
WriteProcessMemory แก้ไข address ใน memory
ResumeThread คืนค่า thread
[/b]
3 function แค่นี้ทำ loader ได้สบายแล้ว ในภาษา ระดับสูง เขียน ไม่กี่บรรทัดเอง :D
Tummy
08-07-2008, 09:42 AM
ถูกต้อง แล้ว ท่าน tummy :D
แต่ loader ไม่จำเป็นต้องใช้เยอะ ขนาดนี้ ไม่ต้องมี HEADER มาคำนวน เพราะ loader ไม่ได้ สิงเข้าไปใน
memory ชาวบ้าน แค่สร้างเท่านั้น เลย ใช้แค่
3 function แค่นี้ทำ loader ได้สบายแล้ว ในภาษา ระดับสูง เขียน ไม่กี่บรรทัดเอง :D
[/b]
เออช่ายละเพิ่งนึกได้พอดี ผมมีคำถามจะถามนิดหน่อยเกี่ยวกับ ResumeThread ครับ การจะเรียกใช้ ResumeThread ได้นั้น ต้องมีการเรียกใช้ CreateThread กับ SuspendThread มาก่อนหน้าหรือเปล่าครับ เพราะเท่าที่อ่านดูนี่รู้สึกว่า ResumeThread มันเกิดจากการที่ Thread ที่ create ขึ้นมาถูก suspend เพื่อไปทำงานในอีก thread นึง
neoclassic
08-07-2008, 12:30 PM
เออช่ายละเพิ่งนึกได้พอดี ผมมีคำถามจะถามนิดหน่อยเกี่ยวกับ ResumeThread ครับ การจะเรียกใช้ ResumeThread
ได้นั้น ต้องมีการเรียกใช้ CreateThread กับ SuspendThread มาก่อนหน้าหรือเปล่าครับ เพราะเท่าที่อ่านดูนี่รู้สึกว่า
ResumeThread มันเกิดจากการที่ Thread ที่ create ขึ้นมาถูก suspend เพื่อไปทำงานในอีก thread นึง[/b]
ถ้าเป็นกรณี loader เวลา CreateProcess จะต้องมี ProcessInformation ร่วมไปด้วยใช้ มั้ย :D
เช่น
delphi :
var
ProcessInfo : TProcessInformation;
CreateProcess(PChar(target),nil, nil, nil,False,CREATE_SUSPENDED,nil, nil, StartupInfo, ProcessInfo);
ภายใน ProcessInformation จะประกอบไปด้วย hProcess,hThread ,dwProcessId,dwThreadID ดังนั้น มันมี hThread อยู่แล้ว
และมันเป็นเพียง ตัวแปร เท่านั้นเอง
ResumeThread(ProcessInfo.hThread)
การ ResumeThread มันเป็นการทำให้ bytes ใหม่มีผลในทันที หลังจาก WriteProcessMemory ไปแล้วเพราะ ค่า bytes ที่ถูกเขียนเข้าไปใหม่
จะได้ execute ได้นั้นเอง ถ้าไม่มี เนี่ย process จะ ค้าง :P
ส่วนการ CreateThread ,SuspendThread ,BeginThread ไม่จำเป็นต้องสร้างก่อน ResumeThread ก็เรียกใช้ได้ ครับ
Tummy
08-07-2008, 12:45 PM
The ResumeThread function decrements a thread’s suspend count. When the suspend count is decremented to zero, the execution of the thread is resumed.
Return Values
If the function succeeds, the return value is the thread’s previous suspend count.
If the function fails, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError.
อันนี้ copy มาจาก Win32SDK นะครับ
ถ้าอย่างนั้นน่าจะหมายความว่า ถ้ามี ใช้ SuspendThread เราก็ต้องทำการ ResumeThread ไปเรื่อยๆจนกว่า ค่า Count ที่ได้ที่ได้ออกมาเป็น 0 มันถึงจะ execute ได้ใช่ไหมครับ? (อันนี้ผมไม่แน่ใจจริงๆ)
neoclassic
08-07-2008, 11:07 PM
ถ้าอย่างนั้นน่าจะหมายความว่า ถ้ามี ใช้ SuspendThread เราก็ต้องทำการ ResumeThread ไปเรื่อยๆจนกว่า ค่า Count ที่ได้ที่ได้ออกมาเป็น 0 มันถึงจะ execute ได้ใช่ไหมครับ? (อันนี้ผมไม่แน่ใจจริงๆ)[/b]
โดย ปกติ loader ผมไม่เคยเห็นใคร ใช้ SuspendThread เพราะไม่รู้ว่าให้ หยุดทำไม?
หากพูดถึง multithread อันนี้ก็ใช้ปกติ SuspendThread เสมือนการ pause หยุดชั่วขณะ และใช้ ResumeThread
ให้ทำงานต่อเนื่องไป เมื่อทำงานสำเร็จ GetLastError = 0 ไม่เท่ากับ 0 ก็ แสดงว่าไม่ทำงาน เอาไว้เขียนดัก error
Tummy
11-07-2008, 07:45 PM
- -a
มีคำถามอีกแล้วแฮะ (คงไม่เบื่อซะัก่อนนะครับ)
ตรง
[code]
invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_EXECUTE_READWRITE;Chang acess policy of target location to read-wirte-execute.
mov pBuff,eax
neoclassic
12-07-2008, 07:57 AM
ท่าน tummy นี้ ช่างสังเกตุ ดีจริง :D
เมื่อ run มันจะ สร้างไฟล์ ขึ้นมาใหม่พร้อมทั้ง อ่านค่า กลับลงไปใหม่
มัน อ่านค่า fHandle และ return ออกมาที่ BytesRead ครับความจริง eax ก็ return ออกมาแต่ในกรณีนี้ เราไม่ใช้ จะใช้ก็ได้ครับ
ดักพวก error ทั้งหลายแล้วแต่การออกแบบของเราเลยครับ
หากใครอยากเอาโค้ดไปใช้งานจริง ไม่ว่าจะเป็น fwb หรือ crypter โค้ด นี้เป็นพียงแค่ตัว อย่าง น้ะครับโค้ดอาจเขียนขาดๆ เกินๆ
ต้องมีไฟล์มาเกาะช้วยมันด้วย ตัวนี้เหมือนเป็นตัวกลางต้องออกแบบเพิ่ม เพราะลำพังแค่ compile และ run
มันก็แค่นั้นแหล่ะครับ แค่เห็น calc.exe กลายร่างเป็น process ของ InjectEXE.exe มันไม่มีอะไรเลยครับ เพราะมันเป็นแค่ ตัวอย่าง เท่านั้น ใช้งานจริง มีอีกเยอะ :D
* เพิ่มเติมเล็กน้อย หากทำ crypter run ผ่าน memory
invoke ReadFile,fHandle,eax,dwSize,addr BytesRead,NULL
มีการวางยาไว้นิดนีงด้วย น้ะครับหากจะใช้งานจริง ต้องมี function ก่อนหน้ามันอีก มีแค่นี้ใช้งานจริงไม่เวิร์คน้ะครับ
หาก compile โดยไม่มี imagebase ให้มัน ก็ไม่เวิร์คอีกเช่น กัน ในการทำ crypter
* เพิ่มเติมเล็กน้อย หากทำ fwb inject exe to memory
invoke CreateProcess,0,addr szFileName,0,0,0,CREATE_SUSPENDED,0,0,addr StartInfo,addr ProcInfo
มีการวางยาไว้นิดนีงด้วย น้ะครับหากจะใช้งานจริง เปลี่ยนแค่ szFileName ให้กลายเป็นเป้าหมาย(IE,Firefox,svchost,etc..) แค่นี้ใช้งานจริงไม่เวิร์คน้ะครับ เวลา run จะ error ต้องมี function ก่อนหน้ามันอีก นิดนึง
ถ้าชอบศึกษาแต่ function ก็ OK ครับมันผลิกแผลงได้เยอะ เป็นการเล่นกับ memory :)
Tummy
12-07-2008, 06:46 PM
T-T
ไม่ได้ชอบศึกษาแต่ function หรอกครับ แต่ปัุญหา คือ มันอ่านไม่รู้เรื่องเลยต้องมานั่งแงะที่ละบรรทัดๆ แล้วมันก็ดันติดปัญหา
วันนี้มาอีกละ T-T
[code]
mov eax,HeaderSize
cmp eax,[esi].PointerToRawData
Tummy
12-07-2008, 07:16 PM
- -"
อีกหนึ่งคำุถามเพื่อเป็นการ confirm ความโง่ของตัวเอง เหอๆๆ (ก่อนหน้านี้มีอีก 1 คำถามนะครับ ยังไงช่วยดูหน่อย)
[code]
invoke GetFileSize,eax,0;Get file's size
mov dwSize,eax;eax
neoclassic
13-07-2008, 06:28 AM
ตรง VirtualAlloc,0 << มันไม่ไ่ด้กำหนด Address ที่จะทำ VirtualAlloc เ้อาไว้อ่ะครับ (มันกำหนดเป็น0) แล้วทีนี้ จะทำไปกำหนด access policy ของ File ที่เราเรียกด้วย CreateFile ได้หรอครับ??
Clear แล้วครับ - -"(ถามเองตอบเอง) สรุปว่า VirtualAlloc มีเอาไว้สำหรับกำหนด Allocation ของ File ที่เราจะ Read ขึ้นมา
ถ้าเป็นอย่างนั้นตามที่ผมเข้าใจก็คือ เราต้องทำการเรียกใช้ พวก VirtualAlloc หรือ GlobalAlloc ก่อนที่ทำเรียกใช้ ReadFile หรือ WriteFile ถูกไหมครับ?[/b]
โค้ดทั้งหมดนี้ เดิมๆ เขียนด้วย delphi โดย aphex และ ทำการ แปลง โดย shapeless กลายเป็น Masm function เดิมๆ ของมัน คือ Getmem http://www.delphibasics.co.uk/RTL.asp?Name=GetMem อยู่ใน System.pas
ไม่ใช้ function ที่ออกโดย microsoft เลยใช้ VirtualAlloc ทดแทน ความจริงใช้มาแต่แรกก็ได้ :D
ตอบไม่ตรง คำถามซ้ะงั้น :lol:
* api หาอ่านได้ทั่วๆ ไปเลยครับ บานเลย เยอะแยะมากมาย :D
Tummy
13-07-2008, 07:44 AM
* api หาอ่านได้ทั่วๆ ไปเลยครับ บานเลย เยอะแยะมากมาย :D
[/b]
- -"
ปัญหาของผมคือการใช้งานอ่ะครับ (อ่านพอมั่วได้) แต่พอเอาไปใช้จริงๆ กลับไม่รู้ว่าต้องใช้ยังไง อย่างเช่น เจ้า
Virtualloc << เชื่อมะ เพิ่งรู้เมื่อวานเลยว่าใช้งานยังไง T-T
สงสัยทำได้อย่างเดียวคือต้องฝึกเขียนบ่อยๆ กับ อ่าน code ที่ท่าน neoclassic เอามาปล่อย ... ^^"
Tummy
14-07-2008, 02:43 PM
เอาหละ อ่านจบซักที มีปัญหา มาถามอีกแล้วครับ
mov eax,contxt.regEbx
add eax,8
lea ecx,[edi].OptionalHeader.ImageBase
invoke WriteProcessMemory,ProcInfo.hProcess,eax,ecx,4,addr BytesRead
push [edi].OptionalHeader.ImageBase
pop eax
add eax,[edi].OptionalHeader.AddressOfEntryPoint
mov contxt.regEax,eax
invoke SetThreadContext,ProcInfo.hThread,addr contxt
mov eax,contxt.regEbx
add eax,8
ผมไม่เข้่าใจว่าทำไมต้องเอาค่าเก็บอยู่ใน EBX มา + 8 แล้ว write ค่า ImageBase กลับลงไปที่ ตำแหน่งนั้น?
add eax,[edi].OptionalHeader.AddressOfEntryPoint
mov contxt.regEax,eax
แล้วทำไมถึง move ค่า EP ของ program ไปไว้ใน EAX ?
- -" พยายามหาอ่านใน net แต่หาคำตอบไม่ได้ซักที
blackkitty
14-07-2008, 05:56 PM
มา เขยิบให้นะท่าน Tummy โอเคครับ..
neoclassic
15-07-2008, 06:59 AM
<div class='quotetop'>QUOTE
mov eax,contxt.regEbx
add eax,8[/b]
ผมไม่เข้่าใจว่าทำไมต้องเอาค่าเก็บอยู่ใน EBX มา + 8 แล้ว write ค่า ImageBase กลับลงไปที่ ตำแหน่งนั้น?[/b][/quote]
ทุกครั้งที่ run ค่า contxt.regEbx จะไม่ซ้ำกันเลยและ + ไปอีก 8 ยัง งง อยู่เลย ทั้งๆ ที่ regEax..regEdi มีค่าหมดเลย แต่ทำไม่เลือก regEbx แถมยังต้อง + 8 ถ้าไม่เป็นตามนี้ไม่เวิร์ค ยังคิดไม่ออก ไม่รู้เหมือนกันว่า aphex หาค่านี้มาได้ไง :P
<div class='quotetop'>QUOTE
add eax,[edi].OptionalHeader.AddressOfEntryPoint
mov contxt.regEax,eax[/b]
แล้วทำไมถึง move ค่า EP ของ program ไปไว้ใน EAX ?[/b][/quote]
มุมมองง่ายๆ
contxt.regEax = ImageBase + AddressOfEntryPoint
เก็บค่าไว้ใน contxt เพื่อจะ ResumeThread เป็นขั้นตอนสุดท้าย ไม่เช่น นั้น bytes ใหม่ๆ ที่เขียนลง memory จะไม่มีผล
Tummy
15-07-2008, 12:30 PM
ผมหาคำตอบของ EBX +8 มาได้ละ ^^"
**Hidden Content: Check the thread to see hidden data.**
แต่ผมยังหาคำตอบของ context.regEax ที่เก็บค่า EP เอาไว้ไม่ได้ว่า เพราะอะไร
จากการมั่วของผมก็คือ context.regEax จะเก็บค่า ตำแหน่งของการ return to thread เอาไว้ถูกไหมครับ? << อันนี้ผมเดาเอาอ่ะ
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.