首页
社区
课程
招聘
如何向EXE程序中插入代码,修改PE,实现pediy?
发表于: 2013-4-2 00:30 11148

如何向EXE程序中插入代码,修改PE,实现pediy?

2013-4-2 00:30
11148
一个VB开发的exe程序(编译模式为Native Code,程序详见附件)有bug:
1、原程序采用MSFLXGRD表格控件,表格名称为Grid1,Grid1原始属性中设置行数为:Grid1.Rows = 201,设置列数为:Grid1.Cols = 21,而且在程序运行代码中没有根据数据量动态增加行数的功能,导致总行数超出201时运行错误;
2、当下一次导入数据需要的行数大于前一次的行数时运行错误。

bug测试步骤:
(1)程序界面右侧表格中右键,选择“导入模板”——选择“擂台模板一_197行.txt”,会正常导入所有数据。见下图



(2)程序界面右侧表格中右键,选择“导入模板”——选择“擂台模板二_201行.txt”,导入数据错误。见下图


我的解决思路:动态增加行数比较麻烦,干脆直接在“导入模板”功能中一开始就插入代码,设置行数和列数为最大,以满足需求,MSFLXGRD表格控件的最大方格量为350000个,所以设置Grid1.Cols = 110,Grid1.Rows = 3000。

需添加的代码内容(编译模式为Native Code,需要加入如下VB代码修复):
    Grid1.Cols = 110
    Grid1.Rows = 3000

方法:搜索论坛,大概知道了pediy的作法,在PE空节处写入需要加入的16进制机器码,然后在需要修改的地方jmp过去,再jmp回来。

问题:虽然看了一些相关帖子,但具体怎么操作还是不明白,小弟菜鸟,只好求教于各位高手:

1、这两句VB代码:
    Grid1.Cols = 110
    Grid1.Rows = 3000

怎么转换为汇编语言,再转为16进制机器码?用什么方法和工具实现?

2、我要插入到下面代码里,即“导入模板”功能的代码开始部分,哪个位置合适?

00467C90   > \55                   PUSH EBP
00467C91   .  8BEC                 MOV EBP,ESP
00467C93   .  83EC 18              SUB ESP,18
00467C96   .  68 96494000          PUSH <JMP.&MSVBVM60.__vbaExceptHandler>  ;  SE 处理程序安装
00467C9B   .  64:A1 00000000       MOV EAX,DWORD PTR FS:[0]
00467CA1   .  50                   PUSH EAX
00467CA2   .  64:8925 00000000     MOV DWORD PTR FS:[0],ESP
00467CA9   .  B8 44010000          MOV EAX,144
00467CAE   .  E8 DDCCF9FF          CALL <JMP.&MSVBVM60.__vbaChkstk>
00467CB3   .  53                   PUSH EBX
00467CB4   .  56                   PUSH ESI
00467CB5   .  57                   PUSH EDI
00467CB6   .  8965 E8              MOV DWORD PTR SS:[EBP-18],ESP
00467CB9   .  C745 EC 28204000     MOV DWORD PTR SS:[EBP-14],Crackme.004020>
00467CC0   .  8B45 08              MOV EAX,DWORD PTR SS:[EBP+8]
00467CC3   .  83E0 01              AND EAX,1
00467CC6   .  8945 F0              MOV DWORD PTR SS:[EBP-10],EAX
00467CC9   .  8B4D 08              MOV ECX,DWORD PTR SS:[EBP+8]
00467CCC   .  83E1 FE              AND ECX,FFFFFFFE
00467CCF   .  894D 08              MOV DWORD PTR SS:[EBP+8],ECX
00467CD2   .  C745 F4 00000000     MOV DWORD PTR SS:[EBP-C],0
00467CD9   .  8B55 08              MOV EDX,DWORD PTR SS:[EBP+8]
00467CDC   .  8B02                 MOV EAX,DWORD PTR DS:[EDX]
00467CDE   .  8B4D 08              MOV ECX,DWORD PTR SS:[EBP+8]

