From eb60123786d33cdaf22f9adf3c87328c861d78a5 Mon Sep 17 00:00:00 2001 From: "mr.exodia" Date: Sat, 16 Nov 2013 15:01:29 +0100 Subject: [PATCH] DBG: added _dbg_memisvalidreadptr export BRIDGE: added DbgMemIsValidReadPtr BRIDGE: compatible with MSVC DBG: added comment+label set/get/del DBG: added MSVC lib files for sqlite PROJECT: updated help PROJECT: update gitignore --- .gitignore | 2 + help/cmt_cmtset_commentset.htm | 34 ++++ help/cmtc_cmtdel_commentdel.htm | 29 +++ help/lbl_lblset_labelset.htm | 33 ++++ help/lblc_lbldel_labeldel.htm | 22 +++ help/x64_dbg.wcp | 236 +++++++++++++---------- x64_dbg_bridge/_global.cpp | 1 + x64_dbg_bridge/_global.h | 2 + x64_dbg_bridge/bridgemain.cpp | 41 ++-- x64_dbg_bridge/bridgemain.h | 1 + x64_dbg_dbg/_exports.cpp | 32 +++- x64_dbg_dbg/_exports.h | 1 + x64_dbg_dbg/_global.cpp | 2 + x64_dbg_dbg/_global.h | 3 + x64_dbg_dbg/addrinfo.cpp | 328 ++++++++++++++++++++++++++++++++ x64_dbg_dbg/addrinfo.h | 7 + x64_dbg_dbg/debugger.cpp | 21 +- x64_dbg_dbg/instruction.cpp | 71 +++++++ x64_dbg_dbg/instruction.h | 4 + x64_dbg_dbg/memory.cpp | 6 + x64_dbg_dbg/memory.h | 1 + x64_dbg_dbg/sqlite/sqlite.def | 207 ++++++++++++++++++++ x64_dbg_dbg/sqlite/sqlite32.lib | Bin 0 -> 48100 bytes x64_dbg_dbg/sqlite/sqlite64.lib | Bin 0 -> 47100 bytes x64_dbg_dbg/x64_dbg.cpp | 6 + x64_dbg_dbg/x64_dbg_dbg.vcxproj | 4 +- 26 files changed, 958 insertions(+), 136 deletions(-) create mode 100644 help/cmt_cmtset_commentset.htm create mode 100644 help/cmtc_cmtdel_commentdel.htm create mode 100644 help/lbl_lblset_labelset.htm create mode 100644 help/lblc_lbldel_labeldel.htm create mode 100644 x64_dbg_dbg/sqlite/sqlite.def create mode 100644 x64_dbg_dbg/sqlite/sqlite32.lib create mode 100644 x64_dbg_dbg/sqlite/sqlite64.lib diff --git a/.gitignore b/.gitignore index 6e6e0ba5..4a377749 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ */obj/ bin/*/* ipch/* +x64_dbg_*/Win32/* +x64_dbg_*/x64/* #global filetypes to ignore *.depend diff --git a/help/cmt_cmtset_commentset.htm b/help/cmt_cmtset_commentset.htm new file mode 100644 index 00000000..bcc61ab3 --- /dev/null +++ b/help/cmt_cmtset_commentset.htm @@ -0,0 +1,34 @@ + + + +cmt/cmtset/commentset + + + + + + + +

cmt[,cmtset,commentset]
Set a +comment.

+

+ +arguments +
  arg1: Address to set the comment at (preferably inside a +module).

+

+   +arg2: Comment text.

+

+ + +result +
+ This command does not set +any result variables.

\ No newline at end of file diff --git a/help/cmtc_cmtdel_commentdel.htm b/help/cmtc_cmtdel_commentdel.htm new file mode 100644 index 00000000..bd497db6 --- /dev/null +++ b/help/cmtc_cmtdel_commentdel.htm @@ -0,0 +1,29 @@ + + + +cmtc/cmtdel/commentdel + + + + + + + +

cmtc[,cmtdel,commentdel]
Delete a comment.

+

+ +arguments + +
  arg1: Address of the comment to delete.

+

+ + result + +
+This command does not set any result variables.

diff --git a/help/lbl_lblset_labelset.htm b/help/lbl_lblset_labelset.htm new file mode 100644 index 00000000..db7deb05 --- /dev/null +++ b/help/lbl_lblset_labelset.htm @@ -0,0 +1,33 @@ + + + +lbl/lblset/labelset + + + + + + + +

lbl[,lblset,labelset]
Set a label.

+

+ +arguments + + +
  arg1: Address to set the label at (preferably +inside a module). +

+

  arg2: Label text.

+

+ + +result +
This command does not set any result +variables.

\ No newline at end of file diff --git a/help/lblc_lbldel_labeldel.htm b/help/lblc_lbldel_labeldel.htm new file mode 100644 index 00000000..92f598a5 --- /dev/null +++ b/help/lblc_lbldel_labeldel.htm @@ -0,0 +1,22 @@ + + + +lblc/lbldel/labeldel + + + + + + + +

lblc[,lbldel,labeldel]
Delete a label.

+

arguments
  arg1: Address of the label to delete.

+

result
This command does not set any result +variables.

+ \ No newline at end of file diff --git a/help/x64_dbg.wcp b/help/x64_dbg.wcp index 84e06e42..e99db68a 100644 --- a/help/x64_dbg.wcp +++ b/help/x64_dbg.wcp @@ -96,7 +96,7 @@ Font= DefaultTopic=Introduction.htm [TOPICS] -TitleList=36 +TitleList=39 TitleList.Title.0=Introduction TitleList.Level.0=0 TitleList.Url.0=Introduction.htm @@ -137,324 +137,354 @@ TitleList.ContextNumber.3=1020 TitleList.ApplyTemp.3=0 TitleList.Expanded.3=0 TitleList.Kind.3=0 -TitleList.Title.4=Hotkeys -TitleList.Level.4=1 -TitleList.Url.4=Hotkeys.htm +TitleList.Title.4=Commands +TitleList.Level.4=0 +TitleList.Url.4=Commands.htm TitleList.Icon.4=0 TitleList.Status.4=0 TitleList.Keywords.4= -TitleList.ContextNumber.4=1034 +TitleList.ContextNumber.4=1003 TitleList.ApplyTemp.4=0 -TitleList.Expanded.4=0 +TitleList.Expanded.4=1 TitleList.Kind.4=0 -TitleList.Title.5=Commands -TitleList.Level.5=0 -TitleList.Url.5=Commands.htm +TitleList.Title.5=x/exit +TitleList.Level.5=1 +TitleList.Url.5=x_exit.htm TitleList.Icon.5=0 TitleList.Status.5=0 TitleList.Keywords.5= -TitleList.ContextNumber.5=1003 +TitleList.ContextNumber.5=1004 TitleList.ApplyTemp.5=0 TitleList.Expanded.5=0 TitleList.Kind.5=0 -TitleList.Title.6=x/exit +TitleList.Title.6=strlen/charcount/ccount TitleList.Level.6=1 -TitleList.Url.6=x_exit.htm +TitleList.Url.6=strlen_charcount_ccount.htm TitleList.Icon.6=0 TitleList.Status.6=0 TitleList.Keywords.6= -TitleList.ContextNumber.6=1004 +TitleList.ContextNumber.6=1005 TitleList.ApplyTemp.6=0 TitleList.Expanded.6=0 TitleList.Kind.6=0 -TitleList.Title.7=strlen/charcount/ccount +TitleList.Title.7=var/varnew TitleList.Level.7=1 -TitleList.Url.7=strlen_charcount_ccount.htm +TitleList.Url.7=var_varnew.htm TitleList.Icon.7=0 TitleList.Status.7=0 TitleList.Keywords.7= -TitleList.ContextNumber.7=1005 +TitleList.ContextNumber.7=1006 TitleList.ApplyTemp.7=0 TitleList.Expanded.7=0 TitleList.Kind.7=0 -TitleList.Title.8=var/varnew +TitleList.Title.8=vardel TitleList.Level.8=1 -TitleList.Url.8=var_varnew.htm +TitleList.Url.8=vardel.htm TitleList.Icon.8=0 TitleList.Status.8=0 TitleList.Keywords.8= -TitleList.ContextNumber.8=1006 +TitleList.ContextNumber.8=1007 TitleList.ApplyTemp.8=0 TitleList.Expanded.8=0 TitleList.Kind.8=0 -TitleList.Title.9=vardel +TitleList.Title.9=mov/set TitleList.Level.9=1 -TitleList.Url.9=vardel.htm +TitleList.Url.9=mov_set.htm TitleList.Icon.9=0 TitleList.Status.9=0 TitleList.Keywords.9= -TitleList.ContextNumber.9=1007 +TitleList.ContextNumber.9=1008 TitleList.ApplyTemp.9=0 TitleList.Expanded.9=0 TitleList.Kind.9=0 -TitleList.Title.10=mov/set +TitleList.Title.10=cls TitleList.Level.10=1 -TitleList.Url.10=mov_set.htm +TitleList.Url.10=cls.htm TitleList.Icon.10=0 TitleList.Status.10=0 TitleList.Keywords.10= -TitleList.ContextNumber.10=1008 +TitleList.ContextNumber.10=1009 TitleList.ApplyTemp.10=0 TitleList.Expanded.10=0 TitleList.Kind.10=0 -TitleList.Title.11=cls +TitleList.Title.11=varlist TitleList.Level.11=1 -TitleList.Url.11=cls.htm +TitleList.Url.11=varlist.htm TitleList.Icon.11=0 TitleList.Status.11=0 TitleList.Keywords.11= -TitleList.ContextNumber.11=1009 +TitleList.ContextNumber.11=1010 TitleList.ApplyTemp.11=0 TitleList.Expanded.11=0 TitleList.Kind.11=0 -TitleList.Title.12=varlist +TitleList.Title.12=InitDebug/initdbg/init TitleList.Level.12=1 -TitleList.Url.12=varlist.htm +TitleList.Url.12=InitDebug_initdbg_init.htm TitleList.Icon.12=0 TitleList.Status.12=0 TitleList.Keywords.12= -TitleList.ContextNumber.12=1010 +TitleList.ContextNumber.12=1011 TitleList.ApplyTemp.12=0 TitleList.Expanded.12=0 TitleList.Kind.12=0 -TitleList.Title.13=InitDebug/initdbg/init +TitleList.Title.13=run/go/r/g TitleList.Level.13=1 -TitleList.Url.13=InitDebug_initdbg_init.htm +TitleList.Url.13=run_go_r_g.htm TitleList.Icon.13=0 TitleList.Status.13=0 TitleList.Keywords.13= -TitleList.ContextNumber.13=1011 +TitleList.ContextNumber.13=1013 TitleList.ApplyTemp.13=0 TitleList.Expanded.13=0 TitleList.Kind.13=0 -TitleList.Title.14=run/go/r/g +TitleList.Title.14=SetBPXOptions/bptype TitleList.Level.14=1 -TitleList.Url.14=run_go_r_g.htm +TitleList.Url.14=SetBPXOptions_bptype.htm TitleList.Icon.14=0 TitleList.Status.14=0 TitleList.Keywords.14= -TitleList.ContextNumber.14=1013 +TitleList.ContextNumber.14=1018 TitleList.ApplyTemp.14=0 TitleList.Expanded.14=0 TitleList.Kind.14=0 -TitleList.Title.15=SetBPXOptions/bptype +TitleList.Title.15=SetBPX/bp/bpx TitleList.Level.15=1 -TitleList.Url.15=SetBPXOptions_bptype.htm +TitleList.Url.15=SetBPX_bp_bpx.htm TitleList.Icon.15=0 TitleList.Status.15=0 TitleList.Keywords.15= -TitleList.ContextNumber.15=1018 +TitleList.ContextNumber.15=1012 TitleList.ApplyTemp.15=0 TitleList.Expanded.15=0 TitleList.Kind.15=0 -TitleList.Title.16=SetBPX/bp/bpx +TitleList.Title.16=EnableBPX/bpe/be TitleList.Level.16=1 -TitleList.Url.16=SetBPX_bp_bpx.htm +TitleList.Url.16=EnableBPX_bpe_be.htm TitleList.Icon.16=0 TitleList.Status.16=0 TitleList.Keywords.16= -TitleList.ContextNumber.16=1012 +TitleList.ContextNumber.16=1014 TitleList.ApplyTemp.16=0 TitleList.Expanded.16=0 TitleList.Kind.16=0 -TitleList.Title.17=EnableBPX/bpe/be +TitleList.Title.17=DisableBPX/bpd/bd TitleList.Level.17=1 -TitleList.Url.17=EnableBPX_bpe_be.htm +TitleList.Url.17=DisableBPX_bpd_bd.htm TitleList.Icon.17=0 TitleList.Status.17=0 TitleList.Keywords.17= -TitleList.ContextNumber.17=1014 +TitleList.ContextNumber.17=1016 TitleList.ApplyTemp.17=0 TitleList.Expanded.17=0 TitleList.Kind.17=0 -TitleList.Title.18=DisableBPX/bpd/bd +TitleList.Title.18=ToggleBPX/bpt/bt TitleList.Level.18=1 -TitleList.Url.18=DisableBPX_bpd_bd.htm +TitleList.Url.18=ToggleBPX_bpt_bt.htm TitleList.Icon.18=0 TitleList.Status.18=0 TitleList.Keywords.18= -TitleList.ContextNumber.18=1016 +TitleList.ContextNumber.18=1019 TitleList.ApplyTemp.18=0 TitleList.Expanded.18=0 TitleList.Kind.18=0 -TitleList.Title.19=ToggleBPX/bpt/bt +TitleList.Title.19=DeleteBPX/bpc/bc TitleList.Level.19=1 -TitleList.Url.19=ToggleBPX_bpt_bt.htm +TitleList.Url.19=DeleteBPX_bpc_bc.htm TitleList.Icon.19=0 TitleList.Status.19=0 TitleList.Keywords.19= -TitleList.ContextNumber.19=1019 +TitleList.ContextNumber.19=1017 TitleList.ApplyTemp.19=0 TitleList.Expanded.19=0 TitleList.Kind.19=0 -TitleList.Title.20=DeleteBPX/bpc/bc +TitleList.Title.20=bplist TitleList.Level.20=1 -TitleList.Url.20=DeleteBPX_bpc_bc.htm +TitleList.Url.20=bplist.htm TitleList.Icon.20=0 TitleList.Status.20=0 TitleList.Keywords.20= -TitleList.ContextNumber.20=1017 +TitleList.ContextNumber.20=1015 TitleList.ApplyTemp.20=0 TitleList.Expanded.20=0 TitleList.Kind.20=0 -TitleList.Title.21=bplist +TitleList.Title.21=StepInto/sti TitleList.Level.21=1 -TitleList.Url.21=bplist.htm +TitleList.Url.21=StepInto.htm TitleList.Icon.21=0 TitleList.Status.21=0 TitleList.Keywords.21= -TitleList.ContextNumber.21=1015 +TitleList.ContextNumber.21=1021 TitleList.ApplyTemp.21=0 TitleList.Expanded.21=0 TitleList.Kind.21=0 -TitleList.Title.22=StepInto/sti +TitleList.Title.22=StepOver/step/sto/st TitleList.Level.22=1 -TitleList.Url.22=StepInto.htm +TitleList.Url.22=StepOver.htm TitleList.Icon.22=0 TitleList.Status.22=0 TitleList.Keywords.22= -TitleList.ContextNumber.22=1021 +TitleList.ContextNumber.22=1022 TitleList.ApplyTemp.22=0 TitleList.Expanded.22=0 TitleList.Kind.22=0 -TitleList.Title.23=StepOver/step/sto/st +TitleList.Title.23=SingleStep/sstep/sst TitleList.Level.23=1 -TitleList.Url.23=StepOver.htm +TitleList.Url.23=SingleStep.htm TitleList.Icon.23=0 TitleList.Status.23=0 TitleList.Keywords.23= -TitleList.ContextNumber.23=1022 +TitleList.ContextNumber.23=1023 TitleList.ApplyTemp.23=0 TitleList.Expanded.23=0 TitleList.Kind.23=0 -TitleList.Title.24=SingleStep/sstep/sst +TitleList.Title.24=HideDebugger/dbh/hide TitleList.Level.24=1 -TitleList.Url.24=SingleStep.htm +TitleList.Url.24=HideDebugger_dbh_hide.htm TitleList.Icon.24=0 TitleList.Status.24=0 TitleList.Keywords.24= -TitleList.ContextNumber.24=1023 +TitleList.ContextNumber.24=1025 TitleList.ApplyTemp.24=0 TitleList.Expanded.24=0 TitleList.Kind.24=0 -TitleList.Title.25=HideDebugger/dbh/hide +TitleList.Title.25=disasm/dis/d TitleList.Level.25=1 -TitleList.Url.25=HideDebugger_dbh_hide.htm +TitleList.Url.25=disasm_dis_d.htm TitleList.Icon.25=0 TitleList.Status.25=0 TitleList.Keywords.25= -TitleList.ContextNumber.25=1025 +TitleList.ContextNumber.25=1026 TitleList.ApplyTemp.25=0 TitleList.Expanded.25=0 TitleList.Kind.25=0 -TitleList.Title.26=disasm/dis/d +TitleList.Title.26=SetMemoryBPX/membp/bpm TitleList.Level.26=1 -TitleList.Url.26=disasm_dis_d.htm +TitleList.Url.26=SetMemoryBPX_membp_bpm.htm TitleList.Icon.26=0 TitleList.Status.26=0 TitleList.Keywords.26= -TitleList.ContextNumber.26=1026 +TitleList.ContextNumber.26=1027 TitleList.ApplyTemp.26=0 TitleList.Expanded.26=0 TitleList.Kind.26=0 -TitleList.Title.27=SetMemoryBPX/membp/bpm +TitleList.Title.27=chd TitleList.Level.27=1 -TitleList.Url.27=SetMemoryBPX_membp_bpm.htm +TitleList.Url.27=chd.htm TitleList.Icon.27=0 TitleList.Status.27=0 TitleList.Keywords.27= -TitleList.ContextNumber.27=1027 +TitleList.ContextNumber.27=1029 TitleList.ApplyTemp.27=0 TitleList.Expanded.27=0 TitleList.Kind.27=0 -TitleList.Title.28=chd +TitleList.Title.28=rtr TitleList.Level.28=1 -TitleList.Url.28=chd.htm +TitleList.Url.28=rtr.htm TitleList.Icon.28=0 TitleList.Status.28=0 TitleList.Keywords.28= -TitleList.ContextNumber.28=1029 +TitleList.ContextNumber.28=1028 TitleList.ApplyTemp.28=0 TitleList.Expanded.28=0 TitleList.Kind.28=0 -TitleList.Title.29=rtr +TitleList.Title.29=SetHardwareBreakpoint/bph/bphws TitleList.Level.29=1 -TitleList.Url.29=rtr.htm +TitleList.Url.29=SetHardwareBreakpoint_bph_bphws.htm TitleList.Icon.29=0 TitleList.Status.29=0 TitleList.Keywords.29= -TitleList.ContextNumber.29=1028 +TitleList.ContextNumber.29=1030 TitleList.ApplyTemp.29=0 TitleList.Expanded.29=0 TitleList.Kind.29=0 -TitleList.Title.30=SetHardwareBreakpoint/bph/bphws +TitleList.Title.30=alloc TitleList.Level.30=1 -TitleList.Url.30=SetHardwareBreakpoint_bph_bphws.htm +TitleList.Url.30=alloc.htm TitleList.Icon.30=0 TitleList.Status.30=0 TitleList.Keywords.30= -TitleList.ContextNumber.30=1030 +TitleList.ContextNumber.30=1032 TitleList.ApplyTemp.30=0 TitleList.Expanded.30=0 TitleList.Kind.30=0 -TitleList.Title.31=alloc +TitleList.Title.31=free TitleList.Level.31=1 -TitleList.Url.31=alloc.htm +TitleList.Url.31=free.htm TitleList.Icon.31=0 TitleList.Status.31=0 TitleList.Keywords.31= -TitleList.ContextNumber.31=1032 +TitleList.ContextNumber.31=1031 TitleList.ApplyTemp.31=0 TitleList.Expanded.31=0 TitleList.Kind.31=0 -TitleList.Title.32=free +TitleList.Title.32=Fill/memset TitleList.Level.32=1 -TitleList.Url.32=free.htm +TitleList.Url.32=Fill_memset.htm TitleList.Icon.32=0 TitleList.Status.32=0 TitleList.Keywords.32= -TitleList.ContextNumber.32=1031 +TitleList.ContextNumber.32=1033 TitleList.ApplyTemp.32=0 TitleList.Expanded.32=0 TitleList.Kind.32=0 -TitleList.Title.33=Fill/memset +TitleList.Title.33=cmt/cmtset/commentset TitleList.Level.33=1 -TitleList.Url.33=Fill_memset.htm +TitleList.Url.33=cmt_cmtset_commentset.htm TitleList.Icon.33=0 TitleList.Status.33=0 TitleList.Keywords.33= -TitleList.ContextNumber.33=1033 +TitleList.ContextNumber.33=1035 TitleList.ApplyTemp.33=0 TitleList.Expanded.33=0 TitleList.Kind.33=0 -TitleList.Title.34=Special Thanks -TitleList.Level.34=0 -TitleList.Url.34=Special_Thanks.htm +TitleList.Title.34=cmtc/cmtdel/commentdel +TitleList.Level.34=1 +TitleList.Url.34=cmtc_cmtdel_commentdel.htm TitleList.Icon.34=0 TitleList.Status.34=0 TitleList.Keywords.34= -TitleList.ContextNumber.34=1024 +TitleList.ContextNumber.34=1036 TitleList.ApplyTemp.34=0 TitleList.Expanded.34=0 TitleList.Kind.34=0 -TitleList.Title.35=Fixed Top Style -TitleList.Level.35=0 -TitleList.Url.35=template\fixedtop.htm +TitleList.Title.35=lbl/lblset/labelset +TitleList.Level.35=1 +TitleList.Url.35=lbl_lblset_labelset.htm TitleList.Icon.35=0 TitleList.Status.35=0 TitleList.Keywords.35= -TitleList.ContextNumber.35= +TitleList.ContextNumber.35=1037 TitleList.ApplyTemp.35=0 TitleList.Expanded.35=0 -TitleList.Kind.35=2 +TitleList.Kind.35=0 +TitleList.Title.36=lblc/lbldel/labeldel +TitleList.Level.36=1 +TitleList.Url.36=lblc_lbldel_labeldel.htm +TitleList.Icon.36=0 +TitleList.Status.36=0 +TitleList.Keywords.36= +TitleList.ContextNumber.36=1038 +TitleList.ApplyTemp.36=0 +TitleList.Expanded.36=0 +TitleList.Kind.36=0 +TitleList.Title.37=Special Thanks +TitleList.Level.37=0 +TitleList.Url.37=Special_Thanks.htm +TitleList.Icon.37=0 +TitleList.Status.37=0 +TitleList.Keywords.37= +TitleList.ContextNumber.37=1024 +TitleList.ApplyTemp.37=0 +TitleList.Expanded.37=0 +TitleList.Kind.37=0 +TitleList.Title.38=Fixed Top Style +TitleList.Level.38=0 +TitleList.Url.38=template\fixedtop.htm +TitleList.Icon.38=0 +TitleList.Status.38=0 +TitleList.Keywords.38= +TitleList.ContextNumber.38= +TitleList.ApplyTemp.38=0 +TitleList.Expanded.38=0 +TitleList.Kind.38=2 diff --git a/x64_dbg_bridge/_global.cpp b/x64_dbg_bridge/_global.cpp index c70df78b..91dd66e3 100644 --- a/x64_dbg_bridge/_global.cpp +++ b/x64_dbg_bridge/_global.cpp @@ -28,3 +28,4 @@ DBGADDRINFOSET _dbg_addrinfoset; DBGBPGETTYPEAT _dbg_bpgettypeat; DBGGETREGDUMP _dbg_getregdump; DBGVALTOSTRING _dbg_valtostring; +DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr; diff --git a/x64_dbg_bridge/_global.h b/x64_dbg_bridge/_global.h index 7b4c1b9a..4beac1f4 100644 --- a/x64_dbg_bridge/_global.h +++ b/x64_dbg_bridge/_global.h @@ -60,6 +60,7 @@ typedef bool (*DBGADDRINFOSET)(duint addr, ADDRINFO* addrinfo); typedef BPXTYPE (*DBGBPGETTYPEAT)(duint addr); typedef bool (*DBGGETREGDUMP)(REGDUMP* regdump); typedef bool (*DBGVALTOSTRING)(const char* string, duint* value); +typedef bool (*DBGMEMISVALIDREADPTR)(duint addr); //DBG functions extern DBGDBGINIT _dbg_dbginit; @@ -76,5 +77,6 @@ extern DBGADDRINFOSET _dbg_addrinfoset; extern DBGBPGETTYPEAT _dbg_bpgettypeat; extern DBGGETREGDUMP _dbg_getregdump; extern DBGVALTOSTRING _dbg_valtostring; +extern DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr; #endif // _GLOBAL_H diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index c5ded808..b0864e48 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -108,6 +108,10 @@ DLL_IMPEXP const char* BridgeInit() _dbg_valtostring=(DBGVALTOSTRING)GetProcAddress(hInstDbg, "_dbg_valtostring"); if(!_dbg_valtostring) return "Export \"_dbg_valtostring\" could not be found!"; + //_dbg_memisvalidreadptr + _dbg_memisvalidreadptr=(DBGMEMISVALIDREADPTR)GetProcAddress(hInstDbg, "_dbg_memisvalidreadptr"); + if(!_dbg_memisvalidreadptr) + return "Export \"_dbg_memisvalidreadptr\" could not be found!"; return 0; } @@ -187,24 +191,8 @@ DLL_IMPEXP bool DbgIsJumpGoingToExecute(duint addr) DLL_IMPEXP bool DbgGetLabelAt(duint addr, SEGMENTREG segment, char* text) //(module.)+label { - if(!text or !addr) + if(!text || !addr) return false; - //test code (highlighting.exe|x32) - /*if(addr==0x40102b) - { - strcpy(text, "highlighting.retn"); - return true; - } - else if(addr==0x401020 || addr==0x401022) - { - strcpy(text, "highlighting.label"); - return true; - } - else if(addr==0x402000) - { - strcpy(text, "highlighting.dataLabel"); - return true; - }*/ ADDRINFO info; memset(&info, 0, sizeof(info)); info.flags=label; @@ -216,7 +204,7 @@ DLL_IMPEXP bool DbgGetLabelAt(duint addr, SEGMENTREG segment, char* text) //(mod DLL_IMPEXP bool DbgSetLabelAt(duint addr, const char* text) { - if(!text or strlen(text)>=MAX_LABEL_SIZE or !addr) + if(!text || strlen(text)>=MAX_LABEL_SIZE || !addr) return false; ADDRINFO info; memset(&info, 0, sizeof(info)); @@ -229,14 +217,8 @@ DLL_IMPEXP bool DbgSetLabelAt(duint addr, const char* text) DLL_IMPEXP bool DbgGetCommentAt(duint addr, char* text) //comment (not live) { - if(!text or !addr) + if(!text || !addr) return false; - //test code (highlighting.exe) - /*if(addr==0x401000) - { - strcpy(text, "test comment"); - return true; - }*/ ADDRINFO info; memset(&info, 0, sizeof(info)); info.flags=comment; @@ -248,7 +230,7 @@ DLL_IMPEXP bool DbgGetCommentAt(duint addr, char* text) //comment (not live) DLL_IMPEXP bool DbgSetCommentAt(duint addr, const char* text) { - if(!text or strlen(text)>=MAX_COMMENT_SIZE or !addr) + if(!text || strlen(text)>=MAX_COMMENT_SIZE || !addr) return false; ADDRINFO info; memset(&info, 0, sizeof(info)); @@ -261,7 +243,7 @@ DLL_IMPEXP bool DbgSetCommentAt(duint addr, const char* text) DLL_IMPEXP bool DbgGetModuleAt(duint addr, char* text) { - if(!text or !addr) + if(!text || !addr) return false; ADDRINFO info; memset(&info, 0, sizeof(info)); @@ -295,6 +277,11 @@ DLL_IMPEXP bool DbgValToString(const char* string, duint value) return _dbg_valtostring(string, &valueCopy); } +DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr) +{ + return _dbg_memisvalidreadptr(addr); +} + //GUI DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 30022ced..564b15fb 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -158,6 +158,7 @@ DLL_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr); DLL_IMPEXP duint DbgValFromString(const char* string); DLL_IMPEXP bool DbgGetRegDump(REGDUMP* regdump); DLL_IMPEXP bool DbgValToString(const char* string, duint value); +DLL_IMPEXP bool DbgMemIsValidReadPtr(duint addr); //GUI functions DLL_IMPEXP void GuiDisasmAt(duint addr, duint cip); diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index b8ae58c0..ab2db1a7 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -60,6 +60,11 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap) return true; } +extern "C" DLL_EXPORT bool _dbg_memisvalidreadptr(duint addr) +{ + return memisvalidreadptr(fdProcessInfo->hProcess, addr); +} + extern "C" DLL_EXPORT void _dbg_dbgexitsignal() { //TODO: handle exit signal @@ -106,18 +111,39 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR } if(addrinfo->flags&label) //TODO: get label { - //TODO: label exports + if(labelget(addr, addrinfo->label)) + retval=true; + else + { + //TODO: label exports + } } if(addrinfo->flags&comment) //TODO: get comment { - //TODO: auto-comments + if(commentget(addr, addrinfo->comment)) + retval=true; + else + { + //TODO: auto-comments + } } return retval; } extern "C" DLL_EXPORT bool _dbg_addrinfoset(duint addr, ADDRINFO* addrinfo) { - return false; + bool retval=false; + if(addrinfo->flags&label) //set label + { + if(labelset(addr, addrinfo->label)) + retval=true; + } + else if(addrinfo->flags&comment) //set comment + { + if(commentset(addr, addrinfo->comment)) + retval=true; + } + return retval; } extern "C" DLL_EXPORT int _dbg_bpgettypeat(duint addr) diff --git a/x64_dbg_dbg/_exports.h b/x64_dbg_dbg/_exports.h index 7c5ff7ef..3a29e740 100644 --- a/x64_dbg_dbg/_exports.h +++ b/x64_dbg_dbg/_exports.h @@ -11,6 +11,7 @@ extern "C" DLL_EXPORT duint _dbg_memfindbaseaddr(duint addr, duint* size); DLL_EXPORT bool _dbg_memread(duint addr, unsigned char* dest, duint size, duint* read); DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap); +extern "C" DLL_EXPORT bool _dbg_memisvalidreadptr(duint addr); DLL_EXPORT void _dbg_dbgexitsignal(); DLL_EXPORT bool _dbg_valfromstring(const char* string, duint* value); DLL_EXPORT bool _dbg_isdebugging(); diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp index 9174f1e5..73b3d43c 100644 --- a/x64_dbg_dbg/_global.cpp +++ b/x64_dbg_dbg/_global.cpp @@ -1,6 +1,8 @@ #include "_global.h" HINSTANCE hInst; +char sqlitedb_basedir[deflen]=""; +char dbpath[deflen]=""; void* emalloc(size_t size) { diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index 1c85acbb..dbc91720 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -16,6 +16,7 @@ #include #include #include "..\x64_dbg_bridge\bridgemain.h" +#include "sqlite\sqlite3.h" #ifdef __GNUC__ #include "dbghelp\dbghelp.h" @@ -90,6 +91,8 @@ enum BITMASK //superglobal variables extern HINSTANCE hInst; +extern char sqlitedb_basedir[deflen]; +extern char dbpath[deflen]; //functions void* emalloc(size_t size); diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 33652c85..5dd227f0 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -1,5 +1,33 @@ #include "addrinfo.h" #include "debugger.h" +#include "console.h" +#include "memory.h" + +void dbinit() +{ + CreateDirectoryA(sqlitedb_basedir, 0); //create database directory + sqlite3* db; + if(sqlite3_open(dbpath, &db)) + { + dputs("failed to open database!"); + return; + } + char sql[deflen]=""; + char* errorText=0; + strcpy(sql, "CREATE TABLE IF NOT EXISTS comments (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)"); + if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error + { + dprintf("SQL Error: %s\n", errorText); + sqlite3_free(errorText); + } + strcpy(sql, "CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)"); + if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error + { + dprintf("SQL Error: %s\n", errorText); + sqlite3_free(errorText); + } + sqlite3_close(db); +} bool modnamefromaddr(uint addr, char* modname) { @@ -12,3 +40,303 @@ bool modnamefromaddr(uint addr, char* modname) strcpy(modname, modInfo.ModuleName); return true; } + +uint modbasefromaddr(uint addr) +{ + IMAGEHLP_MODULE64 modInfo; + memset(&modInfo, 0, sizeof(modInfo)); + modInfo.SizeOfStruct=sizeof(IMAGEHLP_MODULE64); + if(!SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)addr, &modInfo)) + return 0; + return (uint)modInfo.BaseOfImage; +} + +bool commentset(uint addr, const char* text) +{ + if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1) + return false; + if(!*text) //NOTE: delete when there is no text + return commentdel(addr); + int len=strlen(text); + char* newtext=(char*)emalloc(len+1); + *newtext=0; + for(int i=0,j=0; ihProcess, addr) or !text) + return false; + sqlite3* db; + if(sqlite3_open(dbpath, &db)) + { + dputs("failed to open database!"); + return false; + } + char modname[35]=""; + char sql[256]=""; + sqlite3_stmt* stmt; + if(!modnamefromaddr(addr, modname)) //comments without module + sprintf(sql, "SELECT text FROM comments WHERE mod IS NULL AND addr=%"fext"u", addr); + else + sprintf(sql, "SELECT text FROM comments WHERE mod='%s' AND addr=%"fext"u", modname, addr-modbasefromaddr(addr)); + if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK) + { + sqlite3_close(db); + return false; + } + if(sqlite3_step(stmt)!=SQLITE_ROW) //there is a comment already + { + sqlite3_close(db); + return false; + } + strcpy(text, (const char*)sqlite3_column_text(stmt, 0)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return true; +} + +bool commentdel(uint addr) +{ + if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) + return false; + sqlite3* db; + if(sqlite3_open(dbpath, &db)) + { + dputs("failed to open database!"); + return false; + } + char modname[35]=""; + char sql[256]=""; + sqlite3_stmt* stmt; + if(!modnamefromaddr(addr, modname)) //comments without module + sprintf(sql, "SELECT id FROM comments WHERE mod IS NULL AND addr=%"fext"u", addr); + else + { + uint modbase=modbasefromaddr(addr); + uint rva=addr-modbase; + sprintf(sql, "SELECT id FROM comments WHERE mod='%s' AND addr=%"fext"u", modname, rva); + } + if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK) + { + sqlite3_close(db); + return false; + } + if(sqlite3_step(stmt)!=SQLITE_ROW) //no comment to delete + return false; + int del_id=sqlite3_column_int(stmt, 0); + sqlite3_finalize(stmt); + char* errorText=0; + sprintf(sql, "DELETE FROM comments WHERE id=%d", del_id); + if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error + { + dprintf("SQL Error: %s\n", errorText); + sqlite3_free(errorText); + sqlite3_close(db); + return false; + } + sqlite3_close(db); + GuiUpdateAllViews(); + return true; +} + +bool labelset(uint addr, const char* text) +{ + if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_LABEL_SIZE-1) + return false; + if(!*text) //NOTE: delete when there is no text + return labeldel(addr); + int len=strlen(text); + char* newtext=(char*)emalloc(len+1); + *newtext=0; + for(int i=0,j=0; ihProcess, addr) or !text) + return false; + sqlite3* db; + if(sqlite3_open(dbpath, &db)) + { + dputs("failed to open database!"); + return false; + } + char modname[35]=""; + char sql[256]=""; + sqlite3_stmt* stmt; + if(!modnamefromaddr(addr, modname)) //labels without module + sprintf(sql, "SELECT text FROM labels WHERE mod IS NULL AND addr=%"fext"u", addr); + else + sprintf(sql, "SELECT text FROM labels WHERE mod='%s' AND addr=%"fext"u", modname, addr-modbasefromaddr(addr)); + if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK) + { + sqlite3_close(db); + return false; + } + if(sqlite3_step(stmt)!=SQLITE_ROW) //there is a label already + { + sqlite3_close(db); + return false; + } + strcpy(text, (const char*)sqlite3_column_text(stmt, 0)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return true; +} + +bool labeldel(uint addr) +{ + if(!IsFileBeingDebugged() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) + return false; + sqlite3* db; + if(sqlite3_open(dbpath, &db)) + { + dputs("failed to open database!"); + return false; + } + char modname[35]=""; + char sql[256]=""; + sqlite3_stmt* stmt; + if(!modnamefromaddr(addr, modname)) //labels without module + sprintf(sql, "SELECT id FROM labels WHERE mod IS NULL AND addr=%"fext"u", addr); + else + { + uint modbase=modbasefromaddr(addr); + uint rva=addr-modbase; + sprintf(sql, "SELECT id FROM labels WHERE mod='%s' AND addr=%"fext"u", modname, rva); + } + if(sqlite3_prepare_v2(db, sql, -1, &stmt, 0)!=SQLITE_OK) + { + sqlite3_close(db); + return false; + } + if(sqlite3_step(stmt)!=SQLITE_ROW) //no label to delete + return false; + int del_id=sqlite3_column_int(stmt, 0); + sqlite3_finalize(stmt); + char* errorText=0; + sprintf(sql, "DELETE FROM labels WHERE id=%d", del_id); + if(sqlite3_exec(db, sql, 0, 0, &errorText)!=SQLITE_OK) //error + { + dprintf("SQL Error: %s\n", errorText); + sqlite3_free(errorText); + sqlite3_close(db); + return false; + } + sqlite3_close(db); + GuiUpdateAllViews(); + return true; +} diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 18e20453..7e8f8d5f 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -3,6 +3,13 @@ #include "_global.h" +void dbinit(); bool modnamefromaddr(uint addr, char* modname); +bool commentset(uint addr, const char* text); +bool commentget(uint addr, char* text); +bool commentdel(uint addr); +bool labelset(uint addr, const char* text); +bool labelget(uint addr, char* text); +bool labeldel(uint addr); #endif // _ADDRINFO_H diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 4b75d386..ae55cbe0 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -19,6 +19,9 @@ static bool isStepping=false; static bool isPausedByUser=false; static bool bScyllaLoaded=false; +//Superglobal variables +char sqlitedb[deflen]=""; + //static functions static void cbStep(); static void cbSystemBreakpoint(void* ExceptionData); @@ -262,8 +265,24 @@ static void cbSystemBreakpoint(void* ExceptionData) { //TODO: handle stuff (TLS, main entry, etc) SetCustomHandler(UE_CH_SYSTEMBREAKPOINT, 0); + //init program database + int len=strlen(szFileName); + while(szFileName[len]!='\\' && len!=0) + len--; + if(len) + len++; + strcpy(sqlitedb, szFileName+len); +#ifdef _WIN64 + strcat(sqlitedb, ".dd64"); +#else + strcat(sqlitedb, ".dd32"); +#endif // _WIN64 + sprintf(dbpath, "%s\\%s", sqlitedb_basedir, sqlitedb); + dprintf("Database file: %s\n", dbpath); + dbinit(); + //log message dputs("system breakpoint reached!"); - //NOTE: call GUI + //update GUI DebugUpdateGui(GetContextData(UE_CIP)); GuiSetDebugState(paused); //unlock diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index fc043bf0..713fde3f 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -4,6 +4,7 @@ #include "console.h" #include "value.h" #include "command.h" +#include "addrinfo.h" CMDRESULT cbBadCmd(const char* cmd) { @@ -209,3 +210,73 @@ CMDRESULT cbInstrChd(const char* cmd) dputs("current directory changed!"); return STATUS_CONTINUE; } + +CMDRESULT cbInstrCmt(const char* cmd) +{ + char arg1[deflen]=""; + if(!argget(cmd, arg1, 0, false)) + return STATUS_ERROR; + uint addr=0; + if(!valfromstring(arg1, &addr, 0, 0, true, 0)) + return STATUS_ERROR; + char arg2[deflen]=""; + if(!argget(cmd, arg2, 1, false)) + return STATUS_ERROR; + if(!commentset(addr, arg2)) + { + dputs("error setting comment"); + return STATUS_ERROR; + } + return STATUS_CONTINUE; +} + +CMDRESULT cbInstrCmtdel(const char* cmd) +{ + char arg1[deflen]=""; + if(!argget(cmd, arg1, 0, false)) + return STATUS_ERROR; + uint addr=0; + if(!valfromstring(arg1, &addr, 0, 0, true, 0)) + return STATUS_ERROR; + if(!commentdel(addr)) + { + dputs("error deleting comment"); + return STATUS_ERROR; + } + return STATUS_CONTINUE; +} + +CMDRESULT cbInstrLbl(const char* cmd) +{ + char arg1[deflen]=""; + if(!argget(cmd, arg1, 0, false)) + return STATUS_ERROR; + uint addr=0; + if(!valfromstring(arg1, &addr, 0, 0, true, 0)) + return STATUS_ERROR; + char arg2[deflen]=""; + if(!argget(cmd, arg2, 1, false)) + return STATUS_ERROR; + if(!labelset(addr, arg2)) + { + dputs("error setting label"); + return STATUS_ERROR; + } + return STATUS_CONTINUE; +} + +CMDRESULT cbInstrLbldel(const char* cmd) +{ + char arg1[deflen]=""; + if(!argget(cmd, arg1, 0, false)) + return STATUS_ERROR; + uint addr=0; + if(!valfromstring(arg1, &addr, 0, 0, true, 0)) + return STATUS_ERROR; + if(!labeldel(addr)) + { + dputs("error deleting label"); + return STATUS_ERROR; + } + return STATUS_CONTINUE; +} diff --git a/x64_dbg_dbg/instruction.h b/x64_dbg_dbg/instruction.h index 3d903792..48d7f7ec 100644 --- a/x64_dbg_dbg/instruction.h +++ b/x64_dbg_dbg/instruction.h @@ -11,5 +11,9 @@ CMDRESULT cbInstrVarDel(const char* cmd); CMDRESULT cbInstrMov(const char* cmd); CMDRESULT cbInstrVarList(const char* cmd); CMDRESULT cbInstrChd(const char* cmd); +CMDRESULT cbInstrCmt(const char* cmd); +CMDRESULT cbInstrCmtdel(const char* cmd); +CMDRESULT cbInstrLbl(const char* cmd); +CMDRESULT cbInstrLbldel(const char* cmd); #endif // _INSTRUCTIONS_H diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp index abf3cee9..0f149271 100644 --- a/x64_dbg_dbg/memory.cpp +++ b/x64_dbg_dbg/memory.cpp @@ -63,6 +63,12 @@ bool memread(HANDLE hProcess, const void* lpBaseAddress, void* lpBuffer, SIZE_T return true; } +bool memisvalidreadptr(HANDLE hProcess, uint addr) +{ + unsigned char a=0; + return memread(hProcess, (void*)addr, &a, 1, 0); +} + void* memalloc(HANDLE hProcess, uint addr, DWORD size, DWORD fdProtect) { return VirtualAllocEx(hProcess, (void*)addr, size, MEM_RESERVE|MEM_COMMIT, fdProtect); diff --git a/x64_dbg_dbg/memory.h b/x64_dbg_dbg/memory.h index 56dfcff1..aaf52e7e 100644 --- a/x64_dbg_dbg/memory.h +++ b/x64_dbg_dbg/memory.h @@ -7,6 +7,7 @@ uint memfindbaseaddr(HANDLE hProcess, uint addr, uint* size); bool memread(HANDLE hProcess, const void* lpBaseAddress, void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead); +bool memisvalidreadptr(HANDLE hProcess, uint addr); void* memalloc(HANDLE hProcess, uint addr, DWORD size, DWORD fdProtect); #endif // _MEMORY_H diff --git a/x64_dbg_dbg/sqlite/sqlite.def b/x64_dbg_dbg/sqlite/sqlite.def new file mode 100644 index 00000000..f3867f32 --- /dev/null +++ b/x64_dbg_dbg/sqlite/sqlite.def @@ -0,0 +1,207 @@ +LIBRARY "sqlite.dll" +EXPORTS +sqlite3_aggregate_context +sqlite3_aggregate_count +sqlite3_auto_extension +sqlite3_backup_finish +sqlite3_backup_init +sqlite3_backup_pagecount +sqlite3_backup_remaining +sqlite3_backup_step +sqlite3_bind_blob +sqlite3_bind_double +sqlite3_bind_int +sqlite3_bind_int64 +sqlite3_bind_null +sqlite3_bind_parameter_count +sqlite3_bind_parameter_index +sqlite3_bind_parameter_name +sqlite3_bind_text +sqlite3_bind_text16 +sqlite3_bind_value +sqlite3_bind_zeroblob +sqlite3_blob_bytes +sqlite3_blob_close +sqlite3_blob_open +sqlite3_blob_read +sqlite3_blob_reopen +sqlite3_blob_write +sqlite3_busy_handler +sqlite3_busy_timeout +sqlite3_cancel_auto_extension +sqlite3_changes +sqlite3_clear_bindings +sqlite3_close +sqlite3_close_v2 +sqlite3_collation_needed +sqlite3_collation_needed16 +sqlite3_column_blob +sqlite3_column_bytes +sqlite3_column_bytes16 +sqlite3_column_count +sqlite3_column_decltype +sqlite3_column_decltype16 +sqlite3_column_double +sqlite3_column_int +sqlite3_column_int64 +sqlite3_column_name +sqlite3_column_name16 +sqlite3_column_text +sqlite3_column_text16 +sqlite3_column_type +sqlite3_column_value +sqlite3_commit_hook +sqlite3_compileoption_get +sqlite3_compileoption_used +sqlite3_complete +sqlite3_complete16 +sqlite3_config +sqlite3_context_db_handle +sqlite3_create_collation +sqlite3_create_collation16 +sqlite3_create_collation_v2 +sqlite3_create_function +sqlite3_create_function16 +sqlite3_create_function_v2 +sqlite3_create_module +sqlite3_create_module_v2 +sqlite3_data_count +sqlite3_data_directory DATA +sqlite3_db_config +sqlite3_db_filename +sqlite3_db_handle +sqlite3_db_mutex +sqlite3_db_readonly +sqlite3_db_release_memory +sqlite3_db_status +sqlite3_declare_vtab +sqlite3_enable_load_extension +sqlite3_enable_shared_cache +sqlite3_errcode +sqlite3_errmsg +sqlite3_errmsg16 +sqlite3_errstr +sqlite3_exec +sqlite3_expired +sqlite3_extended_errcode +sqlite3_extended_result_codes +sqlite3_file_control +sqlite3_finalize +sqlite3_free +sqlite3_free_table +sqlite3_get_autocommit +sqlite3_get_auxdata +sqlite3_get_table +sqlite3_global_recover +sqlite3_initialize +sqlite3_interrupt +sqlite3_last_insert_rowid +sqlite3_libversion +sqlite3_libversion_number +sqlite3_limit +sqlite3_load_extension +sqlite3_log +sqlite3_malloc +sqlite3_memory_alarm +sqlite3_memory_highwater +sqlite3_memory_used +sqlite3_mprintf +sqlite3_mutex_alloc +sqlite3_mutex_enter +sqlite3_mutex_free +sqlite3_mutex_leave +sqlite3_mutex_try +sqlite3_next_stmt +sqlite3_open +sqlite3_open16 +sqlite3_open_v2 +sqlite3_os_end +sqlite3_os_init +sqlite3_overload_function +sqlite3_prepare +sqlite3_prepare16 +sqlite3_prepare16_v2 +sqlite3_prepare_v2 +sqlite3_profile +sqlite3_progress_handler +sqlite3_randomness +sqlite3_realloc +sqlite3_release_memory +sqlite3_reset +sqlite3_reset_auto_extension +sqlite3_result_blob +sqlite3_result_double +sqlite3_result_error +sqlite3_result_error16 +sqlite3_result_error_code +sqlite3_result_error_nomem +sqlite3_result_error_toobig +sqlite3_result_int +sqlite3_result_int64 +sqlite3_result_null +sqlite3_result_text +sqlite3_result_text16 +sqlite3_result_text16be +sqlite3_result_text16le +sqlite3_result_value +sqlite3_result_zeroblob +sqlite3_rollback_hook +sqlite3_set_authorizer +sqlite3_set_auxdata +sqlite3_shutdown +sqlite3_sleep +sqlite3_snprintf +sqlite3_soft_heap_limit +sqlite3_soft_heap_limit64 +sqlite3_sourceid +sqlite3_sql +sqlite3_status +sqlite3_step +sqlite3_stmt_busy +sqlite3_stmt_readonly +sqlite3_stmt_status +sqlite3_strglob +sqlite3_stricmp +sqlite3_strnicmp +sqlite3_temp_directory DATA +sqlite3_test_control +sqlite3_thread_cleanup +sqlite3_threadsafe +sqlite3_total_changes +sqlite3_trace +sqlite3_transfer_bindings +sqlite3_update_hook +sqlite3_uri_boolean +sqlite3_uri_int64 +sqlite3_uri_parameter +sqlite3_user_data +sqlite3_value_blob +sqlite3_value_bytes +sqlite3_value_bytes16 +sqlite3_value_double +sqlite3_value_int +sqlite3_value_int64 +sqlite3_value_numeric_type +sqlite3_value_text +sqlite3_value_text16 +sqlite3_value_text16be +sqlite3_value_text16le +sqlite3_value_type +sqlite3_version DATA +sqlite3_vfs_find +sqlite3_vfs_register +sqlite3_vfs_unregister +sqlite3_vmprintf +sqlite3_vsnprintf +sqlite3_vtab_config +sqlite3_vtab_on_conflict +sqlite3_wal_autocheckpoint +sqlite3_wal_checkpoint +sqlite3_wal_checkpoint_v2 +sqlite3_wal_hook +sqlite3_win32_mbcs_to_utf8 +sqlite3_win32_set_directory +sqlite3_win32_sleep +sqlite3_win32_utf8_to_mbcs +sqlite3_win32_write_debug +winSysInfo DATA diff --git a/x64_dbg_dbg/sqlite/sqlite32.lib b/x64_dbg_dbg/sqlite/sqlite32.lib new file mode 100644 index 0000000000000000000000000000000000000000..26f1011090f74e6518fbf0fdc0ec19b5cd319fbe GIT binary patch literal 48100 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 X^p={R@df_l)^?9*jka0ZG~<5(Bh@i3 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/sqlite/sqlite64.lib b/x64_dbg_dbg/sqlite/sqlite64.lib new file mode 100644 index 0000000000000000000000000000000000000000..5c1c114cde3f7642a20ab3c7d033d5f3dcd2e8f4 GIT binary patch literal 47100 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 true true - $(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;sqlite\sqlite32.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) @@ -112,7 +112,7 @@ Windows true true - $(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;sqlite\sqlite64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies)