首页
社区
课程
招聘
[原创]逆向汇编代码重建如何处理原程序加载的dll
发表于: 2013-7-19 17:05 27171

[原创]逆向汇编代码重建如何处理原程序加载的dll

2013-7-19 17:05
27171

首先我也是初学者,如果我的方法中出现错误请大家指出,共同提高

进入正题,在逆向中往往需要把某个汇编函数进行代码重建,而如果这个汇编函数中有调用dll库中的函数就要对这个函数进行相应的处理,处理思路主要有2种,第一种是把这个动态库的函数也逆出来写在重建代码中直接调用,这种方式如果在想重建的汇编代码调用dll函数比较少的情况下还比较试用,如果调用了很多dll函数,而且你又没有相关的.h,.lib的情况下要把众多dll函数逆出来工作量挺大的,因此我在这介绍一下我的方法。

思路很简答,利用c,汇编的混合编程,在c代码中loadlibrary  getprcaddress,然后把获得的函数地址 保存在全局变量里, 在汇编中直接call这个全局变量 下面是示例代码:

c:
#include "stdio.h"
#include "WINDOWS.H"

extern "c" float asm_main()
typedef float (*MYFUN)(float);

extern "c"
{
     MYFUN cbrtf;
     float  arg;
}

void main()
{
     float a=1.11;
     float b;
     arg=1.11   //传入汇编的参数 也用全局变量来传了 为了方便
     HINSTANCE LibHandle;
     LibHandle = LoadLibrary("libmmd.dll");
     cbrtf=(MYFUN)GetProcAddress(LibHandle,"cbrtf");
     b=asm_main()
     a=cbrtf(a);
     printf("a:%f,b:%f",a,b);
}

asm:头部我就省略了 直接写asm_main

EXTERN cbrtf :PTR DWORD
EXTERN arg:DWORD
asm_main proc
            push  arg
            call dword ptr ds:[cbrtf]
            add esp,4
            ret
asm_main endp

上面就是这些代码输出a与b的值一样  用这样的形式 不论汇编里有多少你从来没见过的dll函数,只要你有dll文件,只要在c里动态加载一下就可以在汇编里用了 如果大家还有更好的方法 可以一起分享 共同学习


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (23)
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
2
貌似不错 mark下
2013-7-19 17:09
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark是必须的
2013-7-19 17:12
0
雪    币: 244
活跃值: (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个。。有点像HOOK吧
2013-7-19 21:18
0
雪    币: 9720
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这就是直接加载别人的DLL用啊,跟破解逆向关系不是很大
2013-7-19 23:14
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
建议以后 加精华 或者优秀的时候 给操作者 也显示出来
这样好区分
2013-7-20 07:44
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
没感觉好强大。。。
2013-7-20 11:12
0
雪    币: 1122
活跃值: (1308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不明白, c 跟 汇编是同一个工程?
是的话,貌似没啥意义吧
不是的话, 地址不用重定位?
2013-7-21 06:48
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
方法不错,记录以后学习。
2013-7-21 11:31
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
你这个文章居然能拿优秀?
不知道优秀在哪里?
1.文章标题含糊不清,都看不明白具体要讲什么,还是文章太专业了,本身我就不明白。
2.原程序加载的dll,还需要咋处理?还需要写文章专门来讨论这个问题?你直接loadlibrary and call不就行了?
3.你这还用得着混合编程?各是各的,不都 一样么,汇编中也可以Loadlibrary and Getprocaddress and call
4.你这东西,没有任何减轻工作量的能力,反而增加了工作量,与理解难度。

我觉得,你的中心应该放在:如果在没有头文件以及lib的情况 下,由 一个dll去生成这两个文件,才方便调用 。
这个是可以实现的,并且我已经 实现 ,原理很简单的。。。
2013-7-21 16:12
0
雪    币: 2859
活跃值: (2663)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
+1 123456
2013-7-21 17:40
0
雪    币: 29
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
如何用一个dll生成  相关的 lib  和  inc啊  求指导啊 我研究了好久没弄成功,这个方法 是不想改变逆向过来的汇编, 因为我需要重建的代码 掉了太多的dll函数 改动汇编会很麻烦 所以才用的混合编程的方法
2013-7-21 22:24
0
雪    币: 67
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看起来不错!
2013-7-21 22:51
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我正在想这个问题呢,其实很简单,多谢分享
2013-7-22 09:36
0
雪    币: 1234
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

由一个dll文件去生成lib和.h文件,有很多工具,但是都不能用。求楼主指点。
2013-7-24 10:58
0
雪    币: 29
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
这个我也没研究明白  所以才想出这个方案
2013-7-24 12:01
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
联系我,我给你工具,但要求你安装vs2008sp1.
2013-7-26 09:08
0
雪    币: 1234
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
非常感谢大牛指点啊,我qq邮箱通过悄悄话发给你啦
2013-7-26 09:16
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
马克 下咯
2013-7-26 17:51
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
这个貌似以汇编代码为主。C代码为辅。
C代码估计只是起到找地址的作用。

之前弄反了,感觉画蛇添足。:)
2014-7-15 11:21
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark
2014-11-11 11:12
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
mark mark
2014-11-11 19:45
0
雪    币: 94
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
顶一个 挺好的 受益匪浅
2015-1-6 11:50
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
这样也可以?赚分这么容易?
2015-7-2 11:43
0
游客
登录 | 注册 方可回帖
返回
//