3、程序末尾有大量00空白区,是否适合放入修改的代码?

004E925A   .  5F 5F 76 62 61 49 34>ASCII "__vbaI4ErrVar",0
004E9268   .  0000                 DW 0000
004E926A   .  5F 5F 76 62 61 46 72>ASCII "__vbaFreeObj",0
004E9277   .  00                   DB 00
004E9278   .  0000                 DW 0000
004E927A   .  5F 5F 76 62 61 46 72>ASCII "__vbaFreeStr",0
004E9287   .  00                   DB 00
004E9288      00                   DB 00
004E9289      00                   DB 00
……
……
……
004E9FFE      00                   DB 00
004E9FFF      00                   DB 00

请高手们伸出援手,给出可以直接使用的完整汇编代码和16进制机器码,有了这个范例,我想我应该学得会简单的pediy了。小弟在此多谢了!

程序附件如下:
Crackme.rar

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 166
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
具体情况我也是个小菜鸟,只是提供一下我的思路,你先生成一个带有以上两行命令的exe文件,exe文件代码尽量短,方便反编译后查看,然后反编译并找到对应的代码复制(复制后可能需要进行微小修改),然后反编译要修改的exe文件,将这刚才复制的代码插入到相应位置,或者先放到后面的空字节处,然后用jmp跳一下,具体办法没有实施,我只是在反编译apk文件时采用这种办法成功实现过许多功能,在exe文件中感觉思路应该差不多,但没实施,你参考一下,高手见笑了。
2013-4-2 06:19
0
雪    币: 415
活跃值: (132)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
插入代码 的确能实现的,以前做有些破解的时候,如插入一个对话框,弹出注册码就这么实现的。
不过我记得好像不是插入在00里面的,是插入在很多90的地方,汇编语言 90 90 为NOP,什么也不作的意思。而00是数据,应该不能弄掉吧。
要插入到哪个位置,你需要测试出来的,如利用窗体启动的信息,设置断点。
Grid1.Cols = 110
    Grid1.Rows = 3000
的汇编代码,可以按楼上的思路,不过建议你可以在这个代码之前再加入
msgbox “OK”
这样反汇编的时候就能准确定位了。
2013-4-2 06:46
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
Grid1.Cols = 110
    Grid1.Rows = 3000
你随便提供的反汇编代码中,并没有体现这几个变量具体在哪个位置。问题样本不准确,所以没有人会知道如何帮助你。
解决方法:1、如楼上所说,自行定位关健位置。2、放出这个VB程序,并且至少指出这几个变量的原始值。
2013-4-2 08:51
0
雪    币: 1121
活跃值: (727)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
5
要是编译成PCode的VB呢?楼主先搞清楚是不是这样的
2013-4-2 09:11
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
6
上文件并且详细说下要求和BUG。~~
2013-4-2 09:53
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢指点!
我按你的方法:
Private Sub Command1_Click()
MsgBox "ok"
Grid1.Cols = 110
Grid1.Rows = 3000
End Sub

生成exe程序,反汇编得到Command1_Click的汇编代码:

