反汇编包含大数据或压缩的文件[关闭]

2023-11-29

这是我试图弄清楚如何分解 exe 的第四天。

仍然没有运气,文件在运行后立即给出调试器错误。我正在使用 OllyDBG,看起来文件要么被压缩,要么包含大量数据。 我认为这只是为了调试保护,但我无法让它工作。

我正在尝试学习汇编,这是我在测试应用程序方面取得更好的“新水平”成就。 我想要更改的只是将 exe 文件内的一种文本更改为另一种文本。所以这是一个变量的变化。即使只是简单地改变里面的数字我也会感到满意。只是想知道如何。

该文件在打开后最初运行其他exe,但这不是我想要触摸或编辑的任何内容。

这是文件的打开方式:

00401000 >/$ 68 01504400    PUSH tryme.00445001
00401005  |. E8 01000000    CALL tryme.0040100B
0040100A  \. C3             RETN
0040100B   $ C3             RETN
0040100C     A9             DB A9
0040100D     FE             DB FE
0040100E     39             DB 39                                    ;  CHAR '9'
0040100F     B1             DB B1
00401010     30             DB 30                                    ;  CHAR '0'
00401011     D8             DB D8
00401012     BB             DB BB
00401013     A6             DB A6
00401014     45             DB 45                                    ;  CHAR 'E'
00401015     23             DB 23                                    ;  CHAR '#'
00401016     92             DB 92
00401017     AC             DB AC
00401018     3D             DB 3D                                    ;  CHAR '='
00401019     B3             DB B3
0040101A     9C             DB 9C
0040101B     8C             DB 8C
0040101C     90             NOP
0040101D     0E             DB 0E
0040101E     26             DB 26                                    ;  CHAR '&'
0040101F     3B             DB 3B                                    ;  CHAR ';'
00401020     D3             DB D3
00401021     48             DB 48                                    ;  CHAR 'H'
00401022     49             DB 49                                    ;  CHAR 'I'
00401023     70             DB 70                                    ;  CHAR 'p'
00401024     88             DB 88
00401025     07             DB 07
00401026     78             DB 78                                    ;  CHAR 'x'
00401027     36             DB 36                                    ;  CHAR '6'
00401028     7C             DB 7C                                    ;  CHAR '|'
00401029     88             DB 88

下面有很多数据库调用,我尝试每隔一个RETN就断点,但它们没有被调用。有人可以给我一个提示,如何处理这种exe文件吗?

感谢您的时间,


udis86 反汇编程序库有一个非常有用且方便的反汇编程序,称为udcli.

例如,我为理解您的代码所做的事情:

首先,将所有十六进制代码字节复制到 ASCII 文件中。我复制了你的 OllyDbg 输出,然后用 Vim 截断了除二进制代码之外的所有内容,得到了一个像这样的文本文件(比方说hexcode.txt):

68 01 50 44 00 E8 01 00 00 00 C3 C3 A9 FE 39 B1 30 D8 BB A6 45 23 92 AC 3D B3 9C 8C 90 0E 26 3B D3 48 49 70 88 07 78 36 7C 88

然后想知道这是 16 位、32 位还是 64 位 Intel 代码...通常您可以看到并感觉到代码是否看起来很奇怪,在这种情况下,它要么是错误的处理器、错误的处理器模式,要么是代码可能被加密或者它可能是数据而不是代码。

我们来试试是否是16位代码:

在 Linux 控制台中,$ cat hexcode.txt | udcli -x -16

0000000000000000 680150           push word 0x5001        
0000000000000003 44               inc sp                  
0000000000000004 00e8             add al, ch              
0000000000000006 0100             add [bx+si], ax         
0000000000000008 0000             add [bx+si], al         
000000000000000a c3               ret                     
000000000000000b c3               ret                     
000000000000000c a9fe39           test ax, 0x39fe         
000000000000000f b130             mov cl, 0x30            
0000000000000011 d8bba645         fdivr dword [bp+di+0x45a6]
0000000000000015 2392ac3d         and dx, [bp+si+0x3dac]  
0000000000000019 b39c             mov bl, 0x9c            
000000000000001b 8c900e26         mov [bx+si+0x260e], ss  
000000000000001f 3bd3             cmp dx, bx              
0000000000000021 48               dec ax                  
0000000000000022 49               dec cx                  
0000000000000023 7088             jo 0xffffffffffffffad   
0000000000000025 07               pop es                  
0000000000000026 7836             js 0x5e                 
0000000000000028 7c88             jl 0xffffffffffffffb2   

嗯。已经开始了inc sp,非常奇怪的指令。结论:不是16位代码。

也许是 32 位代码?

$ cat hexcode.txt | udcli -x -32

0000000000000000 6801504400       push dword 0x445001     
0000000000000005 e801000000       call dword 0xb          
000000000000000a c3               ret                     
000000000000000b c3               ret                     
000000000000000c a9fe39b130       test eax, 0x30b139fe    
0000000000000011 d8bba6452392     fdivr dword [ebx+0x922345a6]
0000000000000017 ac               lodsb                   
0000000000000018 3db39c8c90       cmp eax, 0x908c9cb3     
000000000000001d 0e               push cs                 
000000000000001e 263bd3           cmp edx, ebx            
0000000000000021 48               dec eax                 
0000000000000022 49               dec ecx                 
0000000000000023 7088             jo 0xffffffffffffffad   
0000000000000025 07               pop es                  
0000000000000026 7836             js 0x5e                 
0000000000000028 7c88             jl 0xffffffffffffffb2   

这看起来已经好多了。首先,您可以设置一个断点0x445001。就这样dword在 a 之前立即被推送call dword 0xb随后是一个ret,可能是ret after call 0xb实际上弹出该值0x445001从堆栈并跳转到cs:0x445001。另一方面,如果有意混淆代码,则可能是使用以下命令调用的函数call dword 0xb可以修改该值0x445001推入堆栈,以便ret after call dword 0xb不会跳到0x445001,但在其他地方。所以在堆栈地址处设置另一个断点0x445001被储存了。函数调用之前call dword 0xb [ss:esp]应该指向值0x445001,所以在那里设置断点。它也可以在函数内部设置,但在这种情况下,地址将是[ss:esp+4] ([ss:esp]保存返回地址)。所以我会尝试首先设置这两个断点,然后在call dword 0xb功能。

最后一个想法:如果这是 64 位代码怎么办?

$ cat hexcode.txt | udcli -x -64

0000000000000000 6801504400       push dword 0x445001     
0000000000000005 e801000000       call dword 0xb          
000000000000000a c3               ret                     
000000000000000b c3               ret                     
000000000000000c a9fe39b130       test eax, 0x30b139fe    
0000000000000011 d8bba6452392     fdivr dword [rbx-0x6ddcba5a]
0000000000000017 ac               lodsb                   
0000000000000018 3db39c8c90       cmp eax, 0x908c9cb3     
000000000000001d 0e               invalid                 
000000000000001e 263bd3           cmp edx, ebx            
0000000000000021 48497088         jo 0xffffffffffffffad   
0000000000000025 07               invalid                 
0000000000000026 7836             js 0x5e                 
0000000000000028 7c88             jl 0xffffffffffffffb2

开始方式与 32 位代码相同,但后来有一条无效指令,因此可能不是 64 位代码(除非代码挂钩无效操作码异常处理程序)int 6),或者从不执行该代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反汇编包含大数据或压缩的文件[关闭] 的相关文章

  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • DASM 汇编器中的 ASCII 到 C64 屏幕代码

    我正在通过 C64 模拟器学习 6502 micro 的汇编 目前正在尝试将字符串输出到屏幕 这是我的代码 processor 6502 org 1000 ldx 00 using x register as column counter
  • 为什么我可以使用 ret 退出 main?

    我即将弄清楚程序堆栈到底是如何设置的 我了解到用以下方式调用该函数 call pointer 实际上等同于 mov register pc programcounter add register 1 where 1 is one instr
  • 预取双类成员需要转换为 char*?

    我有一个正在使用的课程 mm prefetch 预先请求包含 double 类型的类成员的缓存行 class MyClass double getDouble return dbl other members double dbl othe
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 内联 asm 中不支持的指令“mov”将控制寄存器移动到 uint32_t

    我在 C 函数中使用汇编代码 但海湾合作委员会给出unsupported instruction mov 以下代码的错误 uint32 t faulting address asm volatile mov cr2 0 r faulting
  • 将两个 32 位整数向量相乘,生成 32 位结果元素向量

    将每个 32 位条目乘以 2 的最佳方法是什么 mm256i互相注册 mm256 mul epu32不是我正在寻找的 因为它产生 64 位输出 我想要每个 32 位输入元素都有一个 32 位结果 而且 我确信两个 32 位值的乘法不会溢出
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 将 Typescript 项目打包为可执行文件

    如何将 Typescript 项目打包成可执行文件 由于我找了一段时间没有找到 所以我使用了 now 节点来实现上述目的 我正在发布我所做的事情 希望有人会觉得它有用 将Typescript项目编译成node 根据this https me
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情

