Commit Graph

599 Commits

Author SHA1 Message Date
Bet4 5559c097d5 rust: Allow to remove self inside a hook 2022-01-17 21:56:33 +08:00
lazymio 06be6fdc24
Merge pull request #1537 from gerph/clear-pending-hook-exception-before-emulation
Clear Python pending hook exception before we enter the emulation.
2022-01-15 22:13:24 +01:00
lazymio 459a595a98
Merge branch 'dev' into s390x
Mostly for bindings update.
2022-01-15 20:56:39 +01:00
lazymio dfb0446137
Update bindings 2022-01-15 20:56:24 +01:00
Charles Ferguson 1ba59ed70a Clear Python pending hook exception before we enter the emulation.
The pending exception hook is set when the hook raised an exception
and wants to report it outside the emulation loop. However, it is
never cleared back to None. This means that after an exception is
raised in a hook, all subsequent execution (even if successful) will
raise the exception.

This change clears the exception before we start another emulation,
which should ensure that if we have _hook_exception set, it really
is from hooks in this emulation run.
2022-01-15 17:45:45 +00:00
lazymio 71f044ca50
Merge branch 'dev' into s390x 2022-01-10 15:17:42 +01:00
lazymio c671efe798
Update bindings 2022-01-05 22:00:59 +01:00
lazymio c4b4189857
Update bindings 2022-01-04 21:12:52 +01:00
Nguyen Anh Quynh 6813e4a042 bindings: update const_generator.py, and update all binding constants 2022-01-01 09:24:28 +08:00
mio 8b0285e135
Add python support for s390x 2022-01-01 00:58:10 +01:00
mio d5e0bff7d5
Fix rust build for s390x 2022-01-01 00:41:59 +01:00
lazymio 3184d3fcdf
Update python bindings 2021-12-22 20:46:14 +01:00
Bet4 3e9ae003b7 Add use_system_unicorn feature in rust bindings 2021-12-10 19:44:39 +08:00
Brandon Miller 2cc15c7260 Added SetCPUModel go binding
Go cannot use C macros directly, so I followed existing convention and
added a helper to uc.c to call the uc_ctl_set_cpu_model macro
2021-12-04 16:25:23 -05:00
Sven Bartscher 59fb8a2733 rust: Add RISCV CSR registers
The addition of these registers in the C base caused the rust values
for all floating point registers and the PC to point to some of the
CSR registers instead.
2021-11-30 16:09:24 +01:00
lazymio 10d88e89a5
Fix uc_version and bump again 2021-11-25 18:19:46 +01:00
lazymio 9a4d5d0be8
Bump bindings version to 2.0.0-rc5 2021-11-25 14:29:41 +01:00
Sven Bartscher a237505adb rust: Implement deallocation of MMIO callbacks
Previously the user data of MMIO callbacks would live until the end of
the containing Unicorn engine. Now they are deallocated once all
memory referencing those callbacks has been unmapped.
2021-11-24 12:15:20 +01:00
Sven Bartscher 20d97a0c00 Add map_mmio to rust bindings 2021-11-24 12:15:20 +01:00
mid-kid 2d665aa752 Accomodate for setting a different CMAKE_GENERATOR in the environment.
This makes sure the right build utility is called, depending on the
value of the CMAKE_GENERATOR environment.
2021-11-13 13:34:11 +01:00
lazymio fafec703e1
Merge pull request #1480 from domenukk/rust_bindings
Rust bindings improvements
2021-11-10 07:52:31 +01:00
lazymio 7f43e1de3e
Rename rust env to decide build dir 2021-11-10 07:51:07 +01:00
Dominik Maier 67cd9b1c2f fixed doc tests 2021-11-10 04:49:27 +01:00
Dominik Maier 7adcced19b cleanup 2021-11-10 04:26:56 +01:00
Dominik Maier 7873e60740 reverted unfinished commit 2021-11-10 04:21:30 +01:00
Dominik Maier a231440cf8 reverted build.rs 2021-11-10 04:14:56 +01:00
Dominik Maier 177b21c2af removed need for extra api; no_std 2021-11-10 04:11:14 +01:00
Dominik Maier 492779d7d4 fixed context 2021-11-09 16:19:27 +01:00
Dominik Maier 3b0ce89a7a missing pcs 2021-11-09 16:09:02 +01:00
Dominik Maier a3e139847d reapply missing changes 2021-11-09 16:04:59 +01:00
Dominik Maier 1f90734b12 No longer redownloads unicorn each cargo build 2021-11-09 15:51:11 +01:00
Dominik Maier d7ead41a51 fixed testcases 2021-11-09 14:49:18 +01:00
lazymio ec02eccb85
Fixup Rust CI 2021-11-09 00:58:13 +01:00
lazymio 0714fb5760
Bump bindings version 2021-11-09 00:23:19 +01:00
Dominik Maier 0dfc0cba1f removed duplicate 2021-11-08 19:39:15 +01:00
Dominik Maier a8f9655189 lifetime 2021-11-08 19:37:38 +01:00
Dominik Maier f8f0d4471f Unicorn rust bindings improvements 2021-11-08 19:34:53 +01:00
lazymio 9abbba173c
Update python bindings 2021-11-07 21:00:05 +01:00
George Hotz 8732cff287
add rpath and go.mod 2021-11-07 20:24:50 +01:00
lazymio 923b4ad3cc
Update python bindings 2021-11-04 21:47:30 +01:00
lazymio b9c0066a47
Format and naming 2021-11-04 20:04:57 +01:00
lazymio db90f39ac6
Generate bindings 2021-11-04 20:01:19 +01:00
lazymio 3dfec280c7
Merge and close #1161 2021-11-03 21:02:48 +01:00
Bet4 aaf340d9e4 Merge branch 'dev' into patch 2021-11-02 18:36:22 +08:00
lazymio 090686f8ed
uc_ctl proposal (#1473)
* Add uc_ctl

* Add comments

* Slightly changed for bindings generation

* Generate bindings
2021-10-30 10:45:32 +08:00
lazymio 9e1443013b
Fix gen_const 2021-10-26 13:10:59 +02:00
lazymio e695686c15
Remove AFL Integration by reverting 2021-10-26 11:22:21 +02:00
lazymio 17963ff4aa
Update python bindings for afl 2021-10-25 01:27:51 +02:00
lazymio f08b7d6b5b
Make gen_const work and updates constants 2021-10-25 00:57:32 +02:00
mio fbdd321afe
Remove useless import 2021-10-18 21:44:10 +02:00
mio 2463467302
Format the code 2021-10-18 21:41:19 +02:00
mio a1d5c5f1b0
Don't reply on git command 2021-10-18 21:39:59 +02:00
Bet4 c400924fe1
Merge branch 'dev' into patch 2021-10-17 18:18:09 +08:00
mio 15bcdf7cbc
Add documentation link 2021-10-17 03:36:58 +02:00
mio a11cd9c43f
Ready for rust bindings release 2021-10-17 03:26:40 +02:00
mio 6d0d0897f8
Fix Rust build and CI.
Add a test for ppc and fix ppc on windows.
2021-10-17 02:11:38 +02:00
mio c8eea0bcb3
Fix build.rs and tests 2021-10-16 21:21:12 +02:00
Bet4 5a97bf7f8f Update Rust constants to Unicorn2 2021-10-15 09:17:43 +08:00
Bet4 fe296d1c9e Improve Java bindings 2021-10-14 18:39:38 +08:00
insane-shane 47ecfc1b2c Handle exceptions raised in Python hook functions (#1387) 2021-10-12 08:35:52 +08:00
Peter Meerwald-Stadler 00b4a17c1b Fix some typos in include files (#1350) 2021-10-11 11:18:27 +08:00
smeng9 d1496f3700 Update binding list (#1349) 2021-10-11 11:17:49 +08:00
mio 8f7ecfe48b
Support configure threads by environment variable 2021-10-10 23:46:22 +02:00
Bet4 8120a11f24 Update dependencies of rust bindings 2021-10-06 22:43:14 +08:00
lazymio ad3c0a5b32
Bump python bindings version 2021-10-06 12:37:13 +02:00
mio 2474f9513b
Sync docs from wiki and remove cmake.sh 2021-10-05 15:26:13 +02:00
mio 5668fd9c42
Set zip_safe and is_pure to False and trigger another build 2021-10-05 15:11:59 +02:00
mio 59deed7484
Simply the setup.py 2021-10-05 14:46:04 +02:00
mio aff9c9dc48
Clean debug print and make it compatible with python3.5 2021-10-05 13:48:26 +02:00
lazymio 2aebf93143
Merge pull request #1443 from bet4it/reg
Support to read ST registers in rust bindings
2021-10-04 18:30:30 +02:00
mio e1204d8977
Specify the content type 2021-10-04 18:09:44 +02:00
Bet4 23e01a4862 Support to read ST registers in rust bindings 2021-10-04 23:18:05 +08:00
chfl4gs e571dc278a PyPI publishing 2021-10-04 22:22:41 +08:00
Nguyen Anh Quynh e8bd7ca087 bindings: update X86 register constants 2021-10-04 19:41:41 +08:00
mio ebb468d042
Fix msvc build 2021-10-04 10:44:30 +02:00
Nguyen Anh Quynh 0a7223996d bindings: update constants from ARM registers 2021-10-04 01:04:43 +08:00
Nguyen Anh Quynh 54e7e3b9ef bindings: add Rust 2021-10-04 01:01:43 +08:00
Nguyen Anh Quynh aaaea14214 import Unicorn2 2021-10-03 22:14:44 +08:00
Bet4 772558119a
Add missing constants in rust bindings (#1423)
* Update arm64.rs

* Update mips.rs
2021-07-08 20:43:00 +08:00
Bet4 9c6134ca91
Add Rust bindings to master branch (#1401)
* Rust bindings (#1295)

* rust bindings init

* updated bindings/README

* Improved Rust bindings: (#1309)

* Added basic block hooking
* Changed confusing struct naming. Before: Protection::All -> R,W,X, Now: Permission::All -> R,W,X
* Fixed issue with remove_hook(..). Implementation tried to remove hook from incorrect hashmap.
* Made unused private vmmap(..) public.

* Improve Rust bindings (#1367)

* fixed tests

* constant readability

* HookType as bitflags

* Mode as bitflags

* improve bitflags

* cargo fmt

* removed unnecessary "as usize"

* fixed buggy deallocation of uc_context structs

* Remove data field in rust bindings

Co-authored-by: Lukas Seidel <pr0me@users.noreply.github.com>
Co-authored-by: Nikolas Eller <nikolas.e@mail.de>
Co-authored-by: Simon Wörner <git@simon-woerner.de>
Co-authored-by: floesen <floesen@users.noreply.github.com>
2021-05-26 23:05:12 +08:00
Nguyen Anh Quynh 2874435d2f bump version to 1.0.3 2021-05-16 21:38:08 +08:00
insane-shane 4f9a6cfcf3
Handle exceptions raised in Python hook functions (#1387) 2021-04-26 00:35:56 +08:00
w4kfu-synacktiv 21ec6e8f83
Add ARM BE8 support (#1369)
Co-authored-by: w4kfu <gw4kfu@gmail.com>
2021-03-31 21:22:35 +08:00
iGio90 e42e58cd91
Remove deprecated javah and build with javac (#1360)
Hi, I was having trouble building java bindings on latest ubuntu. I installed jdk8 which has javah but somehow was failing during install (missing compiled classes even if they were in place in unicorn/). I guess mixing with jdk11 pop the issue. 
Using javac from most recent jdk works very fine.
2020-12-23 13:28:17 +08:00
Peter Meerwald-Stadler 770d5679c3
Fix some typos in include files (#1350) 2020-10-29 11:16:45 +08:00
smeng9 5e4423a419
Update binding list (#1349) 2020-10-28 09:47:59 +08:00
LAADHARI e639d3fc93
FIX java binding compilation #1339 (#1340) 2020-10-07 11:43:26 +08:00
lazymio 1044403d38
Implement uc_context_free (#1336)
* Implement uc_context_free

* Use uc_context_free for python bindings

* Format code

* Simplify code

* Move next,context inside while loop

* Add my name to CREDITS.TXT
2020-09-24 22:28:55 +08:00
lazymio 4441394258
Fix context saving (#1335)
* Fix context size

* Make UcContext convertible to bytes and picklable

Fix when updaing context

* Test context pickling

* Fix double free when the context is pickled from bytes
2020-09-24 00:53:23 +08:00
☃ Stephen Shkardoon ☃ b1459f7554
Fix failing test caused by removal of UC_ERR_TIMEOUT (#1305)
Caused by fbef45b18f.
Now the code assumes if it completes without an error, it was
successful.
2020-09-21 10:37:38 +08:00
chfl4gs c03f50f76a
Fixing installation on cygwin, Travis-ci cache adjustment (#1322)
* Adding Travis-CI cmake static

* fix 64-bit fstenv (#1300)

* fix 64-bit fstenv

* fix fstenv

* safe_zip to false and travis adjustment

* Fixed zip_safe and cygwin setup

Co-authored-by: liangjs <761232680@qq.com>
2020-09-10 10:01:13 +08:00
Nguyen Anh Quynh 564ae2b14a python: correct a comment on hooking on sample_arm64.py. fix #1292 2020-06-10 17:56:01 +08:00
chfl4gs 9288b4a845
adding pypi workflow (#1280)
* adding pypi workflow

* PyPI distribution packages workflow
2020-06-06 12:53:31 +08:00
Nguyen Anh Quynh 2e0f753e6f save cpu->jmp_env in saving context, so uc_emu_start() can be reentrant. also improved Python binding on handling context 2020-06-05 20:12:44 +08:00
Nguyen Anh Quynh 99be837364 python: add long description to setup.py 2020-05-29 11:56:24 +08:00
Nguyen Anh Quynh fbef45b18f remove UC_ERR_TIMEOUT, so timeout on uc_emu_start() is not considered error. added UC_QUERY_TIMEOUT to query exit reason 2020-05-24 23:54:45 +08:00
Nguyen Anh Quynh cf3451c37a bindings: update ARM64 registers 2020-05-10 21:51:14 +08:00
Dominik Maier 625399774c
X64 base regs (#1166)
* x86: setup FS & GS base

* Fixed base register writes for x64, removed then for x16/x32 (the don't exist there?)

* FS reg comes before GS so the base regs do so, too

* added shebang to const_generator.py

* Added base regs to and added 'all' support to const_generator

Co-authored-by: naq <aquynh@gmail.com>
2020-05-05 08:34:51 +08:00
Pedro Tammela 18aa2627f7
fix binding install on python2 (#1231) 2020-04-24 17:15:12 +08:00
Saagar Jha d69ebfa55c
Make it easier to link against libunicorn on macOS (#1195)
Adding @rpath to the install name to make it possible to link against
the library without modifying it with install_name_tool. Copying both
the versioned and unversioned dylibs simplifies linking.
2020-02-12 14:16:34 +08:00
Nguyen Anh Quynh 810bd34eef python: handle UC_ERR_TIMEOUT, so sample_x86.py behaves like sample_x86.c 2020-01-01 10:11:16 +08:00
Nguyen Anh Quynh b0d5837c61 bindings: add UC_ERR_TIMEOUT 2019-12-29 00:19:34 +08:00
Audrey Dutcher 3cea38bff7 restrict msbuild to win32 platform (#1172) 2019-11-20 00:34:56 +08:00
naq 3b17db0d84 bindings: update after the last commit on adding ARM modes 2019-10-26 05:02:39 +08:00
Audrey Dutcher fd3ccb2ef7 Python packaging logic for msvc build (#1151)
* remove bundling of DLLs we no longer need!

* Add logic for building with msvc in python setup

* Also include the msvc build scripts with sdist
2019-10-10 22:00:42 +08:00
naq 355eaecc12 bindings: update after addition of UC_HOOK_INSN_INVALID 2019-09-23 01:54:24 +08:00
Azertinv 07f94ad1fc Added an invalid instruction hook (#1132)
* first draft for an invalid instruction hook

* Fixed documentation on return value of invalid insn hook
2019-09-23 01:53:06 +08:00
AeonLucid c46e745338 Fixes #1143 (#1144) 2019-09-16 01:58:08 +08:00
BAYET 8987ad0fff Handle serialization of cpu context save (#1129)
* Handle the cpu context save in a more pythonic way, so the context can be serialized and reuse in an other process using the same emulator architecture and modes

* Fix type error ; mistakes a size_t uint64_t ; breaks in 32bit...
2019-09-07 19:09:17 +08:00
Guille Polito 56ac8859b3 Add pharo-unicorn to binding list (#1110)
* Add pharo-unicorn to binding list

* Add Pharo
2019-07-31 15:56:28 +08:00
kj.xwings.l 24f55a7973 Removed hardcoded CP0C3_ULRI (#1098)
* activate CP0C3_ULRI for CONFIG3, mips

* updated with mips patches

* updated with mips patches

* remove hardcoded config3

* git ignore vscode

* fix spacing issue and turn on floating point
2019-07-06 17:53:02 +08:00
Lukas Dresel 55d8d073bd support for YMM registers ymm8-ymm15 (#1079) 2019-04-01 11:00:34 +08:00
Jonas d6d4131873 Added x86Msr functions for the go bindings (#986) 2019-03-07 08:39:38 +08:00
Nguyen Anh Quynh 07cafff76a bindings: update for latest ARM registers addition 2019-03-07 08:38:41 +08:00
Nguyen Anh Quynh 6d47b38b7f bindings: update after recent addition of ARM_REG_IPSR 2019-02-28 09:56:29 +08:00
Nguyen Anh Quynh 738d102989 bindings: add newly added register MXCSR 2019-02-15 13:01:27 +08:00
kj.xwings.l 8c6cbe3f3c update python binding samples, shellcode.py with 64bit syscall (#1052)
* update python binding samples, shellcode.py with 64bit syscall

* fix with quynh comments

* fix with more q comments

* reformatted

* reformatted and moved file

* reformatted and moved file

* delete file

* delete dead code

* deleted more dead code

* deleted more dead code / fix bugs

* fix 64bit eip intno eax

* rearrage rip

* Inconsistent print
2019-01-15 14:57:11 +08:00
Diego Argueta f243818806 Add Lua binding to README (#1050)
Closes https://github.com/dargueta/unicorn-lua/issues/1
2018-12-24 17:45:40 +08:00
Brian McKenna 873fffc505 Haskell bindings: use ExceptT instead of deprecated EitherT (#1034) 2018-10-25 12:54:35 -03:00
Vladimir Panteleev 2ab9e83703 bindings/README: Add D bindings (#1010) 2018-09-11 12:45:07 +08:00
Coldzer0 84220d8360 Pascal/Delphi binding (#987)
* Pascal/Delphi binding

Pascal/Delphi language binding

* update credits
2018-08-03 20:33:25 +08:00
Duncan Ogilvie 0b3cd70e67 Update dotnet bindings (#973) 2018-07-05 21:30:33 +08:00
Disconnect3d 19ffa83d43 Fix naming in Python sample_x86.py (#961) 2018-05-07 09:44:27 +08:00
Sebastian Willenborg 9a01ae8379 Fix tests when using go 1.10 (#949) 2018-03-21 00:36:37 +08:00
Nguyen Anh Quynh 1f408ce359 java: cleanup Makefile 2018-03-12 13:41:38 +08:00
Jeremy Sears 94b1168776 Fix Java Makefile on Darwin (#936)
* Fixes the logic for Dylib extensions on macOS.
* Adds an uninstall task and documentation.
2018-03-12 20:40:40 +07:00
Nguyen Anh Quynh 505f926992 link to Crystal binding 2017-12-23 00:26:40 +08:00
Nguyen Anh Quynh 41cc047b87 bindings: update after #922 2017-12-20 22:13:29 +08:00
Stephen 5a117c84ff add travis testing path (#930)
closes #927
2017-12-17 19:24:09 +08:00
Sascha Schirra bc34c36eae version changed and unicorn.gemspec renamed to unicorn-engine.gemspec (#915) 2017-10-27 20:30:01 +08:00
Sascha Schirra 8df86c86a4 changed gem name to unicorn-engine (#911)
* changed gem name to unicorn-engine

* changed the gem name in Makefile
2017-10-17 00:53:20 +08:00
Andrew Dutcher 12642c2555 Cleanups/fixes for the library issue conglomerate (#897)
* Python: Disable distribution of static library on linux and macos; add environment variable LIBUNICORN_PATH to let user specify location of native library; prevent build of native library if this option is enabled; closes #869

* Python: Update README.TXT to describe how to manage the building and usage of the native library
2017-09-24 22:33:01 +08:00
Sascha Schirra 13007eb12a renamed unicorn gem to unicorn-engine (#895)
* renamed gem unicorn to unicorn-engine

* renamed modules to unicornengine

* renamed Module Unicorn to UnicornEngine and the gem unicorn-engine to unicornengine

* unicornengine -> unicorn_engine
2017-09-19 07:43:21 +07:00
fallenoak 46ae3a042e Ruby: Support reading and writing x86 FPU stack registers (#892)
In order to reduce rounding problems from calculations, FPU stack
registers for x86 architectures contain values stored in an
80-bit extended precision format.

As a result, reading and writing to these registers requires
specific handling.

This update brings the Ruby bindings in line with the Python
bindings by supporting reading and writing the FPU stack registers
using 2-element arrays: [mantissa, exponent]

The mantissa array element contains the first 64 bits of the FPU
stack register.

The exponent array element contains the last 16 bits of the FPU
stack register.
2017-09-17 22:44:30 +07:00
Benno Fünfstück b0b5f8442d python: Fix exception in finalizer at exit (#873)
Sometimes, the finalizer for an `UcRef` runs so late that the members of the
module have already been set to `None`. We need to make sure that we don't
depend on anything in the module, or we risk getting a Exception when we try
to access the `release_handle` method of `None` (`Uc`).
2017-09-15 22:21:25 +07:00
Jonas a893bcf138 Changed constatns in ruby gdt example (#876)
I think those two numbers are wrong, see http://wiki.osdev.org/Global_Descriptor_Table
2017-08-29 17:03:52 +07:00
Andrew Dutcher 744c34261f Don't error during sdist if config-host.mak doesn't exist (#846) 2017-05-31 11:36:33 +08:00
Sascha Schirra 6d8031eca4 typo fixed: contest_restore -> context_restore (#843) 2017-05-23 00:52:34 +08:00
misson20000 9cb64915c7 fix Ruby bindings (#830)
* fix mem_unmap and query for Ruby bindings

* ruby bindings: fix issues with GC freeing callbacks while we still have references to them

* ruby bindings: add test for garbage collection of hooks

* ruby bindings: let the VM garbage collect hooks properly this time

* ruby bindings: update garbage collection test to make sure Proc is garbage collected after Uc is collected

* ruby bindings: fix m_uc_hook_add to return the ruby VALUE with proper memory management instead of making another one with bad memory management

* ruby bindings: fix cb_hook_intr signature

* add architecture query

* ruby bindings: only treat certain x86 registers specially if we're actually on x86

* only treat certain x86 registers specially if we're actually on x86 (uc_reg_read and uc_reg_write)

* ruby bindings: read and write ARM64's 128-bit NEON registers
2017-05-22 20:46:30 +08:00
misson20000 3fdb2d2442 add architecture query (#842) 2017-05-21 09:47:02 +08:00
Fangrui Song 85e0a54e35 Fix Python 3 samples (#836) 2017-05-15 09:11:22 +08:00
misson20000 014ccfb94a Aarch64 add thread registers (#834)
* add thread registers to AArch64

* update bindings to add AArch64 thread registers

* fix indentation for register read/write switch-case in unicorn_aarch64.c
2017-05-14 14:42:49 +07:00
Ryan Hileman 4b50ca5cec Go: improve hook callback speed by 30% and add a HOOK_CODE benchmark (#835)
* add x86 hook benchmark

* Go: improve hook callback speed by 30%
2017-05-14 00:12:57 +07:00
Ryan Hileman d39c20acfe Go: fix NewRegBatch([]int{}) (#831) 2017-05-12 09:39:04 +07:00
Ryan Hileman 37edadedec go: add faster RegBatch type (#822) 2017-05-06 22:32:35 +08:00
Samuel Groß 5385baba39 Implemented read and write access to the YMM registers (#819) 2017-05-05 09:02:58 +08:00
zhangwm 4a62409949 arm64eb: arm64 big endian also using little endian instructions. (#816)
* arm64eb: arm64 big endian also using little endian instructions.

* arm64: using another example that depends on endians.

example:
1. store a word: 0x12345678
2. load a byte:
   * little endian : 0x78
   * big endian    : 0x12
2017-05-04 20:00:48 +08:00
Ryan Hileman 187b470245 add arm64 CPACR_EL1 register support (#814) 2017-05-02 14:51:19 +08:00
David Zimmer 9eebd6daa3 vb bindings remove DYNLOAD (#812) 2017-04-27 20:43:47 +08:00
xorstream fa45a42c76 Removed MSVC binding. (#808) 2017-04-27 10:21:04 +08:00