கூட்டத்தின் ஒரு பகுதியாக 0x0A DC7831
எமுலேட்டரில் சாதன ஃபார்ம்வேரை எவ்வாறு இயக்குவது, பிழைத்திருத்தியுடன் தொடர்புகொள்வது மற்றும் ஃபார்ம்வேரின் சிறிய டைனமிக் பகுப்பாய்வை எவ்வாறு செய்வது என்பதை இந்தக் கட்டுரையில் விவரிப்போம்.
முன்வரலாறு
வெகு தொலைவில் ஒரு விண்மீன் மண்டலத்தில் நீண்ட காலத்திற்கு முன்பு
சில ஆண்டுகளுக்கு முன்பு எங்கள் ஆய்வகத்தில் ஒரு சாதனத்தின் ஃபார்ம்வேரை ஆராய வேண்டிய அவசியம் இருந்தது. ஃபார்ம்வேர் ஒரு பூட்லோடருடன் சுருக்கப்பட்டு திறக்கப்பட்டது. அவர் இதை மிகவும் சிக்கலான முறையில் செய்தார், நினைவகத்தில் தரவுகளை பல முறை மாற்றினார். ஃபார்ம்வேர் பின்னர் சாதனங்களுடன் தீவிரமாக தொடர்பு கொண்டது. இவை அனைத்தும் MIPS மையத்தில்.
புறநிலை காரணங்களுக்காக, கிடைக்கக்கூடிய முன்மாதிரிகள் எங்களுக்கு பொருந்தவில்லை, ஆனால் நாங்கள் இன்னும் குறியீட்டை இயக்க விரும்புகிறோம். எங்கள் சொந்த முன்மாதிரியை உருவாக்க முடிவு செய்தோம், இது குறைந்தபட்சம் செய்யும் மற்றும் முக்கிய ஃபார்ம்வேரைத் திறக்க அனுமதிக்கும். நாங்கள் அதை முயற்சித்தோம், அது வேலை செய்தது. முக்கிய ஃபார்ம்வேரைச் செய்ய, சாதனங்களைச் சேர்த்தால் என்ன செய்வது என்று நாங்கள் நினைத்தோம். இது மிகவும் வலிக்கவில்லை - அதுவும் பலனளித்தது. நாங்கள் மீண்டும் யோசித்து ஒரு முழு அளவிலான எமுலேட்டரை உருவாக்க முடிவு செய்தோம்.
இதன் விளைவாக ஒரு கணினி அமைப்பு முன்மாதிரி இருந்தது
ஏன் கோபிகேட்?
வார்த்தைகளில் ஒரு நாடகம் உள்ளது.
- அவனுடைய பெயரும் (ஆங்கிலம், பெயர்ச்சொல் [ˈkɒpɪkæt]) - பின்பற்றுபவர், பின்பற்றுபவர்
- பூனை (ஆங்கிலம், பெயர்ச்சொல் [ˈkæt]) - பூனை, பூனை - திட்டத்தை உருவாக்கியவர்களில் ஒருவருக்கு பிடித்த விலங்கு
- "K" என்ற எழுத்து கோட்லின் நிரலாக்க மொழியிலிருந்து வந்தது
காப்பிகேட்
முன்மாதிரியை உருவாக்கும் போது, மிகவும் குறிப்பிட்ட இலக்குகள் அமைக்கப்பட்டன:
- புதிய சாதனங்கள், தொகுதிகள், செயலி கோர்களை விரைவாக உருவாக்கும் திறன்;
- பல்வேறு தொகுதிகளில் இருந்து ஒரு மெய்நிகர் சாதனத்தை இணைக்கும் திறன்;
- மெய்நிகர் சாதனத்தின் நினைவகத்தில் எந்த பைனரி தரவையும் (நிலைபொருள்) ஏற்றும் திறன்;
- ஸ்னாப்ஷாட்களுடன் பணிபுரியும் திறன் (கணினி நிலையின் ஸ்னாப்ஷாட்கள்);
- உள்ளமைக்கப்பட்ட பிழைத்திருத்தி மூலம் முன்மாதிரியுடன் தொடர்பு கொள்ளும் திறன்;
- வளர்ச்சிக்கு நல்ல நவீன மொழி.
இதன் விளைவாக, கோட்லின், ஒரு பஸ் கட்டமைப்பை (மட்யூல்கள் ஒன்றுக்கொன்று மெய்நிகர் தரவு பேருந்துகள் மூலம் தொடர்பு கொள்ளும்போது), சாதன விளக்க வடிவமாக JSON மற்றும் பிழைத்திருத்தியுடன் தொடர்புகொள்வதற்கான நெறிமுறையாக GDB RSP தேர்வு செய்யப்பட்டது.
வளர்ச்சி இரண்டு ஆண்டுகளுக்கும் மேலாக நடந்து வருகிறது மற்றும் தீவிரமாக நடந்து வருகிறது. இந்த நேரத்தில், MIPS, x86, V850ES, ARM மற்றும் PowerPC செயலி கோர்கள் செயல்படுத்தப்பட்டன.
திட்டம் வளர்ந்து வருகிறது, அதை பரந்த பொதுமக்களுக்கு வழங்குவதற்கான நேரம் இது. திட்டத்தின் விரிவான விளக்கத்தை நாங்கள் பின்னர் செய்வோம், ஆனால் இப்போதைக்கு நாங்கள் Kopycat ஐப் பயன்படுத்துவதில் கவனம் செலுத்துவோம்.
மிகவும் பொறுமையற்றவர்களுக்கு, எமுலேட்டரின் விளம்பரப் பதிப்பை இதிலிருந்து பதிவிறக்கம் செய்யலாம்
எமுலேட்டரில் காண்டாமிருகம்
முன்னதாக SMARTRHINO-2018 மாநாட்டிற்காக, தலைகீழ் பொறியியல் திறன்களை கற்பிப்பதற்காக ஒரு சோதனை சாதனம் "Rhinoceros" உருவாக்கப்பட்டது என்பதை நினைவில் கொள்வோம். நிலையான நிலைபொருள் பகுப்பாய்வு செயல்முறை விவரிக்கப்பட்டுள்ளது
இப்போது "ஸ்பீக்கர்களை" சேர்க்க முயற்சிப்போம் மற்றும் எமுலேட்டரில் ஃபார்ம்வேரை இயக்கவும்.
நாம் வேண்டும்:
1) ஜாவா 1.8
2) பைதான் மற்றும் தொகுதி
விண்டோஸுக்கு:
1)
2)
லினக்ஸுக்கு:
1) சோகாட்
நீங்கள் ஒரு GDB கிளையண்டாக Eclipse, IDA Pro அல்லது radare2 ஐப் பயன்படுத்தலாம்.
இது எப்படி வேலை செய்கிறது?
எமுலேட்டரில் ஃபார்ம்வேரைச் செய்ய, ஒரு மெய்நிகர் சாதனத்தை "அசெம்பிள்" செய்வது அவசியம், இது ஒரு உண்மையான சாதனத்தின் அனலாக் ஆகும்.
உண்மையான சாதனம் ("ரினோ") தொகுதி வரைபடத்தில் காட்டப்படலாம்:
முன்மாதிரி ஒரு மட்டு அமைப்பைக் கொண்டுள்ளது மற்றும் இறுதி மெய்நிகர் சாதனம் JSON கோப்பில் விவரிக்கப்படலாம்.
JSON 105 வரிகள்
{
"top": true,
// Plugin name should be the same as file name (or full path from library start)
"plugin": "rhino",
// Directory where plugin places
"library": "user",
// Plugin parameters (constructor parameters if jar-plugin version)
"params": [
{ "name": "tty_dbg", "type": "String"},
{ "name": "tty_bt", "type": "String"},
{ "name": "firmware", "type": "String", "default": "NUL"}
],
// Plugin outer ports
"ports": [ ],
// Plugin internal buses
"buses": [
{ "name": "mem", "size": "BUS30" },
{ "name": "nand", "size": "4" },
{ "name": "gpio", "size": "BUS32" }
],
// Plugin internal components
"modules": [
{
"name": "u1_stm32",
"plugin": "STM32F042",
"library": "mcu",
"params": {
"firmware:String": "params.firmware"
}
},
{
"name": "usart_debug",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_dbg"
}
},
{
"name": "term_bt",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_bt"
}
},
{
"name": "bluetooth",
"plugin": "BT",
"library": "mcu"
},
{ "name": "led_0", "plugin": "LED", "library": "mcu" },
{ "name": "led_1", "plugin": "LED", "library": "mcu" },
{ "name": "led_2", "plugin": "LED", "library": "mcu" },
{ "name": "led_3", "plugin": "LED", "library": "mcu" },
{ "name": "led_4", "plugin": "LED", "library": "mcu" },
{ "name": "led_5", "plugin": "LED", "library": "mcu" },
{ "name": "led_6", "plugin": "LED", "library": "mcu" },
{ "name": "led_7", "plugin": "LED", "library": "mcu" },
{ "name": "led_8", "plugin": "LED", "library": "mcu" },
{ "name": "led_9", "plugin": "LED", "library": "mcu" },
{ "name": "led_10", "plugin": "LED", "library": "mcu" },
{ "name": "led_11", "plugin": "LED", "library": "mcu" },
{ "name": "led_12", "plugin": "LED", "library": "mcu" },
{ "name": "led_13", "plugin": "LED", "library": "mcu" },
{ "name": "led_14", "plugin": "LED", "library": "mcu" },
{ "name": "led_15", "plugin": "LED", "library": "mcu" }
],
// Plugin connection between components
"connections": [
[ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
[ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],
[ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
[ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],
[ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
[ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],
[ "led_0.ports.pin", "u1_stm32.buses.pin_output_a", "0x00"],
[ "led_1.ports.pin", "u1_stm32.buses.pin_output_a", "0x01"],
[ "led_2.ports.pin", "u1_stm32.buses.pin_output_a", "0x02"],
[ "led_3.ports.pin", "u1_stm32.buses.pin_output_a", "0x03"],
[ "led_4.ports.pin", "u1_stm32.buses.pin_output_a", "0x04"],
[ "led_5.ports.pin", "u1_stm32.buses.pin_output_a", "0x05"],
[ "led_6.ports.pin", "u1_stm32.buses.pin_output_a", "0x06"],
[ "led_7.ports.pin", "u1_stm32.buses.pin_output_a", "0x07"],
[ "led_8.ports.pin", "u1_stm32.buses.pin_output_a", "0x08"],
[ "led_9.ports.pin", "u1_stm32.buses.pin_output_a", "0x09"],
[ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
[ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
[ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
[ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
[ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
[ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
]
}
அளவுருவுக்கு கவனம் செலுத்துங்கள் தளநிரல் பிரிவில் அளவுருக்கள் ஃபார்ம்வேராக மெய்நிகர் சாதனத்தில் ஏற்றக்கூடிய கோப்பின் பெயர்.
மெய்நிகர் சாதனம் மற்றும் முக்கிய இயக்க முறைமையுடன் அதன் தொடர்பு பின்வரும் வரைபடத்தால் குறிப்பிடப்படலாம்:
எமுலேட்டரின் தற்போதைய சோதனை நிகழ்வு பிரதான OS இன் COM போர்ட்களுடனான தொடர்புகளை உள்ளடக்கியது (புளூடூத் தொகுதிக்கான UART மற்றும் UART பிழைத்திருத்தம்). இவை சாதனங்கள் இணைக்கப்பட்டுள்ள உண்மையான போர்ட்களாக இருக்கலாம் அல்லது மெய்நிகர் COM போர்ட்களாக இருக்கலாம் (இதற்கு உங்களுக்குத் தேவை com0com/socat).
வெளியில் இருந்து முன்மாதிரியுடன் தொடர்பு கொள்ள தற்போது இரண்டு முக்கிய வழிகள் உள்ளன:
- GDB RSP நெறிமுறை (அதன்படி, இந்த நெறிமுறையை ஆதரிக்கும் கருவிகள் Eclipse / IDA / radare2);
- உள் எமுலேட்டர் கட்டளை வரி (Argparse அல்லது Python).
மெய்நிகர் COM போர்ட்கள்
டெர்மினல் வழியாக உள்ளூர் கணினியில் உள்ள மெய்நிகர் சாதனத்தின் UART உடன் தொடர்பு கொள்ள, நீங்கள் ஒரு ஜோடி மெய்நிகர் COM போர்ட்களை உருவாக்க வேண்டும். எங்கள் விஷயத்தில், ஒரு போர்ட் எமுலேட்டரால் பயன்படுத்தப்படுகிறது, இரண்டாவது டெர்மினல் நிரலால் (PuTTY அல்லது திரை) பயன்படுத்தப்படுகிறது:
com0com ஐப் பயன்படுத்துதல்
மெய்நிகர் COM போர்ட்கள் com0com கிட் (கன்சோல் பதிப்பு -) இலிருந்து அமைவு பயன்பாட்டைப் பயன்படுத்தி கட்டமைக்கப்படுகின்றன சி:நிரல் கோப்புகள் (x86)com0comsetupс.exe, அல்லது GUI பதிப்பு - சி:நிரல் கோப்புகள் (x86)com0comsetupg.exe):
பெட்டிகளை சரிபார்க்கவும் இடையக மீறலை இயக்கு உருவாக்கப்பட்ட அனைத்து மெய்நிகர் போர்ட்களுக்கும், இல்லையெனில் முன்மாதிரி COM போர்ட்டிலிருந்து பதிலுக்காக காத்திருக்கும்.
சோகாட்டைப் பயன்படுத்துதல்
UNIX கணினிகளில், மெய்நிகர் COM போர்ட்கள் socat பயன்பாட்டைப் பயன்படுத்தி எமுலேட்டரால் தானாகவே உருவாக்கப்படுகின்றன; இதைச் செய்ய, முன்மாதிரியைத் தொடங்கும் போது போர்ட் பெயரில் முன்னொட்டைக் குறிப்பிடவும். socat:
.
உள் கட்டளை வரி இடைமுகம் (Argparse அல்லது Python)
Kopycat ஒரு கன்சோல் பயன்பாடாகும் என்பதால், எமுலேட்டர் அதன் பொருள்கள் மற்றும் மாறிகளுடன் தொடர்புகொள்வதற்கு இரண்டு கட்டளை வரி இடைமுக விருப்பங்களை வழங்குகிறது: Argparse மற்றும் Python.
Argparse என்பது Copycat இல் கட்டமைக்கப்பட்ட CLI மற்றும் அனைவருக்கும் எப்போதும் கிடைக்கும்.
ஒரு மாற்று CLI என்பது பைதான் மொழிபெயர்ப்பாளர். இதைப் பயன்படுத்த, நீங்கள் Jep Python தொகுதியை நிறுவி, பைத்தானுடன் பணிபுரிய முன்மாதிரியை உள்ளமைக்க வேண்டும் (பயனரின் பிரதான கணினியில் நிறுவப்பட்ட பைதான் மொழிபெயர்ப்பான் பயன்படுத்தப்படும்).
பைதான் தொகுதி Jep ஐ நிறுவுகிறது
லினக்ஸ் ஜெப்பின் கீழ் பைப் வழியாக நிறுவலாம்:
pip install jep
விண்டோஸில் Jep ஐ நிறுவ, நீங்கள் முதலில் Windows SDK மற்றும் தொடர்புடைய Microsoft Visual Studio ஐ நிறுவ வேண்டும். நாங்கள் அதை உங்களுக்கு கொஞ்சம் எளிதாக்கியுள்ளோம்
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Jep இன் நிறுவலைச் சரிபார்க்க, நீங்கள் கட்டளை வரியில் இயக்க வேண்டும்:
python -c "import jep"
பதிலில் பின்வரும் செய்தி பெறப்பட வேண்டும்:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
உங்கள் கணினிக்கான எமுலேட்டர் தொகுதி கோப்பில் (copycat.bat - விண்டோஸுக்கு, நக்கல் - லினக்ஸுக்கு) அளவுருக்களின் பட்டியலுக்கு DEFAULT_JVM_OPTS
கூடுதல் அளவுருவைச் சேர்க்கவும் Djava.library.path
— இது நிறுவப்பட்ட ஜெப் தொகுதிக்கான பாதையைக் கொண்டிருக்க வேண்டும்.
விண்டோஸின் முடிவு இது போன்ற ஒரு வரியாக இருக்க வேண்டும்:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
கோபிகேட்டைத் தொடங்குதல்
எமுலேட்டர் ஒரு கன்சோல் JVM பயன்பாடாகும். துவக்கமானது இயக்க முறைமை கட்டளை வரி ஸ்கிரிப்ட் (sh/cmd) மூலம் மேற்கொள்ளப்படுகிறது.
விண்டோஸின் கீழ் இயங்குவதற்கான கட்டளை:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Socat பயன்பாட்டைப் பயன்படுத்தி லினக்ஸின் கீழ் இயங்குவதற்கான கட்டளை:
./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28
-g 23646
— GDB சேவையகத்திற்கான அணுகலுக்கு TCP போர்ட் திறக்கப்படும்;-n rhino
- பிரதான கணினி தொகுதியின் பெயர் (அசெம்பிள் செய்யப்பட்ட சாதனம்);-l user
- பிரதான தொகுதியைத் தேட நூலகத்தின் பெயர்;-y library
- சாதனத்தில் சேர்க்கப்பட்டுள்ள தொகுதிகளைத் தேடுவதற்கான பாதை;firmwarerhino_pass.bin
- ஃபார்ம்வேர் கோப்பிற்கான பாதை;- COM26 மற்றும் COM28 ஆகியவை மெய்நிகர் COM போர்ட்கள்.
இதன் விளைவாக, ஒரு அறிவுறுத்தல் காட்டப்படும் Python >
(அல்லது Argparse >
):
18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >
IDA Pro உடனான தொடர்பு
சோதனையை எளிதாக்க, ஐடிஏவில் பகுப்பாய்விற்கான ஆதாரக் கோப்பாக ரினோ ஃபார்ம்வேரைப் பயன்படுத்துகிறோம்
மெட்டா தகவல் இல்லாமல் முக்கிய ஃபார்ம்வேரையும் பயன்படுத்தலாம்.
ஐடிஏ ப்ரோவில் கோபிகேட்டைத் தொடங்கிய பிறகு, பிழைத்திருத்தம் மெனுவில் உள்ள உருப்படிக்குச் செல்லவும்.பிழைத்திருத்தியை மாற்று…"மற்றும் தேர்ந்தெடு"தொலைநிலை GDB பிழைத்திருத்தி". அடுத்து, இணைப்பை அமைக்கவும்: மெனு பிழைத்திருத்தி - செயல்முறை விருப்பங்கள்...
மதிப்புகளை அமைக்கவும்:
- பயன்பாடு - எந்த மதிப்பும்
- ஹோஸ்ட் பெயர்: 127.0.0.1 (அல்லது Kopycat இயங்கும் தொலை இயந்திரத்தின் IP முகவரி)
- போர்ட்: 23946
இப்போது பிழைத்திருத்த பொத்தான் கிடைக்கும் (F9 விசை):
எமுலேட்டரில் உள்ள பிழைத்திருத்தி தொகுதியுடன் இணைக்க அதைக் கிளிக் செய்யவும். IDA பிழைத்திருத்த பயன்முறையில் செல்கிறது, கூடுதல் சாளரங்கள் கிடைக்கும்: பதிவேடுகள் பற்றிய தகவல்கள், ஸ்டேக் பற்றிய தகவல்கள்.
இப்போது பிழைத்திருத்தியின் அனைத்து நிலையான அம்சங்களையும் பயன்படுத்தலாம்:
- வழிமுறைகளை படிப்படியாக செயல்படுத்துதல் (அடியெடுத்து வைக்கவும் и மேலே படி - விசைகள் முறையே F7 மற்றும் F8);
- செயல்படுத்தலைத் தொடங்குதல் மற்றும் இடைநிறுத்துதல்;
- குறியீடு மற்றும் தரவு (F2 விசை) இரண்டிற்கும் பிரேக் பாயின்ட்களை உருவாக்குகிறது.
பிழைத்திருத்தியுடன் இணைப்பது என்பது ஃபார்ம்வேர் குறியீட்டை இயக்குவதைக் குறிக்காது. தற்போதைய செயலாக்க நிலை முகவரியாக இருக்க வேண்டும் 0x08006A74
- செயல்பாட்டின் ஆரம்பம் மீட்டமை_ஹேண்ட்லர். நீங்கள் பட்டியலை கீழே உருட்டினால், செயல்பாட்டு அழைப்பைக் காணலாம் முக்கிய. இந்த வரியில் கர்சரை வைக்கலாம் (முகவரி 0x08006ABE
) மற்றும் அறுவை சிகிச்சை செய்யவும் கர்சர் வரை இயக்கவும் (விசை F4).
அடுத்து, செயல்பாட்டை உள்ளிட F7 ஐ அழுத்தவும் முக்கிய.
நீங்கள் கட்டளையை இயக்கினால் செயல்முறையைத் தொடரவும் (F9 விசை), பின்னர் "தயவுசெய்து காத்திருக்கவும்" சாளரம் ஒரு பொத்தானுடன் தோன்றும் Suspend:
நீங்கள் அழுத்தும் போது Suspend ஃபார்ம்வேர் குறியீட்டின் செயலாக்கம் இடைநிறுத்தப்பட்டுள்ளது மற்றும் அது குறுக்கிடப்பட்ட குறியீட்டில் உள்ள அதே முகவரியிலிருந்து தொடரலாம்.
நீங்கள் குறியீட்டை தொடர்ந்து இயக்கினால், மெய்நிகர் COM போர்ட்களுடன் இணைக்கப்பட்ட டெர்மினல்களில் பின்வரும் வரிகளைக் காண்பீர்கள்:
"ஸ்டேட் பைபாஸ்" வரியின் இருப்பு, மெய்நிகர் புளூடூத் தொகுதி பயனரின் COM போர்ட்டில் இருந்து தரவைப் பெறும் முறைக்கு மாறியுள்ளது என்பதைக் குறிக்கிறது.
இப்போது புளூடூத் முனையத்தில் (படத்தில் உள்ள COM29) நீங்கள் Rhino நெறிமுறையின்படி கட்டளைகளை உள்ளிடலாம். எடுத்துக்காட்டாக, "MEOW" கட்டளையானது "mur-mur" என்ற சரத்தை புளூடூத் முனையத்திற்குத் திருப்பிவிடும்:
என்னை முழுமையாக பின்பற்ற வேண்டாம்
முன்மாதிரியை உருவாக்கும்போது, ஒரு குறிப்பிட்ட சாதனத்தின் விவரம்/முன்மாதிரியின் அளவை நீங்கள் தேர்வு செய்யலாம். எடுத்துக்காட்டாக, புளூடூத் தொகுதியை வெவ்வேறு வழிகளில் பின்பற்றலாம்:
- சாதனம் முழு கட்டளைகளுடன் முழுமையாக பின்பற்றப்படுகிறது;
- AT கட்டளைகள் பின்பற்றப்படுகின்றன, மேலும் தரவு ஸ்ட்ரீம் பிரதான அமைப்பின் COM போர்ட்டிலிருந்து பெறப்படுகிறது;
- மெய்நிகர் சாதனம் உண்மையான சாதனத்திற்கு முழுமையான தரவு திசைதிருப்பலை வழங்குகிறது;
- எப்பொழுதும் "சரி" என்று வழங்கும் ஒரு எளிய ஸ்டப்பாக.
முன்மாதிரியின் தற்போதைய பதிப்பு இரண்டாவது அணுகுமுறையைப் பயன்படுத்துகிறது - மெய்நிகர் புளூடூத் தொகுதி உள்ளமைவைச் செய்கிறது, அதன் பிறகு இது பிரதான அமைப்பின் COM போர்ட்டிலிருந்து எமுலேட்டரின் UART போர்ட்டிற்கு “ப்ராக்ஸிங்” தரவின் பயன்முறைக்கு மாறுகிறது.
சுற்றளவில் சில பகுதி செயல்படுத்தப்படாவிட்டால் குறியீட்டின் எளிய கருவியின் சாத்தியத்தை கருத்தில் கொள்வோம். எடுத்துக்காட்டாக, DMA க்கு தரவு பரிமாற்றத்தைக் கட்டுப்படுத்தும் பொறுப்பான டைமர் உருவாக்கப்படவில்லை என்றால் (செயல்பாட்டில் சரிபார்ப்பு செய்யப்படுகிறது. ws2812b_waitஇல் அமைந்துள்ளது 0x08006840
), பின்னர் ஃபார்ம்வேர் எப்போதும் கொடி மீட்டமைக்கப்படும் வரை காத்திருக்கும் பிஸியாகஇல் அமைந்துள்ளது 0x200004C4
இது DMA தரவு வரியின் ஆக்கிரமிப்பைக் காட்டுகிறது:
கொடியை கைமுறையாக மீட்டமைப்பதன் மூலம் இந்த சூழ்நிலையை நாம் சமாளிக்க முடியும் பிஸியாக அதை நிறுவிய உடனேயே. ஐடிஏ ப்ரோவில், நீங்கள் ஒரு பைதான் செயல்பாட்டை உருவாக்கி அதை பிரேக் பாயிண்டில் அழைக்கலாம், மேலும் 1 மதிப்பை கொடியில் எழுதிய பிறகு பிரேக் பாயிண்டையே குறியீட்டில் வைக்கலாம். பிஸியாக.
பிரேக்பாயிண்ட் கையாளுபவர்
முதலில், ஐடிஏவில் பைதான் செயல்பாட்டை உருவாக்குவோம். பட்டியல் கோப்பு - ஸ்கிரிப்ட் கட்டளை...
இடதுபுறத்தில் உள்ள பட்டியலில் புதிய துணுக்கைச் சேர்த்து, அதற்கு ஒரு பெயரைக் கொடுங்கள் (எடுத்துக்காட்டாக, BPT),
வலதுபுறத்தில் உள்ள உரை புலத்தில், செயல்பாட்டுக் குறியீட்டை உள்ளிடவும்:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
அதன் பிறகு நாங்கள் அழுத்துகிறோம் ரன் மற்றும் ஸ்கிரிப்ட் சாளரத்தை மூடவும்.
இப்போது உள்ள குறியீட்டிற்கு செல்வோம் 0x0800688A
, ஒரு பிரேக்பாயிண்ட் (F2 விசை) அமைக்கவும், அதைத் திருத்தவும் (சூழல் மெனு பிரேக் பாயிண்டை திருத்து...), ஸ்கிரிப்ட் வகையை பைத்தானுக்கு அமைக்க மறக்காதீர்கள்:
தற்போதைய கொடி மதிப்பு என்றால் பிஸியாக 1 க்கு சமம், நீங்கள் செயல்பாட்டை இயக்க வேண்டும் skip_dma ஸ்கிரிப்ட் வரியில்:
நீங்கள் செயல்படுத்த ஃபார்ம்வேரை இயக்கினால், பிரேக்பாயிண்ட் ஹேண்ட்லர் குறியீட்டின் தூண்டுதலை IDA சாளரத்தில் காணலாம். வெளியீடு வரி மூலம் Skipping wait ws2812...
. இப்போது ஃபார்ம்வேர் கொடியை மீட்டமைக்க காத்திருக்காது பிஸியாக.
முன்மாதிரியுடன் தொடர்பு
எமுலேஷனுக்காக எமுலேஷன் செய்வது மகிழ்ச்சியையும் மகிழ்ச்சியையும் ஏற்படுத்த வாய்ப்பில்லை. நினைவகத்தில் உள்ள தரவைப் பார்க்க அல்லது நூல்களின் தொடர்புகளை நிறுவுவதற்கு முன்மாதிரி ஆராய்ச்சியாளருக்கு உதவினால் அது மிகவும் சுவாரஸ்யமானது.
RTOS பணிகளுக்கு இடையேயான தொடர்புகளை எவ்வாறு மாறும் வகையில் நிறுவுவது என்பதை நாங்கள் உங்களுக்குக் காண்பிப்போம். குறியீடு இயங்கினால், அதை செயல்படுத்துவதை முதலில் இடைநிறுத்த வேண்டும். விழாவிற்கு சென்றால் bluetooth_task_entry "LED" கட்டளையின் செயலாக்க கிளைக்கு (முகவரி 0x080057B8
), பின்னர் முதலில் உருவாக்கப்பட்டதைக் காணலாம், பின்னர் கணினி வரிசையில் அனுப்பப்படும் ledControlQueueHandle சில செய்தி.
மாறியை அணுக, நீங்கள் ஒரு இடைவெளியை அமைக்க வேண்டும் ledControlQueueHandleஇல் அமைந்துள்ளது 0x20000624
குறியீட்டை தொடர்ந்து செயல்படுத்தவும்:
இதன் விளைவாக, நிறுத்தம் முதலில் முகவரியில் ஏற்படும் 0x080057CA
செயல்பாட்டை அழைப்பதற்கு முன் osMailAlloc, பின்னர் முகவரியில் 0x08005806
செயல்பாட்டை அழைப்பதற்கு முன் osMailPut, சிறிது நேரம் கழித்து - முகவரிக்கு 0x08005BD4
(செயல்பாட்டை அழைப்பதற்கு முன் osMailGet), இது செயல்பாட்டிற்கு சொந்தமானது leds_task_entry (LED-பணி), அதாவது, பணிகள் மாறியது, இப்போது LED-பணி கட்டுப்பாட்டைப் பெற்றது.
இந்த எளிய வழியில் RTOS பணிகள் எவ்வாறு ஒன்றோடொன்று தொடர்பு கொள்கின்றன என்பதை நீங்கள் நிறுவலாம்.
நிச்சயமாக, உண்மையில், பணிகளின் தொடர்பு மிகவும் சிக்கலானதாக இருக்கலாம், ஆனால் ஒரு முன்மாதிரியைப் பயன்படுத்தி, இந்த தொடர்புகளைக் கண்காணிப்பது குறைவான உழைப்பாகிறது.
Radare2 உடன் தொடங்கவும்
Radare2 போன்ற உலகளாவிய கருவியை நீங்கள் புறக்கணிக்க முடியாது.
r2 ஐப் பயன்படுத்தி முன்மாதிரியுடன் இணைக்க, கட்டளை இப்படி இருக்கும்:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
துவக்கம் இப்போது கிடைக்கிறது (dc
) மற்றும் இடைநிறுத்தம் செயல்படுத்தல் (Ctrl+C).
துரதிர்ஷ்டவசமாக, தற்போது, r2 வன்பொருள் gdb சேவையகம் மற்றும் நினைவக தளவமைப்புடன் பணிபுரியும் போது சிக்கல்களை எதிர்கொள்கிறது; இதன் காரணமாக, முறிவு புள்ளிகள் மற்றும் படிகள் வேலை செய்யாது (கட்டளை ds
) இது விரைவில் சரி செய்யப்படும் என நம்புகிறோம்.
கிரகணத்துடன் இயங்குகிறது
முன்மாதிரியைப் பயன்படுத்துவதற்கான விருப்பங்களில் ஒன்று, உருவாக்கப்பட்ட சாதனத்தின் ஃபார்ம்வேரை பிழைத்திருத்துவதாகும். தெளிவுக்காக, நாங்கள் Rhino firmware ஐப் பயன்படுத்துவோம். ஃபார்ம்வேர் ஆதாரங்களை நீங்கள் பதிவிறக்கம் செய்யலாம்
தொகுப்பிலிருந்து Eclipse ஐ IDE ஆகப் பயன்படுத்துவோம்
எமுலேட்டர் நேரடியாக எக்லிப்ஸில் தொகுக்கப்பட்ட ஃபார்ம்வேரை ஏற்றுவதற்கு, நீங்கள் அளவுருவைச் சேர்க்க வேண்டும் firmware=null
முன்மாதிரி வெளியீட்டு கட்டளைக்கு:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
பிழைத்திருத்த உள்ளமைவை அமைத்தல்
கிரகணத்தில், மெனுவைத் தேர்ந்தெடுக்கவும் இயக்கு - பிழைத்திருத்த கட்டமைப்புகள்... திறக்கும் சாளரத்தில், பிரிவில் GDB வன்பொருள் பிழைத்திருத்தம் நீங்கள் ஒரு புதிய உள்ளமைவைச் சேர்க்க வேண்டும், பின்னர் "முதன்மை" தாவலில் தற்போதைய திட்டம் மற்றும் பிழைத்திருத்தத்திற்கான பயன்பாட்டைக் குறிப்பிடவும்:
"பிழைத்திருத்தி" தாவலில் நீங்கள் GDB கட்டளையை குறிப்பிட வேண்டும்:
${openstm32_compiler_path}arm-none-eabi-gdb
GDB சேவையகத்துடன் இணைப்பதற்கான அளவுருக்களையும் உள்ளிடவும் (ஹோஸ்ட் மற்றும் போர்ட்):
"தொடக்க" தாவலில், நீங்கள் பின்வரும் அளவுருக்களைக் குறிப்பிட வேண்டும்:
- தேர்வுப்பெட்டியை இயக்கு படத்தை ஏற்றவும் (இதனால் கூடியிருந்த ஃபார்ம்வேர் படம் எமுலேட்டரில் ஏற்றப்படும்);
- தேர்வுப்பெட்டியை இயக்கு சின்னங்களை ஏற்றவும்;
- துவக்க கட்டளையைச் சேர்க்கவும்:
set $pc = *0x08000004
(பிசி பதிவேட்டை முகவரியில் உள்ள நினைவகத்திலிருந்து மதிப்புக்கு அமைக்கவும்0x08000004
- முகவரி அங்கு சேமிக்கப்படுகிறது ResetHandler).
கவனம் செலுத்துங்கள், நீங்கள் எக்லிப்ஸிலிருந்து ஃபார்ம்வேர் கோப்பைப் பதிவிறக்க விரும்பவில்லை என்றால், விருப்பங்கள் படத்தை ஏற்றவும் и கட்டளைகளை இயக்கவும் குறிப்பிட தேவையில்லை.
பிழைத்திருத்தத்தைக் கிளிக் செய்த பிறகு, நீங்கள் பிழைத்திருத்த பயன்முறையில் வேலை செய்யலாம்:
- படிப்படியாக குறியீடு செயல்படுத்தல்
- முறிவு புள்ளிகளுடன் தொடர்பு கொள்கிறது
கருத்து. கிரகணத்தில், ஹ்ம்ம்... சில வினோதங்கள் உள்ளன... நீங்கள் அவர்களுடன் வாழ வேண்டும். எடுத்துக்காட்டாக, பிழைத்திருத்தத்தைத் தொடங்கும் போது “0x0″க்கு எந்த ஆதாரமும் இல்லை” என்ற செய்தி தோன்றினால், படி கட்டளையை (F5) இயக்கவும்.
அதற்கு பதிலாக, ஒரு முடிவுக்கும்
சொந்த குறியீட்டைப் பின்பற்றுவது மிகவும் சுவாரஸ்யமான விஷயம். ஒரு சாதன டெவலப்பருக்கு உண்மையான சாதனம் இல்லாமல் ஃபார்ம்வேரை பிழைத்திருத்துவது சாத்தியமாகும். ஒரு ஆராய்ச்சியாளருக்கு, டைனமிக் குறியீடு பகுப்பாய்வு நடத்த இது ஒரு வாய்ப்பாகும், இது ஒரு சாதனத்துடன் கூட எப்போதும் சாத்தியமில்லை.
நாங்கள் நிபுணர்களுக்கு வசதியான, மிதமான எளிமையான ஒரு கருவியை வழங்க விரும்புகிறோம் மற்றும் அமைப்பதற்கும் இயக்குவதற்கும் அதிக முயற்சி மற்றும் நேரத்தை எடுக்காது.
வன்பொருள் முன்மாதிரிகளைப் பயன்படுத்தி உங்கள் அனுபவத்தைப் பற்றி கருத்துகளில் எழுதுங்கள். நாங்கள் உங்களை விவாதிக்க அழைக்கிறோம் மற்றும் கேள்விகளுக்கு பதிலளிக்க மகிழ்ச்சியாக இருப்போம்.
பதிவு செய்த பயனர்கள் மட்டுமே கணக்கெடுப்பில் பங்கேற்க முடியும்.
நீங்கள் எமுலேட்டரை எதற்காகப் பயன்படுத்துகிறீர்கள்?
-
நான் ஃபார்ம்வேரை (பிழைத்திருத்தம்) உருவாக்குகிறேன்
-
நான் ஃபார்ம்வேரை ஆராய்ந்து வருகிறேன்
-
நான் கேம்களைத் தொடங்குகிறேன் (டெண்டி, சேகா, PSP)
-
வேறு ஏதாவது (கருத்துகளில் எழுதவும்)
7 பயனர்கள் வாக்களித்தனர். 2 பயனர்கள் வாக்களிக்கவில்லை.
நேட்டிவ் குறியீட்டைப் பின்பற்ற நீங்கள் என்ன மென்பொருளைப் பயன்படுத்துகிறீர்கள்?
-
QEMU
-
யூனிகார்ன் இயந்திரம்
-
புரோடீஸ்
-
வேறு ஏதாவது (கருத்துகளில் எழுதவும்)
6 பயனர்கள் வாக்களித்தனர். 2 பயனர்கள் வாக்களிக்கவில்லை.
நீங்கள் பயன்படுத்தும் எமுலேட்டரில் எதை மேம்படுத்த விரும்புகிறீர்கள்?
-
எனக்கு வேகம் வேண்டும்
-
நான் அமைவு/தொடக்கத்தை எளிதாக்க விரும்புகிறேன்
-
எமுலேட்டருடன் (API, hooks) தொடர்புகொள்வதற்கான கூடுதல் விருப்பங்கள் எனக்கு வேண்டும்
-
நான் எல்லாவற்றிலும் மகிழ்ச்சியாக இருக்கிறேன்
-
வேறு ஏதாவது (கருத்துகளில் எழுதவும்)
8 பயனர்கள் வாக்களித்தனர். 1 பயனர் வாக்களிக்கவில்லை.
ஆதாரம்: www.habr.com