随机推荐

  • OpenGL 计算着色器 SSBO

    我想要一个在输出缓冲区中写入 1 的计算着色器 我编译着色器并将其附加到程序中 没有问题 然后我调用glDispatchCompute 函数 我等到计算着色器结束 但当我看到数组时 只有 0 谁能告诉我错误在哪里 这是我的计算着色器代码 v
  • 是否无法从 BroadcastReceiver 启动活动

    我想从扩展 BroadcastReceiver 的类中调用此活动 但它不起作用 Intent i new Intent DevicePolicyManager ACTION SET NEW PASSWORD context startAct
  • OmniFaces 条件注释未写入 HTML 输出

    我正在使用 OmniFaces conditionalComment 加载 IE 6 浏览器的 javascript 文件 在网站上 它说脚本应该包含在页面中 如下所示 这不是有效的 xml 因此不能在 JSF xhtml 文件中使
  • 正则表达式从数字到数字匹配?

    有没有办法从一个数字到另一个数字进行正则表达式 我有这个曲目列表 01 Intro 02 Waage 03 Hy nen feat Samra 04 Ich will es bar feat Haftbefehl 05 Am Boden b
  • 使用 Apache 的不同 Php-Fpm 容器

    我的生产服务器正在运行具有经典结构的 Docker Db Container Server Container 和 Php Fpm 容器 我想做的是拆分源代码 以便为项目的 3 个主要部分提供不同的容器 现在 它们以旧的方式工作 例如用于主
  • j_security_check 连接中断

    我正在使用tomcat的身份验证 当我将登录页面打开大约半小时然后尝试登录时 出现以下错误 URL http localhost pc j security check 页面内容 连接中断 加载页面时重置了与服务器的连接 协商连接时网络链接
  • Unity从服务器下载视频并保存

    我想从我的服务器获取视频并将其保存在我的资源中 以便稍后在游戏中查看 我知道使用 www 但我不明白如何从我的服务器下载视频并给出它的网址 下面是获取视频作为纹理的代码 var www new WWW http Sameer com Sam
  • 如何在 select2 选择上启用悬停事件

    我正在使用 select2 内置事件不支持所选项目上的悬停事件 因此我尝试在鼠标悬停在该项目上时触发悬停事件 多项选择 function tagFormat state return span class tagElement state
  • SoundCloud API URL 超时,然后在大约 50% 的曲目上返回错误 403 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我注意到这个问题过去已经被报道过很多次了 但似乎 SoundCloud 支持团队中没有人真正能够解决这个问题 从本周开始 SoundCloud API URL 就会超时 再次
  • Java可以过滤脏话吗?

    我想知道是否可以过滤脏话 过滤脏话的一个例子是创建帐户时的用户名 这样它就可以通知用户该词是不可接受的 是否可以 谢谢 不 不可能使用任何编程语言来过滤不良语言单词 您能做的最好的事情就是创建一个不良语言单词列表 然后对照该列表进行检查 只
  • 如果条件为假,则将单元格留空

    其他问题也涉及到这一点 并提供了对于非常大的数据集不可行的解决方案 我有一个跨 9 列的公式 如下所示 IF A1 A2 B2 zz 然后 我自动填充大约 350 万个单元格 复制 gt 粘贴值 然后我找到 zz 并将其替换为 空单元格 然
  • a=a++ 在 java 中如何工作[重复]

    这个问题在这里已经有答案了 最近我发现了这段Java代码 int a 0 for int i 0 i lt 100 i a a System out println a a 的打印值是 0 但是在 C 的情况下 a 的值是 100 我无法理
  • 使用 TitanDB 进行 UPSERT

    我正在迈出作为 TitanDB 用户的第一步 也就是说 我想知道如何进行更新插入 有条件地在一个顶点中插入一个顶点TitanTransaction 以 获取或创建 的风格 我在要创建 查找的顶点 属性上有一个唯一索引 下面是 Titan 1
  • Android:使图像不透明/透明

    问候 我想将图像放置在表面视图上 不过 我希望图像是透明的 这样您就可以看到图像以及不可见的表面视图 谁能建议我如何做到这一点 这就是我在绘制形状之前的做法 Bitmap buffer Bitmap createBitmap width h
  • Ruby / Rails 字符串数组插入 PostgreSQL

    目前 我有一个 Rails 项目 我正在尝试将活动记录直接传递到 postgres 以便使用字符串数组进行大批量创建 其中值尚不存在 以避免重复 我面临的问题是试图将 ruby 数组中包含 或 等的字符串字符转义为 postgres 可以接
  • git - 远程:致命:你在一个尚未诞生的分支上,使用 post-receive 钩子

    所以我试图将 github 分支同步到我网站的两个部分 理论上是我的 master 分支github应该与我的网站同步微小天气站 com并且 beta 分支应该与beta tinyweatherstation com 并且我已经成功地将 p
  • 如何在 Django Rest Framework 中过滤嵌套序列化器?

    在 Django Rest Framework 中 当序列化程序嵌套在另一个序列化程序中时 如何过滤它 我的过滤器强加在 DRF 视图集中 但是当您从另一个序列化器内部调用序列化器时 嵌套序列化器的视图集永远不会被调用 因此嵌套结果显示为未
  • Solr 太阳黑子minimum_match

    我刚开始使用 Solr Sunspot for Rails 我正在尝试使用
  • Magento - 将 CMS 块添加到一页

    我在 xml 布局文件中有以下代码
  • 反汇编包含大数据或压缩的文件[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 这是我试图弄清楚如何分解 exe 的第四天 仍然没有运