fe2a6db786
rust / build / test / clippy / fmt (push) Has been cancelled
Layout:
- src/ .NET 10 x64 reference: MxNativeCodec, MxNativeClient,
MxAsbClient, probes, tests, harnesses. Executable spec.
- design/ Architectural plan for the Rust port (M0–M6), error
model, protocol invariants, risks (R1–R16), adversarial
review log (review.md).
- rust/ Rust workspace. M0 skeleton + M1 codec parity.
mxaccess-codec: 215 unit tests + 2 cross-implementation
parity tests (byte-identical against .NET reference).
Other crates are M0 stubs awaiting M2+.
- captures/ Frida + netsh + pcap evidence per CLAUDE.md
("captures are evidence, not throwaway logs").
- analysis/ Decompiled C# (frida/proxy/decompiled-*),
Ghidra exports for native DLLs (`exports/` only —
working state at `projects/` and AVEVA's input
binaries at `input/` are gitignored).
- docs/ Reverse-engineering reference docs.
- tools/ Setup-LiveProbeEnv.ps1 (Infisical credential fetcher),
Compute-Crc.ps1 (.NET parity helper).
- .github/workflows/ Rust CI: fmt + build + test + clippy on Windows.
- LICENSE MIT (Joseph Doherty, 2026).
Verified:
- cargo test --workspace → 217 passed (215 unit + 2 .NET parity), 0 failed
- cargo clippy --workspace -- -D warnings → clean
- cargo fmt --all -- --check → clean
- cargo publish --dry-run -p mxaccess-codec → packages cleanly
Excluded from history (see .gitignore):
- **/bin, **/obj, **/target — build artifacts
- analysis/ghidra/projects/ — Ghidra working state (regenerable)
- analysis/ghidra/input/ — AVEVA proprietary DLLs (vendor IP)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
324 lines
12 KiB
Markdown
324 lines
12 KiB
Markdown
# LmxProxy.dll selected decompile
|
|
|
|
## FUN_10012f24 at 10012f24
|
|
|
|
Signature: `undefined __stdcall FUN_10012f24(int param_1, uint param_2, long param_3, long param_4, undefined1 * param_5, uint param_6, ULONG param_7, undefined4 param_8, undefined4 param_9)`
|
|
|
|
```c
|
|
|
|
/* WARNING: Function: __EH_prolog3_catch_GS replaced with injection: EH_prolog3 */
|
|
|
|
void FUN_10012f24(int param_1,uint param_2,long param_3,long param_4,undefined1 *param_5,
|
|
uint param_6,ULONG param_7,undefined4 param_8,undefined4 param_9)
|
|
|
|
{
|
|
basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> bVar1;
|
|
uint uVar2;
|
|
basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *pbVar3;
|
|
int iVar4;
|
|
uint uVar5;
|
|
wchar_t *pwVar6;
|
|
long lVar7;
|
|
wchar_t *pwVar8;
|
|
long lVar9;
|
|
wchar_t *pwVar10;
|
|
undefined1 *puVar11;
|
|
wchar_t *pwVar12;
|
|
undefined4 uVar13;
|
|
long *plVar14;
|
|
_func_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr
|
|
*p_Var15;
|
|
undefined1 **ppuVar16;
|
|
_union_2683 local_6c;
|
|
long local_50;
|
|
int local_4c;
|
|
undefined1 *local_48;
|
|
long local_44;
|
|
uint local_40;
|
|
int local_3c;
|
|
_func_void_uint__EXCEPTION_POINTERS_ptr *local_38 [4];
|
|
undefined4 local_28;
|
|
undefined4 uStack_24;
|
|
undefined4 uStack_20;
|
|
undefined4 uStack_1c;
|
|
uint local_8;
|
|
undefined4 uStack_4;
|
|
|
|
uStack_4 = 0x5c;
|
|
local_3c = param_1;
|
|
local_40 = param_2;
|
|
local_50 = param_3;
|
|
local_44 = param_4;
|
|
local_48 = param_5;
|
|
local_6c._0_4_ = param_6;
|
|
local_6c.decVal.Hi32 = param_7;
|
|
local_6c._8_4_ = param_8;
|
|
local_6c._12_4_ = param_9;
|
|
local_8 = 0;
|
|
FUN_10011b07(local_38);
|
|
local_8 = CONCAT31(local_8._1_3_,1);
|
|
local_4c = 0;
|
|
bVar1 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
|
|
(DAT_100294e0 + 0xc));
|
|
if (bVar1 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
|
|
uVar2 = local_6c._0_4_ & 0xffff;
|
|
pwVar12 = L" Variant Type ";
|
|
pwVar10 = L" VerifierUserID ";
|
|
pwVar8 = L" CurrentUserID ";
|
|
pwVar6 = L" Item Handle ";
|
|
uVar5 = local_40;
|
|
lVar7 = local_50;
|
|
lVar9 = local_44;
|
|
puVar11 = local_48;
|
|
p_Var15 = endl_exref;
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
|
|
L"CLMXProxyServer::WriteSecured - Server Handle ");
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,uVar5)
|
|
;
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar3,pwVar6);
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,lVar7)
|
|
;
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar3,pwVar8);
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,lVar9)
|
|
;
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar3,pwVar10);
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
|
|
(pbVar3,(long)puVar11);
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar3,pwVar12);
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,uVar2)
|
|
;
|
|
std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,p_Var15);
|
|
}
|
|
uVar2 = local_40;
|
|
iVar4 = FUN_1000fb02((void *)(param_1 + -8),local_40,local_50,(int *)&local_40,&local_4c);
|
|
uVar5 = local_40;
|
|
if (-1 < iVar4) {
|
|
if (*(char *)(local_4c + 0xf) == '\0') {
|
|
FUN_1000f629((void *)(local_40 + 0x3c),&local_40,&local_44);
|
|
if (local_40 == *(uint *)(uVar5 + 0x40)) {
|
|
iVar4 = -0x7ff8ffa9;
|
|
}
|
|
else {
|
|
local_28 = DAT_100201f8;
|
|
uStack_24 = DAT_100201fc;
|
|
uStack_20 = DAT_10020200;
|
|
uStack_1c = DAT_10020204;
|
|
ppuVar16 = &local_48;
|
|
plVar14 = &local_44;
|
|
uVar13 = 0x10013078;
|
|
FUN_1000f629((void *)(uVar5 + 0x3c),plVar14,(int *)ppuVar16);
|
|
if (local_44 != *(int *)(uVar5 + 0x40)) {
|
|
local_28 = *(undefined4 *)(local_44 + 0x10);
|
|
uStack_24 = *(undefined4 *)(local_44 + 0x14);
|
|
uStack_20 = *(undefined4 *)(local_44 + 0x18);
|
|
uStack_1c = *(undefined4 *)(local_44 + 0x1c);
|
|
}
|
|
local_48 = &stack0xffffff74;
|
|
uVar2 = uVar2 & 0xffff0000;
|
|
ATL::CComVariant::InternalCopy((CComVariant *)&stack0xffffff74,(tagVARIANT *)&local_6c.n2);
|
|
local_8 = CONCAT31((int3)(local_8 >> 8),1);
|
|
FUN_1000d36d((void *)(local_3c + -8),uVar2,uVar13,plVar14,ppuVar16);
|
|
iVar4 = (**(code **)(**(int **)(uVar5 + 0x14) + 0x18))
|
|
(*(int **)(uVar5 + 0x14),*(undefined4 *)(local_4c + 8),
|
|
*(undefined4 *)(local_3c + 0x34),local_40 + 0x10);
|
|
}
|
|
}
|
|
else {
|
|
iVar4 = -0x7fffbfdf;
|
|
}
|
|
}
|
|
bVar1 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
|
|
(DAT_100294e0 + 0xc));
|
|
if (bVar1 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
|
|
p_Var15 = endl_exref;
|
|
pbVar3 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
|
|
L"CLMXProxyServer::WriteVerified - returning HRESULT ");
|
|
pbVar3 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,iVar4)
|
|
;
|
|
std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar3,p_Var15);
|
|
}
|
|
local_8 = local_8 & 0xffffff00;
|
|
_set_se_translator(local_38[0]);
|
|
FUN_100131a1();
|
|
return;
|
|
}
|
|
|
|
|
|
```
|
|
|
|
## FUN_100135fe at 100135fe
|
|
|
|
Signature: `undefined __stdcall FUN_100135fe(int param_1, uint param_2, long param_3, long param_4, undefined1 * param_5, uint param_6, ULONG param_7, undefined4 param_8, undefined4 param_9, uint param_10, ULONG param_11, undefined4 param_12, undefined4 param_13)`
|
|
|
|
```c
|
|
|
|
/* WARNING: Function: __EH_prolog3_catch_GS replaced with injection: EH_prolog3 */
|
|
|
|
void FUN_100135fe(int param_1,uint param_2,long param_3,long param_4,undefined1 *param_5,
|
|
uint param_6,ULONG param_7,undefined4 param_8,undefined4 param_9,uint param_10,
|
|
ULONG param_11,undefined4 param_12,undefined4 param_13)
|
|
|
|
{
|
|
undefined4 *puVar1;
|
|
basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> bVar2;
|
|
uint uVar3;
|
|
uint uVar4;
|
|
basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *pbVar5;
|
|
int iVar6;
|
|
uint uVar7;
|
|
wchar_t *pwVar8;
|
|
long lVar9;
|
|
wchar_t *pwVar10;
|
|
long lVar11;
|
|
wchar_t *pwVar12;
|
|
undefined1 *puVar13;
|
|
wchar_t *pwVar14;
|
|
wchar_t *pwVar15;
|
|
undefined4 uVar16;
|
|
long *plVar17;
|
|
_func_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr_basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>_ptr
|
|
*p_Var18;
|
|
undefined1 **ppuVar19;
|
|
_union_2683 local_78;
|
|
_union_2683 local_68;
|
|
long local_4c;
|
|
undefined1 *local_48;
|
|
uint local_44;
|
|
long local_40;
|
|
_func_void_uint__EXCEPTION_POINTERS_ptr *local_3c;
|
|
int local_38 [4];
|
|
undefined4 local_28;
|
|
undefined4 uStack_24;
|
|
undefined4 uStack_20;
|
|
undefined4 uStack_1c;
|
|
uint local_8;
|
|
undefined4 uStack_4;
|
|
|
|
uStack_4 = 0x68;
|
|
local_44 = param_2;
|
|
local_40 = param_3;
|
|
local_4c = param_4;
|
|
local_48 = param_5;
|
|
local_68._0_4_ = param_6;
|
|
local_68.decVal.Hi32 = param_7;
|
|
local_68._8_4_ = param_8;
|
|
local_68._12_4_ = param_9;
|
|
local_78._0_4_ = param_10;
|
|
local_78.decVal.Hi32 = param_11;
|
|
local_78._8_4_ = param_12;
|
|
local_78._12_4_ = param_13;
|
|
local_8 = 0;
|
|
FUN_10011b07(&local_3c);
|
|
local_8 = CONCAT31(local_8._1_3_,1);
|
|
local_38[0] = 0;
|
|
bVar2 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
|
|
(DAT_100294e0 + 0xc));
|
|
if (bVar2 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
|
|
uVar3 = local_78._0_4_ & 0xffff;
|
|
pwVar15 = L" Time Type ";
|
|
uVar4 = local_68._0_4_ & 0xffff;
|
|
pwVar14 = L" Variant Type ";
|
|
pwVar12 = L" VerifierUserID ";
|
|
pwVar10 = L" CurrentUserID ";
|
|
pwVar8 = L" Item Handle ";
|
|
uVar7 = local_44;
|
|
lVar9 = local_40;
|
|
lVar11 = local_4c;
|
|
puVar13 = local_48;
|
|
p_Var18 = endl_exref;
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
|
|
L"CLMXProxyServer::WriteSecured - Server Handle ");
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,uVar7)
|
|
;
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar5,pwVar8);
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,lVar9)
|
|
;
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar5,pwVar10);
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
|
|
(pbVar5,lVar11);
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar5,pwVar12);
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<
|
|
(pbVar5,(long)puVar13);
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar5,pwVar14);
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,uVar4)
|
|
;
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf((int *)pbVar5,pwVar15);
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,uVar3)
|
|
;
|
|
std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,p_Var18);
|
|
}
|
|
uVar7 = local_44;
|
|
iVar6 = FUN_1000fb02((void *)(param_1 + -8),local_44,local_40,&local_40,local_38);
|
|
lVar9 = local_40;
|
|
if (-1 < iVar6) {
|
|
FUN_1000f629((void *)(local_40 + 0x3c),&local_44,&local_4c);
|
|
if (local_44 == *(uint *)(lVar9 + 0x40)) {
|
|
iVar6 = -0x7ff8ffa9;
|
|
}
|
|
else {
|
|
local_28 = DAT_100201f8;
|
|
uStack_24 = DAT_100201fc;
|
|
uStack_20 = DAT_10020200;
|
|
uStack_1c = DAT_10020204;
|
|
ppuVar19 = &local_48;
|
|
plVar17 = &local_4c;
|
|
uVar16 = 0x10013769;
|
|
FUN_1000f629((void *)(local_40 + 0x3c),plVar17,(int *)ppuVar19);
|
|
if (local_4c != *(int *)(local_40 + 0x40)) {
|
|
local_28 = *(undefined4 *)(local_4c + 0x10);
|
|
uStack_24 = *(undefined4 *)(local_4c + 0x14);
|
|
uStack_20 = *(undefined4 *)(local_4c + 0x18);
|
|
uStack_1c = *(undefined4 *)(local_4c + 0x1c);
|
|
}
|
|
local_48 = &stack0xffffff68;
|
|
uVar7 = uVar7 & 0xffff0000;
|
|
ATL::CComVariant::InternalCopy((CComVariant *)&stack0xffffff68,(tagVARIANT *)&local_68.n2);
|
|
local_8._1_3_ = (undefined3)(local_8 >> 8);
|
|
local_8._0_1_ = 1;
|
|
FUN_1000d36d((void *)(param_1 + -8),uVar7,uVar16,plVar17,ppuVar19);
|
|
local_48 = &stack0xffffff68;
|
|
uVar7 = uVar7 & 0xffff0000;
|
|
ATL::CComVariant::InternalCopy((CComVariant *)&stack0xffffff68,(tagVARIANT *)&local_78.n2);
|
|
local_8 = CONCAT31(local_8._1_3_,1);
|
|
FUN_1000d4d1((void *)(param_1 + -8),uVar7,uVar16,plVar17,ppuVar19);
|
|
puVar1 = (undefined4 *)(local_38[0] + 8);
|
|
local_38[0] = *(int *)(param_1 + 0x34);
|
|
iVar6 = (**(code **)(**(int **)(local_40 + 0x14) + 0x58))
|
|
(*(int **)(local_40 + 0x14),*puVar1,*(int *)(param_1 + 0x34),0,
|
|
*(undefined4 *)(param_1 + 0x3c),*(undefined4 *)(param_1 + 0x40),
|
|
local_44 + 0x10);
|
|
}
|
|
}
|
|
bVar2 = FUN_10003f01(*(basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> **)
|
|
(DAT_100294e0 + 0xc));
|
|
if (bVar2 != (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>)0x0) {
|
|
p_Var18 = endl_exref;
|
|
pbVar5 = (basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_> *)
|
|
FUN_10002dbf(*(int **)(DAT_100294e0 + 0xc),
|
|
L"CLMXProxyServer::WriteVerified - returning HRESULT ");
|
|
pbVar5 = std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,iVar6)
|
|
;
|
|
std::basic_ostream<wchar_t,struct_std::char_traits<wchar_t>_>::operator<<(pbVar5,p_Var18);
|
|
}
|
|
local_8 = local_8 & 0xffffff00;
|
|
_set_se_translator(local_3c);
|
|
FUN_100138c0();
|
|
return;
|
|
}
|
|
|
|
|
|
```
|
|
|