00401E80   > \55            PUSH EBP
00401E81   .  8BEC          MOV EBP,ESP
00401E83   .  83EC 0C       SUB ESP,0C
00401E86   .  68 A6104000   PUSH <JMP.&MSVBVM60.__vbaExceptHandler>  ;  SE 处理程序安装
00401E8B   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00401E91   .  50            PUSH EAX
00401E92   .  64:8925 00000>MOV DWORD PTR FS:[0],ESP
00401E99   .  81EC 8C000000 SUB ESP,8C
00401E9F   .  53            PUSH EBX
00401EA0   .  56            PUSH ESI
00401EA1   .  57            PUSH EDI
00401EA2   .  8965 F4       MOV DWORD PTR SS:[EBP-C],ESP
00401EA5   .  C745 F8 90104>MOV DWORD PTR SS:[EBP-8],工程3.00401090
00401EAC   .  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]
00401EAF   .  8BC6          MOV EAX,ESI
00401EB1   .  83E0 01       AND EAX,1
00401EB4   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
00401EB7   .  83E6 FE       AND ESI,FFFFFFFE
00401EBA   .  56            PUSH ESI
00401EBB   .  8975 08       MOV DWORD PTR SS:[EBP+8],ESI
00401EBE   .  8B0E          MOV ECX,DWORD PTR DS:[ESI]
00401EC0   .  FF51 04       CALL DWORD PTR DS:[ECX+4]
00401EC3   .  B9 04000280   MOV ECX,80020004
00401EC8   .  33FF          XOR EDI,EDI
00401ECA   .  894D B0       MOV DWORD PTR SS:[EBP-50],ECX
00401ECD   .  B8 0A000000   MOV EAX,0A
00401ED2   .  894D C0       MOV DWORD PTR SS:[EBP-40],ECX
00401ED5   .  894D D0       MOV DWORD PTR SS:[EBP-30],ECX
00401ED8   .  897D C8       MOV DWORD PTR SS:[EBP-38],EDI
00401EDB   .  897D B8       MOV DWORD PTR SS:[EBP-48],EDI
00401EDE   .  897D A8       MOV DWORD PTR SS:[EBP-58],EDI
00401EE1   .  897D 98       MOV DWORD PTR SS:[EBP-68],EDI
00401EE4   .  8D55 98       LEA EDX,DWORD PTR SS:[EBP-68]
00401EE7   .  8D4D D8       LEA ECX,DWORD PTR SS:[EBP-28]
00401EEA   .  897D E8       MOV DWORD PTR SS:[EBP-18],EDI
00401EED   .  897D D8       MOV DWORD PTR SS:[EBP-28],EDI
00401EF0   .  8945 A8       MOV DWORD PTR SS:[EBP-58],EAX
00401EF3   .  8945 B8       MOV DWORD PTR SS:[EBP-48],EAX
00401EF6   .  8945 C8       MOV DWORD PTR SS:[EBP-38],EAX
00401EF9   .  C745 A0 EC1A4>MOV DWORD PTR SS:[EBP-60],工程3.00401AEC   ;  UNICODE "ok"
00401F00   .  C745 98 08000>MOV DWORD PTR SS:[EBP-68],8
00401F07   .  FF15 6C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarDu>;  MSVBVM60.__vbaVarDup
00401F0D   .  8D55 A8       LEA EDX,DWORD PTR SS:[EBP-58]
00401F10   .  8D45 B8       LEA EAX,DWORD PTR SS:[EBP-48]
00401F13   .  52            PUSH EDX
00401F14   .  8D4D C8       LEA ECX,DWORD PTR SS:[EBP-38]
00401F17   .  50            PUSH EAX
00401F18   .  51            PUSH ECX
00401F19   .  8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
00401F1C   .  57            PUSH EDI
00401F1D   .  52            PUSH EDX
00401F1E   .  FF15 18104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>]     ;  MSVBVM60.rtcMsgBox
00401F24   .  8D45 A8       LEA EAX,DWORD PTR SS:[EBP-58]
00401F27   .  8D4D B8       LEA ECX,DWORD PTR SS:[EBP-48]
00401F2A   .  50            PUSH EAX
00401F2B   .  8D55 C8       LEA EDX,DWORD PTR SS:[EBP-38]
00401F2E   .  51            PUSH ECX
00401F2F   .  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
00401F32   .  52            PUSH EDX
00401F33   .  50            PUSH EAX
00401F34   .  6A 04         PUSH 4
00401F36   .  FF15 08104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeV>;  MSVBVM60.__vbaFreeVarList
00401F3C   .  83C4 04       ADD ESP,4
00401F3F   .  B9 03000000   MOV ECX,3
00401F44   .  8BD4          MOV EDX,ESP
00401F46   .  894D 98       MOV DWORD PTR SS:[EBP-68],ECX
00401F49   .  B8 6E000000   MOV EAX,6E
00401F4E   .  6A 05         PUSH 5
00401F50   .  890A          MOV DWORD PTR DS:[EDX],ECX
00401F52   .  8B4D 9C       MOV ECX,DWORD PTR SS:[EBP-64]
00401F55   .  8945 A0       MOV DWORD PTR SS:[EBP-60],EAX
00401F58   .  56            PUSH ESI
00401F59   .  894A 04       MOV DWORD PTR DS:[EDX+4],ECX
00401F5C   .  8B0E          MOV ECX,DWORD PTR DS:[ESI]
00401F5E   .  8942 08       MOV DWORD PTR DS:[EDX+8],EAX
00401F61   .  8B45 A4       MOV EAX,DWORD PTR SS:[EBP-5C]
00401F64   .  8942 0C       MOV DWORD PTR DS:[EDX+C],EAX
00401F67   .  FF91 00030000 CALL DWORD PTR DS:[ECX+300]
00401F6D   .  8B1D 1C104000 MOV EBX,DWORD PTR DS:[<&MSVBVM60.__vbaOb>;  MSVBVM60.__vbaObjSet
00401F73   .  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
00401F76   .  50            PUSH EAX
00401F77   .  52            PUSH EDX
00401F78   .  FFD3          CALL EBX                                 ;  <&MSVBVM60.__vbaObjSet>
00401F7A   .  50            PUSH EAX
00401F7B   .  FF15 78104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLateI>;  MSVBVM60.__vbaLateIdSt
00401F81   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
00401F84   .  FF15 84104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
00401F8A   .  B8 B80B0000   MOV EAX,0BB8
00401F8F   .  8945 A0       MOV DWORD PTR SS:[EBP-60],EAX
00401F92   .  83EC 10       SUB ESP,10
00401F95   .  B9 03000000   MOV ECX,3
00401F9A   .  8BD4          MOV EDX,ESP
00401F9C   .  894D 98       MOV DWORD PTR SS:[EBP-68],ECX
00401F9F   .  6A 04         PUSH 4
00401FA1   .  56            PUSH ESI
00401FA2   .  890A          MOV DWORD PTR DS:[EDX],ECX
00401FA4   .  8B4D 9C       MOV ECX,DWORD PTR SS:[EBP-64]
00401FA7   .  894A 04       MOV DWORD PTR DS:[EDX+4],ECX
00401FAA   .  8B0E          MOV ECX,DWORD PTR DS:[ESI]
00401FAC   .  8942 08       MOV DWORD PTR DS:[EDX+8],EAX
00401FAF   .  8B45 A4       MOV EAX,DWORD PTR SS:[EBP-5C]
00401FB2   .  8942 0C       MOV DWORD PTR DS:[EDX+C],EAX
00401FB5   .  FF91 00030000 CALL DWORD PTR DS:[ECX+300]
00401FBB   .  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
00401FBE   .  50            PUSH EAX
00401FBF   .  52            PUSH EDX
00401FC0   .  FFD3          CALL EBX
00401FC2   .  50            PUSH EAX
00401FC3   .  FF15 78104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLateI>;  MSVBVM60.__vbaLateIdSt
00401FC9   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
00401FCC   .  FF15 84104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
00401FD2   .  897D FC       MOV DWORD PTR SS:[EBP-4],EDI
00401FD5   .  68 02204000   PUSH 工程3.00402002
00401FDA   .  EB 25         JMP SHORT 工程3.00402001
00401FDC   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
00401FDF   .  FF15 84104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
00401FE5   .  8D45 A8       LEA EAX,DWORD PTR SS:[EBP-58]
00401FE8   .  8D4D B8       LEA ECX,DWORD PTR SS:[EBP-48]
00401FEB   .  50            PUSH EAX
00401FEC   .  8D55 C8       LEA EDX,DWORD PTR SS:[EBP-38]
00401FEF   .  51            PUSH ECX
00401FF0   .  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
00401FF3   .  52            PUSH EDX
00401FF4   .  50            PUSH EAX
00401FF5   .  6A 04         PUSH 4
00401FF7   .  FF15 08104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeV>;  MSVBVM60.__vbaFreeVarList
00401FFD   .  83C4 14       ADD ESP,14
00402000   .  C3            RETN
00402001   >  C3            RETN                                     ;  RET 被用作一个跳转到 00402002
00402002   >  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00402005   .  50            PUSH EAX
00402006   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
00402008   .  FF51 08       CALL DWORD PTR DS:[ECX+8]
0040200B   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0040200E   .  8B4D EC       MOV ECX,DWORD PTR SS:[EBP-14]
00402011   .  5F            POP EDI
00402012   .  5E            POP ESI
00402013   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
0040201A   .  5B            POP EBX
0040201B   .  8BE5          MOV ESP,EBP
0040201D   .  5D            POP EBP
0040201E   .  C2 0400       RETN 4

请问我需要的是哪段代码,如何修改?是否还要找到Grid1的控件ID?
2013-4-2 23:19
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢热心指点!我看一些帖子说是00的空节区,难道是错的吗?
2013-4-2 23:26
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢兄弟指点!我已经详细说明了bug,并上传了附件,请大哥指点!
2013-4-2 23:34
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
10
怎么就没看到感谢我捏,不开心



已经修改为3000行 110列了。

不过我测试还有BUG,不知道是不是未注册的原因:

BUG
先导入行数少的表格再导入行数多的一样会无法导入。

先导入多的再导入少的就没问题。
上传的附件:
2013-4-3 10:35
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哈哈哈,每一位热心关注的朋友当然都是非常感谢的啊,只是找不到致谢的按钮,然后每感谢一个人都要单独回一帖,这样就显得我太作了,怕被坛里兄弟笑话!

感谢Huskar兄弟的修改,刚才看了你的修改方法,你是修改了Grid1原始属性中设置行数为:Grid1.Rows = 3000,设置列数为:Grid1.Cols = 110,这正是出现“先导入行数少的表格再导入行数多的会错误”的原因之一。因为在原程序“导入模板”运行代码中没有根据“导入表格行数的多少”动态增加行数的功能,例如:先导入100行的表格,加上最后的分隔行1行、统计数3行,这时候表格总行数就变成了104行,而且固定不变了,下次导入200行的表格时,可供写数据的表格就只有104行,结果就出错了!

所以解决问题的方法还是要在“导入模板”功能中一开始就插入代码,设置行数和列数为最大,以满足需求,MSFLXGRD表格控件的最大方格量为350000个,所以设置Grid1.Cols = 110,Grid1.Rows = 3000。这样每次导入数据时,都有3000行表格用来接收数据了。请兄弟再费心研究一下怎么插入代码!!!
2013-4-3 11:57
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
12
导入模板函数的时候你没有设置行和列的语句吧!…现在原始属性大小足够,插入数据,为何表格属性变了呢?
2013-4-3 13:45
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
插入数据后,多余的空表格,原程序会删除掉!例如导入100行数据后,加统计数据共剩104行,那么其他多余的空表格会被删除,表格数就缩小到104行了!
有意思的就在这了,原程序设计时只考虑了最多200行的情况,所以没有动态增加行数的代码,但却有删除空行的代码!
2013-4-3 14:19
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
14
按照你的要求修改好了,但是有个CALL没有重定位,一旦EXE不以40000基址加载会出错,不过一般没问题。你看看吧

不要说了,赶紧撒KX吧
上传的附件:
2013-4-3 22:03
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哈哈哈,太感谢了,修改非常成功!

修改方法如下:
内存中的偏移
00468117   /E9 E4160800               jmp Crackm3.004E9800         ;在468117跳转到文件的末尾
0046811C   |90                        nop
0046811D   |90                        nop

文件末尾写入了如下代码
004E9800    60                        pushad
004E9801    6A 00                     push 0x0
004E9803    6A 6E                     push 0x6E
004E9805    90                        nop
004E9806    90                        nop
004E9807    90                        nop
004E9808    6A 00                     push 0x0
004E980A    6A 03                     push 0x3
004E980C    6A 05                     push 0x5
004E980E    50                        push eax
004E980F    FF15 08124000             call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>]    ; MSVBVM60.__vbaLateIdSt
004E9815    90                        nop
004E9816    90                        nop
004E9817    90                        nop
004E9818    90                        nop
004E9819    90                        nop
004E981A    90                        nop
004E981B    90                        nop
004E981C    61                        popad
004E981D    60                        pushad
004E981E    6A 00                     push 0x0
004E9820    68 B80B0000               push 0xBB8
004E9825    90                        nop
004E9826    90                        nop
004E9827    6A 00                     push 0x0
004E9829    6A 03                     push 0x3
004E982B    6A 04                     push 0x4
004E982D    50                        push eax
004E982E    FF15 08124000             call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>]    ; MSVBVM60.__vbaLateIdSt
004E9834    90                        nop
004E9835    90                        nop
004E9836    90                        nop
004E9837    90                        nop
004E9838    90                        nop
004E9839    61                        popad
004E983A    C745 FC 0A000000          mov dword ptr ss:[ebp-0x4],0xA
004E9841  ^ E9 D8E8F7FF               jmp Crackm3.0046811E

