首页
社区
课程
招聘
[原创]PE Fix bug SQLiteMaestro~ 自己动手,丰衣足食
发表于: 2010-12-3 15:01 8457

[原创]PE Fix bug SQLiteMaestro~ 自己动手,丰衣足食

2010-12-3 15:01
8457

【文章标题】: PE Fix bug SQLiteMaestro
【文章作者】: FishSeeWater
【作者邮箱】: FishSeeWater@gmail.com
【软件名称】: SQLiteMaestro
【下载地址】: 自己搜索下载
【保护方式】: Asprotect
【使用工具】: OllyICE,Dede,IDA
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
          SQlite3数据库的美大家有目共睹,最近我也爱上了她,一直想找个支持SQLite数据库的管理工具,  最后发现SQLiteMaestro后感觉很棒,
在作者的官方主页上看到其支持好多数据库.这个软件不支持中  文路径下的数据库,在新版修复了这个问题,但在使用过程中,发现其对中文支持还是有问题,
无法向数据库中插入中文,同时在检索时,也不能有中文的限定.这另我比较郁闷,~.而且作者也好长时间没有作出新的更新.找其它软件,没有发现更好的,呵呵,
自己动手丰衣足食吧~:) .  
  主程序版本 10.5.01
  
  运行程序后,会发现如下图所示的问题.
  
  软件是用Delphi7写ASProtect保护的,脱壳与破解过程略~.把处理好的程序扔到IDA中加工后,发现可读性不高.请出DEDE加工,生成MAP文件,
再用IDA脚本loadmap.idc(感谢jackozoo) 导入到IDA中.再生成MAP文件.用OD LoadMapex导入.
(为什么要先导入IDA中再生成MAP呢,在IDA导入map时,会把相关的参考调用都标识出来,这样用IDA生成的MAP可读性更好)  
  上述问题的出现估计是编码转换的原因, win下的编码转换API是  WideCharToMultiByte 运行程序后,
在SQLedit中写下 select 语句 "select * from table01 where filed01 like '%媒%';"
  下断点 BPX WideCharToMultiByte 后 ,点击 Execute Select only .这时会发现断点刚下的时候,程序就不断的中断.只有换个方法,在DEDE中找到这个模块的消息入口,
下断点后回到程序,然后再点击Execute Select only 程序顺利断下,这时再下 API断点.观察API的参数有没有上面的SQL语句.
  遗憾的是整个过程中并没有发现SQL语句做参数的调用.难道思路不对?折腾了一上午也没找到关键点,在IDA中消遣.发现有个 Utf8Encode 函数,这时突然想起,难道Delphi
  的这个函数不是调用的winapi?马上打开Delphi2010(我装的是2010),查看了一下这个函数,明明就是调用的API嘛,为什么会断不下来呢?又难道是Delphi7函数没有调用?
