Ret-Sync ย่อมาจากการซิงโครไนซ์เครื่องมือย้อนกลับ มันเป็นชุดของปลั๊กอินที่ช่วยในการซิงโครไนซ์เซสชันการดีบัก (WINDBG/GDB/LLDB/OLLYDBG/OLLYDBG2/X64DBG) ด้วย Disassembler (IDA/Ghidra/Binary Ninja) แนวคิดพื้นฐานนั้นง่าย: นำสิ่งที่ดีที่สุดจากทั้งสองโลก (การวิเคราะห์แบบคงที่และแบบไดนามิก)
debuggers และการวิเคราะห์แบบไดนามิกให้เรา:
!peb , !drvobj , !address ฯลฯ )ถอดแยกชิ้นส่วนและการวิเคราะห์แบบคงที่ให้เรา:
คุณสมบัติที่สำคัญ:
Ret-Sync เป็นส้อมของ QB-sync ที่ฉันพัฒนาและดูแลรักษาในระหว่างการพักที่ Quarkslab
ปลั๊กอินดีบักเกอร์:
ext_windbg/sync : ไฟล์ต้นฉบับส่วนขยาย Windbg เมื่อสร้าง: sync.dllext_gdb/sync.py : ปลั๊กอิน gdbext_lldb/sync.py : ปลั๊กอิน LLDBext_olly1 : ปลั๊กอิน Ollydbg 1.10ext_olly2 : ปลั๊กอิน ollydbg v2ext_x64dbg : ปลั๊กอิน x64dbgปลั๊กอิน disassembler:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip : ปลั๊กอิน ghidraext_bn/retsync : ปลั๊กอิน Binary Ninjaและปลั๊กอินไลบรารี:
ext_lib/sync.py : ไลบรารี Python แบบสแตนด์อโลนปลั๊กอิน IDA และ GDB ต้องการการตั้งค่า Python ที่ถูกต้อง Python 2 (> = 2.7) และ Python 3 ได้รับการสนับสนุน
ไบนารีที่สร้างไว้ล่วงหน้าสำหรับ WINDBG/OLLYDBG/OLLYDBG2/X64DBG Debuggers ถูกเสนอผ่านท่อ Azure DevOps : Azure DevOps:
เลือกบิลด์ล่าสุดและตรวจสอบสิ่งประดิษฐ์ภายใต้ส่วน Related : 6 published

ปลั๊กอินปลั๊กอินที่สร้างไว้ล่วงหน้าของปลั๊กอิน Ghidra มีให้ใน ext_ghidra/dist
Ret-sync ควรทำงานนอกกรอบสำหรับผู้ใช้ส่วนใหญ่ที่มีการตั้งค่าทั่วไป: ดีบักเกอร์และ disassembler บนโฮสต์เดียวกันชื่อโมดูลที่ตรงกัน
ถึงกระนั้นในบางสถานการณ์อาจใช้การกำหนดค่าเฉพาะ สำหรับสิ่งนั้นส่วนขยายและปลั๊กอินตรวจสอบไฟล์การกำหนดค่าส่วนกลางที่เป็นตัวเลือกชื่อ .sync ในไดเรกทอรีโฮมไดเรกทอรีของผู้ใช้ ต้องเป็นไฟล์ .INI ที่ถูกต้อง
นอกจากนี้ปลั๊กอิน IDA และ GHIDRA ยังมองหาไฟล์การกำหนดค่าในไดเรกทอรี IDB หรือ Project ( <project>.rep ) ก่อนเพื่ออนุญาตการตั้งค่าท้องถิ่นต่อไอดีบ/โครงการ หากมีไฟล์การกำหนดค่าในพื้นที่ไฟล์การกำหนดค่าส่วนกลางจะถูกละเว้น
ค่าที่ประกาศไว้ในไฟล์กำหนดค่าเหล่านี้แทนที่ค่าเริ่มต้น โปรดทราบว่า ไม่มี ไฟล์ .sync ถูกสร้างขึ้นตามค่าเริ่มต้น
ด้านล่างเรามีรายละเอียดสามสถานการณ์ทั่วไปที่ไฟล์กำหนดค่ามีประโยชน์/ต้องการ:
ส่วน [INTERFACE] ใช้เพื่อปรับแต่งการตั้งค่าที่เกี่ยวข้องกับเครือข่าย สมมติว่าเราต้องการซิงโครไนซ์ IDA กับดีบักเกอร์ที่ทำงานอยู่ในเครื่องเสมือน (หรือเพียงแค่โฮสต์อื่น) สถานการณ์การดีบักเคอร์เนลระยะไกลทั่วไป
เพียงสร้างไฟล์ .sync สองไฟล์:
[INTERFACE]
host=192.168.128.1
port=9234
มันบอกให้ปลั๊กอิน ret-sync IDA ฟังบนอินเตอร์เฟส 192.168.128.1 พร้อมพอร์ต 9234 มันไปโดยไม่บอกว่าอินเทอร์เฟซนี้จะต้องเข้าถึงได้จากโฮสต์ระยะไกลหรือเครื่องเสมือน
[INTERFACE]
host=192.168.128.1
port=9234
มันบอกปลั๊กอินของ Ret-Sync Debugger เพื่อเชื่อมต่อกับปลั๊กอิน Ret-Sync IDA ที่กำหนดค่าไว้ก่อนหน้านี้เพื่อฟังในอินเทอร์เฟซนี้
หมายเหตุ: คุณต้องระบุ IP จริงที่นี่และไม่ใช้ 0.0.0.0 นี่เป็นเพราะตัวแปรถูกใช้หลายแหล่งทั้งสำหรับการเชื่อมและการเชื่อมต่อดังนั้นการใช้ 0.0.0.0 จะส่งผลให้เกิดข้อผิดพลาดแปลก ๆ
[ALIASES]
ntoskrnl_vuln.exe=ntkrnlmp.exe
ส่วน [ALIASES] ใช้เพื่อปรับแต่งชื่อที่ใช้โดย disassembler (IDA/Ghidra) เพื่อลงทะเบียนโมดูลไปยังตัวจัดการ/โปรแกรมผู้จัดการโปรแกรม
โดยค่าเริ่มต้นปลั๊กอิน disassembler ใช้ชื่อของไฟล์อินพุต อย่างไรก็ตามหนึ่งอาจเปลี่ยนชื่อไฟล์ล่วงหน้าและมันไม่ตรงกับชื่อของกระบวนการจริงหรือโมดูลที่โหลดตามที่ผู้ดีทำการดีบักเห็น
ที่นี่เราเพียงแค่บอกกับ dispatcher เพื่อให้ตรงกับชื่อ ntkrnlmp.exe (ชื่อจริง) แทน ntoskrnl_vuln.exe (ชื่อ IDB)
การดีบักผู้สร้าง QT จะเปลี่ยนวิธีการบันทึกคำสั่ง GDB เนื่องจากสิ่งนี้จะรบกวนการซิงโครไนซ์จึงมีตัวเลือกในการใช้เอาต์พุต GDB ดิบสำหรับการซิงโครไนซ์แทนไฟล์ชั่วคราว ในการใช้ไฟล์กำหนดค่า. Sync
[GENERAL]
use_tmp_logging_file=false
หากคุณต้องการใช้การดีบัก QT สำหรับเป้าหมาย
/proc/<pid>/maps ในบางสถานการณ์เช่นการดีบักอุปกรณ์ฝังตัวผ่านเฟิร์มแวร์อนุกรมหรือดิบใน QEMU GDB ไม่ได้ตระหนักถึง PID และไม่สามารถเข้าถึง /proc/<pid>/maps
ในกรณีเหล่านี้ส่วน [INIT] ใช้เพื่อส่งผ่านบริบทที่กำหนดเองไปยังปลั๊กอิน ช่วยให้สามารถเอาชนะบางฟิลด์เช่นการแมป PID และหน่วยความจำ
.sync สารสกัด:
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
แต่ละรายการในการแมปคือ: mem_base , mem_end , mem_size , mem_name
ในบางสถานการณ์เช่นการดีบักอุปกรณ์ฝังตัวหรือเชื่อมต่อกับอินเทอร์เฟซดีบั๊กที่เรียบง่ายมันอาจจะสะดวกกว่าในการข้ามคุณสมบัติการคืนค่าที่อยู่อัตโนมัติที่ใช้ในปลั๊กอิน disassembler
ตัวเลือก use_raw_addr ได้รับการสนับสนุนเฉพาะสำหรับ Ghidra เท่านั้น ในการใช้ไฟล์กำหนดค่า. Sync:
[GENERAL]
use_raw_addr=true
ต้องใช้ IDA 7.x สาขา สำหรับเวอร์ชันเก่า (6.9x) โปรดดู release release ida6.9x
สำหรับการติดตั้ง IDA ให้คัดลอก Syncplugin.py และ retsync โฟลเดอร์จาก ext_ida ไปยังไดเรกทอรีปลั๊กอิน IDA ตัวอย่างเช่น:
C:Program FilesIDA Pro 7.4plugins%APPDATA%Hex-RaysIDA Proplugins~/.idapro/pluginsAlt-Shift-S ) หรือ Edit -> Plugins -> ret-sync [sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:Program FilesPython38python.exe" -u "C:UsersuserAppDataRoamingHex-RaysIDA Propluginsretsyncbroker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107
เพื่อแก้ไขปัญหาเกี่ยวกับตัวเลือก IDA Extension Two มีอยู่ในไฟล์ retsync/rsconfig.py :
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
การตั้งค่า LOG_LEVEL value เป็น logging.DEBUG ทำให้ปลั๊กอิน verbose มากขึ้น
การตั้งค่า LOG_TO_FILE_ENABLE ค่าเป็น True การบันทึกข้อมูลข้อยกเว้นจาก broker.py และ dispatcher.py เป็นไฟล์เฉพาะ ไฟล์บันทึกถูกสร้างขึ้นในโฟลเดอร์ %TMP% พร้อมรูปแบบชื่อ retsync.%s.err
ใช้เวอร์ชันที่สร้างไว้ล่วงหน้าจากโฟลเดอร์ ext_ghidra/dist หรือทำตามคำสั่งเพื่อสร้าง การสร้างส่วนขยายแต่ละอันรองรับรุ่นของ Ghidra ที่ระบุไว้ในชื่อไฟล์ของปลั๊กอินเท่านั้น เช่น ghidra_9.1_PUBLIC_20191104_retsync.zip สำหรับ Ghidra 9.1 สาธารณะ
apt install gradle$GHIDRA_DIR ด้วยไดเรกทอรีการติดตั้งของคุณ) cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR= $GHIDRA_DIRFile -> Install Extensions... คลิกที่เครื่องหมาย + และเลือก ext_ghidra/dist/ghidra_*_retsync.zip แล้วคลิกตกลง สิ่งนี้จะแยกโฟลเดอร์ retsync ออกจาก zip เป็น $GHIDRA_DIR/Extensions/Ghidra/ [*] retsync init
[>] programOpened: tm.sys
imageBase: 0x1c0000000
Alt+s )/ปิดการใช้งาน ( Alt+Shift+s )/รีสตาร์ท ( Alt+r ) การซิงโครไนซ์ หน้าต่างสถานะยังใช้ได้จาก Windows -> RetSyncPlugin โดยทั่วไปคุณต้องการวางมันลงด้านข้างเพื่อรวมเข้ากับหน้าต่างสภาพแวดล้อมของ Ghidra
การสนับสนุนของ Binary Ninja เป็นการทดลองตรวจสอบให้แน่ใจว่าได้สำรองข้อมูลฐานข้อมูลการวิเคราะห์ของคุณ
Ret-Sync ต้องการไบนารีนินจาเวอร์ชัน 2.2 อย่างน้อยที่สุดเช่นเดียวกับ Python 3 (ไม่รองรับ Python 2)
Ret-Sync ยังไม่ได้แจกจ่ายผ่านปลั๊กอินผู้จัดการปลั๊กอินของไบนารี จำเป็นต้องมีการติดตั้งด้วยตนเอง เพียงคัดลอกเนื้อหาของโฟลเดอร์ ext_bn ลงในโฟลเดอร์ปลั๊กอินของไบนารีนินจาตัวอย่างเช่น:
%APPDATA%Binary Ninjaplugins
หลังจากรีสตาร์ทนินจาไบนารีเอาต์พุตต่อไปนี้ควรอยู่ในหน้าต่างคอนโซล:
[sync] commands added
Loaded python3 plugin 'retsync'
ใช้ไบนารีที่สร้างไว้ล่วงหน้าหรือใช้โซลูชัน Visual Studio 2017 ที่ให้ไว้ใน ext_windbg (ดู https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes หากจำเป็น)
สิ่งนี้จะสร้างไฟล์ x64releasesync.dll
คุณจะต้องคัดลอกไฟล์ sync.dll ที่ได้ลงในเส้นทางขยาย Windbg ที่เหมาะสม
สำหรับ Windbg รุ่นก่อนหน้านี้เป็นเช่นนี้ (ระวังรสชาติ x86 / x64 ) ตัวอย่างเช่น
C:Program Files (x86)Windows Kits10Debuggersx64winextsync.dll
โฟลเดอร์สำหรับการจัดเก็บส่วนขยายดูเหมือนว่าจะขึ้นอยู่กับเส้นทางดังนั้นคุณต้องวางไว้หนึ่งในสถานที่สอบถาม
ตัวอย่างหนึ่งคือวางไว้ที่นี่:
C:UsersuserAppDataLocalMicrosoftWindowsAppssync.dll
.load ) 0:000> .load sync
[sync.dll] DebugExtensionInitialize, ExtensionApis loaded
0:000> !sync
[sync] No argument found, using default host (127.0.0.1:9100)
[sync] sync success, sock 0x5a8
[sync] probing sync
[sync] sync is now enabled with host 127.0.0.1
เช่นในหน้าต่างเอาต์พุตของ IDA
[*] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1
[*] << broker << dispatcher msg: new debugger client: dbg connect - HostMachineHostUser
[sync] set debugger dialect to windbg, enabling hotkeys
หากโมดูลปัจจุบันของ Windbg ตรงกับชื่อไฟล์ IDA
[sync] idb is enabled with the idb client matching the module name.
หมายเหตุ: หากคุณได้รับข้อผิดพลาดต่อไปนี้เป็นเพราะคุณยังไม่ได้คัดลอกไฟล์ไปยังโฟลเดอร์ที่ถูกต้องในขั้นตอนข้างต้น
0: kd> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n2
"The system cannot find the file specified."
Please check your debugger configuration and/or network access.
ข้อผิดพลาดด้านล่างมักหมายความว่า Windbg พยายามโหลดรสชาติที่ไม่ถูกต้องของส่วนขยายเช่น x64 แทน x86 sync.dll
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
"%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.
เมื่อ Windbg Preview โหลดทั้งปลั๊กอินทั้งสอง ( x86 และ x64 ) จากไดเรกทอรีเดียวกันหนึ่งสามารถเปลี่ยนชื่อไฟล์ x86 sync32.dll ได้
0:000> .load sync32
ext_gdb/sync.py ไปยังไดเรกทอรีที่คุณเลือก gdb> source sync.py
[sync] configuration file loaded 192.168.52.1:9100
[sync] commands added
การสนับสนุน LLDB เป็นการทดลองอย่างไรก็ตาม:
~/.lldbinit ) lldb> command script import sync
การสนับสนุน OLLYDBG 1.10 เป็นการทดลอง:
การสนับสนุน OLLYDBG2 เป็นการทดลองอย่างไรก็ตาม:
ขึ้นอยู่กับ testplugin, https://github.com/x64dbg/testplugin การสนับสนุน X64DBG เป็นการทดลอง: อย่างไรก็ตาม:
pluginsdk " ลงใน " ext_x64dbgx64dbg_sync ".d32 หรือ .dp64 ) ภายในไดเรกทอรีปลั๊กอินของ x64dbgสำหรับ debuggers เชิงบรรทัดคำสั่ง (ส่วนใหญ่ WINDBG และ GDB) ชุดคำสั่งจะถูกเปิดเผยโดย RET-Sync เพื่อช่วยในงานด้านวิศวกรรมย้อนกลับ
คำสั่งด้านล่างเป็นทั่วไป (WINDBG และ GDB) โปรดทราบว่า A ! จำเป็นต้องใช้คำนำหน้าบน WindBG (เช่น: sync ใน GDB , !sync ใน WINDBG)
| คำสั่งดีบักเกอร์ | คำอธิบาย |
|---|---|
synchelp | แสดงรายการคำสั่งที่มีอยู่พร้อมคำอธิบายสั้น ๆ |
sync | เริ่มการซิงโครไนซ์ |
syncoff | หยุดการซิงโครไนซ์ |
cmt [-a address] <string> | เพิ่มความคิดเห็นที่ IP ปัจจุบันใน disassembler |
rcmt [-a address] | รีเซ็ตความคิดเห็นที่ IP ปัจจุบันใน disassembler |
fcmt [-a address] <string> | เพิ่มฟังก์ชั่นความคิดเห็นสำหรับฟังก์ชั่นที่ IP ปัจจุบันอยู่ |
raddr <expression> | เพิ่มความคิดเห็นด้วยที่อยู่ที่ได้รับการประเมินจากนิพจน์ |
rln <expression> | รับสัญลักษณ์จาก disassembler สำหรับที่อยู่ที่กำหนด |
lbl [-a address] <string> | เพิ่มชื่อฉลากที่ IP ปัจจุบันใน disassembler |
cmd <string> | ดำเนินการคำสั่งในดีบักเกอร์และเพิ่มเอาต์พุตเป็นความคิดเห็นที่ IP ปัจจุบันใน disassembler |
bc <||on|off|set 0xBBGGRR> | เปิด/ปิดการใช้งานการระบายสีเส้นทางในการถอดชิ้นส่วน |
idblist | รับรายชื่อไคลเอนต์ IDB ทั้งหมดที่เชื่อมต่อกับ dispatcher |
syncmodauto <on|off> | เปิด/ปิดการใช้งานสวิตช์ Auto Disassembler ตามชื่อโมดูล |
idbn <n> | ตั้งค่า idb ที่ใช้งานอยู่เป็นไคลเอนต์ nth |
jmpto <expression> | |
jmpraw <expression> | หากเปิดใช้งาน IDB มุมมองของ Disassembler จะถูกซิงค์กับที่อยู่ผลลัพธ์ |
translate <base> <addr> <mod> | rebase ที่อยู่เกี่ยวกับชื่อและชดเชยของโมดูล |
คำสั่งเฉพาะ WINDBG:
| คำสั่งดีบักเกอร์ | คำอธิบาย |
|---|---|
curmod | แสดงโมดูล Infomation สำหรับการชดเชยคำสั่งปัจจุบัน (สำหรับการแก้ไขปัญหา) |
modlist | รายการโมดูลที่ปรับปรุงแล้ว |
idb <module name> | ตั้งค่าโมดูลที่กำหนดเป็น IDB ที่ใช้งานอยู่ (ดู modlist รุ่นปรับปรุง lm ) |
modmap <base> <size> <name> | โมดูลสังเคราะห์ ("faked") (กำหนดโดยใช้ที่อยู่พื้นฐานและขนาด) จะถูกเพิ่มลงในรายการภายในดีบักเกอร์ |
modunmap <base> | ลบโมดูลสังเคราะห์ที่แมปก่อนหน้านี้ที่ที่อยู่ฐาน |
modcheck <||md5> | ใช้เพื่อตรวจสอบว่าโมดูลปัจจุบันตรงกับไฟล์ของ IDB หรือไม่ (เช่น: โมดูลได้รับการอัปเดตแล้ว) |
bpcmds <||save|load|> | bpcmds wrapper, บันทึกและโหลด . bpcmds (รายการคำสั่ง breakpoints) เอาต์พุตไปยัง IDB ปัจจุบัน |
ks | Debugger Markup Language (DML) ปรับปรุงผลลัพธ์ของคำสั่ง kv |
คำสั่งเฉพาะ GDB:
| คำสั่งดีบักเกอร์ | คำอธิบาย |
|---|---|
bbt | backtrace ที่สวยงาม คล้ายกับ BT ใน GDB แต่ขอสัญลักษณ์จาก disassembler |
patch | Patch Bytes ใน Disassembler ตามบริบทสด |
bx | คล้ายกับ GDB X แต่ใช้สัญลักษณ์ สัญลักษณ์จะได้รับการแก้ไขโดย disassembler |
cc | ดำเนินการต่อเพื่อเคอร์เซอร์ใน disassembler |
ฟิลด์อินพุต Overwrite idb name หมายถึงการเปลี่ยนชื่อ IDB เริ่มต้น มันเป็นชื่อที่ปลั๊กอินใช้เพื่อลงทะเบียนกับ dispatcher IDB Automatic Switch ขึ้นอยู่กับการจับคู่ชื่อโมดูล ในกรณีที่มีชื่อที่ขัดแย้งกัน (เช่น foo.exe และ foo.dll ) สิ่งนี้สามารถใช้เพื่อความสะดวกในการจับคู่ โปรดทราบว่าหากคุณแก้ไขฟิลด์อินพุตในขณะที่การซิงค์เปิดใช้งานคุณต้องลงทะเบียนอีกครั้งด้วย dispatcher; สามารถทำได้ง่ายๆโดยใช้ปุ่ม " Restart "
เพื่อเป็นการเตือนความจำจึงเป็นไปได้ที่นามแฝงโดยค่าเริ่มต้นโดยใช้ไฟล์กำหนดค่า. .sync
Ret-Sync กำหนดทางลัดทั่วโลกเหล่านี้ใน IDA:
Alt-Shift-S เรียกใช้ปลั๊กอิน ret-syncCtrl-Shift-S สลับการซิงค์ทั่วโลกCtrl-H สลับการซิงค์ hex-raysนอกจากนี้ยังมีปุ่มสองปุ่มในแถบเครื่องมือดีบั๊กเพื่อสลับ Global และการซิงค์ hex-rays
Syncplugin.py ยังลงทะเบียนสายรัดสายรัดสายรัด
F2 - ตั้งเบรกพอยต์ที่ที่อยู่เคอร์เซอร์F3 - ตั้งค่าเบรกพอยต์เดียวที่ที่อยู่เคอร์เซอร์Ctrl-F2 - ตั้งค่าเบรกพอยต์ฮาร์ดแวร์ที่ที่อยู่เคอร์เซอร์Ctrl-F3 ตั้งค่าเบรกพอยต์ฮาร์ดแวร์แบบหนึ่งนัดที่ที่อยู่เคอร์เซอร์Alt-F2 - แปล (Rebase in Debugger) ที่อยู่เคอร์เซอร์ปัจจุบันAlt-F5 - ไปCtrl-Alt-F5 -RUN (GDB เท่านั้น)F10 - ขั้นตอนเดียวF11 - ร่องรอยเดี่ยวคำสั่งเหล่านี้จะใช้ได้เฉพาะเมื่อ IDB ปัจจุบันใช้งานอยู่ เมื่อเป็นไปได้พวกเขาก็ถูกนำไปใช้กับผู้อื่น Debuggers
เมื่อเปิด retsyncplugin แล้วคุณสามารถเพิ่มลงในหน้าต่าง Codebrowser โดย Drag'n'Drop อย่างง่าย:

หากคุณต้องการดูหลายโมดูลไฟล์จะต้องเปิดในตัวชม Codebrowser เดียวกันเพียงแค่ลาก 'DROP เพิ่มเติมในหน้าต่าง Codebrowser เพื่อรับผลลัพธ์ดังกล่าวข้างต้น
Ret-Sync กำหนดทางลัดทั่วโลกเหล่านี้ใน Ghidra:
Alt-S - เปิดใช้งานการซิงค์Alt-Shift-S ปิดการซิงค์Alt-R - การซิงค์ใหม่รีสตาร์ทAlt-Shift-R การกำหนดค่าการโหลดซ้ำนอกจากนี้ยังมีการใช้การเชื่อมโยงคำสั่ง debugger พวกเขาคล้ายกับที่มาจากส่วนขยายของ IDA (ยกเว้นคำสั่ง "GO")
F2 - ตั้งเบรกพอยต์ที่ที่อยู่เคอร์เซอร์Ctrl-F2 - ตั้งค่าเบรกพอยต์ฮาร์ดแวร์ที่ที่อยู่เคอร์เซอร์Alt-F3 ตั้งค่าจุดพักหนึ่งนัดที่ที่อยู่เคอร์เซอร์Ctrl-F3 ตั้งค่าเบรกพอยต์ฮาร์ดแวร์แบบหนึ่งนัดที่ที่อยู่เคอร์เซอร์Alt-F2 - แปล (Rebase in Debugger) ที่อยู่เคอร์เซอร์ปัจจุบันF5 - ไปAlt-F5 - Run (GDB เท่านั้น)F10 - ขั้นตอนเดียวF11 - ร่องรอยเดี่ยว Ret-Sync กำหนดทางลัดทั่วโลกเหล่านี้ใน Binary Ninja:
Alt-S - เปิดใช้งานการซิงค์Alt-Shift-S ปิดการซิงค์นอกจากนี้ยังมีการใช้การเชื่อมโยงคำสั่ง debugger พวกเขาคล้ายกับที่มาจากส่วนขยายของ IDA
F2 - ตั้งเบรกพอยต์ที่ที่อยู่เคอร์เซอร์Ctrl-F2 - ตั้งค่าเบรกพอยต์ฮาร์ดแวร์ที่ที่อยู่เคอร์เซอร์Alt-F3 ตั้งค่าจุดพักหนึ่งนัดที่ที่อยู่เคอร์เซอร์Ctrl-F3 ตั้งค่าเบรกพอยต์ฮาร์ดแวร์แบบหนึ่งนัดที่ที่อยู่เคอร์เซอร์Alt-F2 - แปล (Rebase in Debugger) ที่อยู่เคอร์เซอร์ปัจจุบันAlt-F5 - ไปF10 - ขั้นตอนเดียวF11 - ร่องรอยเดี่ยว [WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
0:000:x86> dd esp 8
0028ed94 00000000 00433845 0028eebc 00000032
0028eda4 0028f88c 00000064 002b049e 00000110
0:000:x86> !cmt 0028ed94 00000000 00433845 0028eebc 00000032
[sync.dll] !cmt called
[IDA]
.text:00430DB1 push edi ; 0028ed94 00000000 00433845 0028eebc 00000032
[WinDbg]
0:000:x86> !rcmt
[sync] !rcmt called
[IDA]
.text:00430DB1 push edi
[WinDbg]
0:000:x86> !fcmt decodes buffer with key
[sync] !fcmt called
[IDA]
.text:004012E0 ; decodes buffer with key
.text:004012E0 public decrypt_func
.text:004012E0 decrypt_func proc near
.text:004012E0 push ebp
หมายเหตุ: เรียกคำสั่งนี้โดยไม่มีอาร์กิวเมนต์รีเซ็ตความคิดเห็นของฟังก์ชัน
[WinDbg]
0:000:x86> !lbl meaningful_label
[sync] !lbl called
[IDA]
.text:000000000040271E meaningful_label:
.text:000000000040271E mov rdx, rsp
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
[sync.dll] !cmd r edi
[IDA]
.text:00430DB1 push edi ; edi=00000064
[WinDbg]
0:000> !idblist
> currently connected idb(s):
[0] target.exe
[WinDbg]
0:000> !syncmodauto off
[IDA]
[*] << broker << dispatcher msg: sync mode auto set to off
[WinDbg]
0:000:> !idbn 0
> current idb set to 0
ในตัวอย่างนี้ไคลเอนต์ IDB ที่ใช้งานปัจจุบันจะถูกตั้งค่าเป็น:
[0] target.exe.
Alt-F2 ), รีบที่อยู่ที่เกี่ยวข้องกับชื่อและออฟเซ็ตของโมดูล ! cmt , ! คำสั่ง rcmt และ ! fcmt รองรับตัวเลือกที่อยู่เสริม: -a หรือ --address ที่อยู่ควรผ่านเป็นค่าเลขฐานสิบหก การแยกวิเคราะห์คำสั่งขึ้นอยู่กับโมดูล argparse ของ Python เพื่อหยุดการใช้การแยกวิเคราะห์บรรทัด --
[WinDbg]
0:000:x86> !cmt -a 0x430DB2 comment
ที่อยู่จะต้องเป็นที่อยู่ของคำสั่งที่ถูกต้อง
ซิงค์กับโฮสต์:
gdb> sync
[sync] sync is now enabled with host 192.168.52.1
<not running>
gdb> r
Starting program: /bin/ls
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
ใช้คำสั่ง โดยไม่มี "!" คำนำหน้า
(gdb) cmd x/i $pc
[sync] command output: => 0x8049ca3: push edi
(gdb) synchelp
[sync] extension commands help:
> sync <host>
> syncoff
> cmt [-a address] <string>
> rcmt [-a address] <string>
> fcmt [-a address] <string>
> cmd <string>
> bc <on|off|>
> rln <address>
> bbt <symbol>
> patch <addr> <count> <size>
> bx /i <symbol>
> cc
> translate <base> <addr> <mod>
(gdb) bt
#0 0x0000000000a91a73 in ?? ()
#1 0x0000000000a6d994 in ?? ()
#2 0x0000000000a89125 in ?? ()
#3 0x0000000000a8a574 in ?? ()
#4 0x000000000044f83b in ?? ()
#5 0x0000000000000000 in ?? ()
(gdb) bbt
#0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
#1 0x0000000000a6d994 in catcher ()
#2 0x0000000000a89125 in IKEProcessMsg ()
#3 0x0000000000a8a574 in IkeDaemon ()
#4 0x000000000044f83b in sub_44F7D0 ()
#5 0x0000000000000000 in ()
F3 เพื่อตั้งค่าจุดพักหนึ่งนัดและ F5 เพื่อดำเนินการต่อ สิ่งนี้มีประโยชน์หากคุณต้องการทำจาก GDB (gdb) b* 0xA91A73
Breakpoint 1 at 0xa91a73
(gdb) c
Continuing.
Breakpoint 1, 0x0000000000a91a73 in ?? ()
(gdb) cc
[sync] current cursor: 0xa91a7f
[sync] reached successfully
(gdb)
lldb> process launch -s
lldb> sync
[sync] connecting to localhost
[sync] sync is now enabled with host localhost
[sync] event handler started
lldb> synchelp
[sync] extension commands help:
> sync <host> = synchronize with <host> or the default value
> syncoff = stop synchronization
> cmt <string> = add comment at current eip in IDA
> rcmt <string> = reset comments at current eip in IDA
> fcmt <string> = add a function comment for 'f = get_func(eip)' in IDA
> cmd <string> = execute command <string> and add its output as comment at current eip in IDA
> bc <on|off|> = enable/disable path coloring in IDA
color a single instruction at current eip if called without argument
lldb> cmt mooo
Alt+s )/ปิดใช้งาน ( Alt+u ) Ctrl+s )/ปิดใช้งาน ( Ctrl+u )เนื่องจากสถานะเบต้าของ OLLYDBG2 API จึงมีการใช้งานคุณสมบัติต่อไปนี้เท่านั้น:
F7 ; F8 สำหรับการก้าว]CTRL+; -CTRL+: ] ใช้เมนูปลั๊กอินหรือคำสั่งเปิดใช้งาน (" !sync" ) หรือปิดการใช้งาน (" !syncoff ") การซิงโครไนซ์
ใช้คำสั่ง
[sync] synchelp command!
[sync] extension commands help:
> !sync = synchronize with <host from conf> or the default value
> !syncoff = stop synchronization
> !syncmodauto <on | off> = enable / disable idb auto switch based on module name
> !synchelp = display this help
> !cmt <string> = add comment at current eip in IDA
> !rcmt <string> = reset comments at current eip in IDA
> !idblist = display list of all IDB clients connected to the dispatcher
> !idb <module name> = set given module as the active idb (see !idblist)
> !idbn <n> = set active idb to the n_th client. n should be a valid decimal value
> !translate <base> <addr> <mod> = rebase an address with respect to local module's base
หมายเหตุ Alt-F2 การใช้คำสั่ง ! Translate!
หนึ่งอาจต้องการใช้คุณสมบัติหลัก ของ ret-sync (การซิงค์ตำแหน่งกับ disassembler, ความละเอียดของสัญลักษณ์) แม้ว่าสภาพแวดล้อมการดีบักเต็มรูปแบบไม่พร้อมใช้งานหรือด้วยเครื่องมือที่กำหนดเอง ด้วยเหตุนี้จึงมีการสกัดไลบรารีมินิมัลลิสต์
ตัวอย่างด้านล่างแสดงให้เห็นถึงการใช้งานของไลบรารี Python ด้วยสคริปต์ที่เดินผ่านเอาต์พุตของเครื่องมือบันทึก/ติดตามตามเหตุการณ์
from sync import *
HOST = '127.0.0.1'
MAPPINGS = [
[ 0x555555400000 , 0x555555402000 , 0x2000 , " /bin/tempfile" ],
[ 0x7ffff7dd3000 , 0x7ffff7dfc000 , 0x29000 , " /lib/x86_64-linux-gnu/ld-2.27.so" ],
[ 0x7ffff7ff7000 , 0x7ffff7ffb000 , 0x4000 , " [vvar]" ],
[ 0x7ffff7ffb000 , 0x7ffff7ffc000 , 0x1000 , " [vdso]" ],
[ 0x7ffffffde000 , 0x7ffffffff000 , 0x21000 , " [stack]" ],
]
EVENTS = [
[ 0x0000555555400e74 , "malloc" ],
[ 0x0000555555400eb3 , "open" ],
[ 0x0000555555400ee8 , "exit" ]
]
synctool = Sync ( HOST , MAPPINGS )
for e in EVENTS :
offset , name = e
synctool . invoke ( offset )
print ( " 0x%08x - %s" % ( offset , name ))
print ( "[>] press enter for next event" )
input ()ในขณะที่มุ่งเน้นไปที่การวิเคราะห์แบบไดนามิก (debuggers) ในขั้นต้นมันเป็นหลักสูตรที่สามารถขยายปลั๊กอินที่ตั้งค่าและรวมเข้ากับเครื่องมืออื่น ๆ
ทรัพยากรอื่น ๆ :
กับ GDB:
กับ Windbg:
g ') สิ่งนี้อาจทำให้เกิดการช้าลงอย่างมากหากมีเหตุการณ์เหล่านี้มากเกินไป มีการใช้การแก้ไขที่ จำกัด แล้วทางออกที่ดีที่สุดยังคงซิงค์กันชั่วคราวกับ Ghidra:
กับ IDA:
ความขัดแย้ง:
.sync ทั่วโลกเพื่อกำหนดพอร์ตอื่น [INTERFACE]
host=127.0.0.1
port=9234
Ret-Sync เป็นซอฟต์แวร์ฟรี: คุณสามารถแจกจ่ายใหม่และ/หรือแก้ไขภายใต้ข้อกำหนดของใบอนุญาตสาธารณะ GNU ทั่วไปที่เผยแพร่โดย Free Software Foundation ไม่ว่าจะเป็นเวอร์ชัน 3 ของใบอนุญาตหรือ (ตามตัวเลือกของคุณ) รุ่นใหม่ ๆ
โปรแกรมนี้มีการแจกจ่ายด้วยความหวังว่าจะมีประโยชน์ แต่ไม่มีการรับประกันใด ๆ โดยไม่มีการรับประกันโดยนัยเกี่ยวกับความสามารถในการค้าหรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูใบอนุญาตสาธารณะ GNU ทั่วไปสำหรับรายละเอียดเพิ่มเติม
คุณควรได้รับสำเนาใบอนุญาตสาธารณะ GNU ทั่วไปพร้อมกับโปรแกรมนี้ ถ้าไม่ดู http://www.gnu.org/licenses/
ปลั๊กอิน Binary Ninja ได้รับการปล่อยตัวภายใต้ใบอนุญาต MIT
Hail to Bruce Dang, Stalkr, @Ivanlef0u, Damien Aumaître, Sébastien Renaud และKévin Szkudlapski, @ M00dy , @Saidelike, Xavier Mehrenberger, Ben64, Raphaël Rigo Ilfak Guilfanov, Igor Skochinsky และ Arnaud Diederen สำหรับความช่วยเหลือของพวกเขาเกี่ยวกับภายในของ Ida และการสนับสนุนที่โดดเด่น ขอขอบคุณ Jordan Wiens และ Vector 35 ในที่สุดขอขอบคุณผู้สนับสนุนทุกคนและทุกคนที่รายงานปัญหา/ข้อบกพร่อง