授人以鱼,不如授人以渔!还请教兄弟几个疑惑:

1、为什么选中00468117 为插入点?什么类型的地方作为插入点不影响程序原功能?
00468117这个点在“导入模板”选择“取消”时也会更改表格行数和列数,我想插入点在“打开”数据以后就更完美了!

2、重点:文件末尾写入的代码是怎么得来的?怎么知道是哪几个汇编变量?
比如这里
004E9808    6A 00                     push 0x0
004E980A    6A 03                     push 0x3
004E980C    6A 05                     push 0x5
004E980E    50                        push eax
004E980F    FF15 08124000             call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>]    ; MSVBVM60.__vbaLateIdSt

加那么多nop是起什么作用的?call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>] 又是起什么作用?

3、这个CALL的重定位又该如何做啊?

4、代码不多,还麻烦兄弟对整个代码作个注释,详细解说一下方法,也好知其所以然。指望把这当作pediy的入门教程了!小弟基本是个汇编盲,实在
2013-4-4 21:06
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
16
1 为什么选中00468117 为插入点主要是为了获得GRID这个表对象指针,其实也可以往下找插入点,这里执行完上面一个CALL以后得到的EAX就是 表指针, 其次 任何类型的地址都可以作为插入点,只要保存好寄存器的值,HOOK后再修改回来。

2 4一起回答了吧 nop是调试的时候为了保证有足够多的空间写我的代码,没实际意义。
为何是这些参数,我是自己写了一个GRID表格操作,看相同的部分是什么。

比如要设置行还有列,需要调用函数 m_grid.SetCols(110),m_grid.setrows(3000),m_grid就是1中获得的EAX, 其实VB和VC都是自己实现了一个类来操作GRID,参数都是自己比照VC和你的程序分析出来的。

004E9800    60                        pushad 保护现场寄存器
004E9801    6A 00                     push 0x0 固定参数null
004E9803    6A 6E                     push 0x6E 新的列的值 110
004E9805    90                        nop  nop可以无视,调试需要
004E9806    90                        nop
004E9807    90                        nop
004E9808    6A 00                     push 0x0 参数null
004E980A    6A 03                     push 0x3 设置行或者列的固定参数
004E980C    6A 05                     push 0x5 表示设置列 这里参数为5
004E980E    50                        push eax grid指针
004E980F    FF15 08124000             call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>]    ; MSVBVM60.__vbaLateIdSt
004E9815    90                        nop
004E9816    90                        nop
004E9817    90                        nop
004E9818    90                        nop
004E9819    90                        nop
004E981A    90                        nop
004E981B    90                        nop
004E981C    61                        popad  恢复现场
004E981D    60                        pushad 再保存现场
004E981E    6A 00                     push 0x0 固定参数0
004E9820    68 B80B0000               push 0xBB8 新的行的值 3000
004E9825    90                        nop
004E9826    90                        nop
004E9827    6A 00                     push 0x0  固定参数0
004E9829    6A 03                     push 0x3  表示设置行列的固定参数3
004E982B    6A 04                     push 0x4  表示设置行 参数为4
004E982D    50                        push eax 指针
004E982E    FF15 08124000             call dword ptr ds:[<&MSVBVM60.__vbaLateIdSt>]    ; MSVBVM60.__vbaLateIdSt
004E9834    90                        nop
004E9835    90                        nop
004E9836    90                        nop
004E9837    90                        nop
004E9838    90                        nop
004E9839    61                        popad 恢复现场
004E983A    C745 FC 0A000000          mov dword ptr ss:[ebp-0x4],0xA 执行之前HOOK地址的代码 00468117。
004E9841  ^ E9 D8E8F7FF               jmp Crackm3.0046811E跳回去

m_grid.SetCols(110) 其实最终调用到OCX文件里面的代码 类似于

调用函数 MSVBVM60.__vbaLateIdSt(表指针eax ,设置的是行 4 还是列 5,要设置的属性是行列属性 3,NULL,新的行或者列的大小,NULL);
主要是参数分析一下。其他的说说也难以说明白。自己慢慢理解吧
2013-4-4 21:55
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
非常感谢兄弟的耐心讲解!
虽然还是不太懂,但Huskar兄弟你已经做得让我十分感动了,只怪自己基础太差,只能以后慢慢学习体会了!祝Huskar兄弟好人有好报,万事顺意,财源滚滚……
2013-4-4 22:34
0
雪    币: 90
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
现在我又有了新问题,再次请教了,请高手多多指点!
上次是固定的行数插入,这次我想修改为根据导入数据行数动态设置GIRD1表的行数。我跟踪调试之后在00468541或者00468550中断时,[EBP-4C]堆栈地址指向的SS段[12EE94]即为导入的数据行数,再加上4即为需要的表格行数。于是我按IamHuskar兄弟给的代码修改如下:

00468541     /E9 BA120800   JMP Crackm1.004E9800
00468546     |90            NOP
00468547     |90            NOP

004E9800      60            PUSHAD
004E9801      6A 00         PUSH 0
004E9803      8B55 B4       MOV EDX,DWORD PTR SS:[EBP-4C]            ;  EDX=0x1A   //SS段[12EE94]
004E9806      83C2 04       ADD EDX,4
004E9809      52            PUSH EDX
004E980A      6A 00         PUSH 0
004E980C      6A 03         PUSH 3
004E980E      6A 04         PUSH 4
004E9810      8B85 00FFFFFF MOV EAX,DWORD PTR SS:[EBP-100]
004E9816      50            PUSH EAX
004E9817      FF15 08124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLateI>
004E981D      61            POPAD
004E981E      C745 FC 22000>MOV DWORD PTR SS:[EBP-4],22
004E9825    ^ E9 1EEDF7FF   JMP Crackm1.00468548

其中EDX能得到需要的正确行数,但运行结果却是后一次的只在前一次的表格行数上加了4行,是不是EDX变量压入的方式不对?
还请各位大哥帮忙指正修改一下,多谢了!
2013-4-10 17:51
0
游客
登录 | 注册 方可回帖
返回
//