打开D7的目录,找到System.pas文件, 一看果然是D7的Utf8Encode函数是自己实现的.怪不得断不下来呢.那就在OD中直接下断 Utf8Encode 哈哈,不几次F9就发
现 "select * from table01 where filed01 like '%媒%'".
   分析过程如下:
  

  009B7DA0 /$  push    ebp                                      ;  Sql Create
  009B7DA1 |.  mov     ebp, esp
  009B7DA3 |.  push    0
  ..........
  009B7DCA |.  jnz     short <SQLiteMa.loc_9B7DED>
  009B7DCC |.  lea     edx, dword ptr ss:[ebp-8]
  009B7DCF |.  mov     eax, esi
  009B7DD1 |.  call    <SQLiteMa.System::UTF8Encode(System::Wid>
  009B7DD6 |.  mov     edx, dword ptr ss:[ebp-8]
  009B7DD9 |.  lea     eax, dword ptr ss:[ebp-4]
  009B7DDC |.  call    <SQLiteMa.System_@WStrFromLStr>  // 这一句纯属多余的,估计在原程序中是两个变量的赋值 WideString=AnsiString
  009B7DE1  .  mov     edx, dword ptr ss:[ebp-4]        // 也就是因为这一句导致已经UTF-8编码的字串,转换成坏串了.
  009B7DE4 |.  mov     eax, ebx
  009B7DE6 |.  mov     ecx, dword ptr ds:[eax]
  009B7DE8 |.  call    dword ptr ds:[ecx+18]   ;<SQLiteMa.sub_E03F24> // 这个CALL把上面的"宽"坏串(SQL语句)写入一个TString
  009B7DEB |.  jmp     short <SQLiteMa.loc_9B7DF6>                    // 对象中,在以后的代码中解析SQL语法.
  ..........															// 注意,这个CALL由于是个虚函数,通过多次跟踪,发现其调用了两个
  009B7E0B |.  lea     eax, [local.1]									// 函数 <SQLiteMa.sub_E03F24> 和 <SQLiteMa.sub_00E03C60>
  009B7E0E |.  call    <SQLiteMa.System_@WStrClr>						// 这两个函数都要跟进去检查一下.
  009B7E13 \.  retn
  009B7E14  .^ jmp     <SQLiteMa.System_@HandleFinally_>        ;  loc_9B7E14
  009B7E19  .^ jmp     short <SQLiteMa.loc_9B7E03>
  
  00E03F24 /.  push    ebp                                      ;  sub_E03F24
  00E03F25 |.  mov     ebp, esp
  00E03F27 |.  xor     ecx, ecx
  ......... 
  00E03F65 |.  lea     eax, dword ptr ss:[ebp-10]
  00E03F68 |.  mov     edx, esi
  00E03F6A |.  call    <SQLiteMa.System_@LStrFromWStr>  //这一句是将"宽"坏串(SQL语句)反转回Ansi串,错上加错,这里也需要处理.
  00E03F6F |.  mov     eax, dword ptr ss:[ebp-10]
  00E03F72 |.  lea     edx, dword ptr ss:[ebp-C]
  ..........
  00E03F92 	 lea     eax, dword ptr ss:[ebp-14]
  00E03F95 	 mov     edx, esi
  00E03F97 	 call    <SQLiteMa.System_@LStrFromWStr>  //这一句是将"宽"坏串(SQL语句)反转回Ansi串,错上加错. 改下面一句,忽略其
  00E03F9C 	 mov     edx, dword ptr ss:[ebp-14]
  00E03F9F |.  pop     eax
  00E03FA0 |.  mov     ecx, dword ptr ds:[eax]
  00E03FA2 |.  call    dword ptr ds:[ecx+2C]  ;  Classes::TStrings::SetTextStr(System::AnsiString)// 将SQL语句存入TString中,后解析执行.
  .........
  00E03FBA |.  call    <SQLiteMa.System_@LStrArrayClr>
  00E03FBF \.  retn
  

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
这东西最基本的国际化都做不到,也敢自称PROFESSIONAL
2010-12-3 19:05
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
3
估计是 ZEOSDBO 这个开源项目的问题,发现最新版的在编码处理上也有问题~
作者也没有测试UNICODE码转换(老美没环境~)
再加上D7开发的(D7在UTF8上处理就有问题),众多因素吧:)
总的来说这个软件还是不错的(Fix之后~)
2010-12-3 21:43
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
需要hack能用的东西不爽啊,还是sqlite browser吧,虽然慢了点。
2010-12-4 00:31
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
5
哈,回头试试去~:)
2010-12-4 20:55
0
雪    币: 446
活跃值: (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
sqlite developer
2010-12-5 08:44
0
雪    币: 215
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
依照上面指示的修改方法, 修改後還是沒解決, 請問是否還有遺漏的地方?
2010-12-5 20:06
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
版本对吗?一共需要改三处~
与我联系吧,我给你发送修改完的~
2010-12-6 09:01
0
雪    币: 215
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
版本正確, 也改了相同地方

謝謝, gwotang@hotmail.com
2010-12-6 14:12
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
10
邮件已发~请查收
2010-12-6 15:12
0
雪    币: 277
活跃值: (2041)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
能给我发一份吗,我的邮箱是gjianbo@qq.com
2010-12-6 16:18
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
灌水........

学习ing..............
2010-12-8 12:45
0
游客
登录 | 注册 方可回帖
返回
//